dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 025a169a07d2834f7ae7f3fd677b241071aa23ef
parent 8cd56e173ba3df56ec01b5684e33f8cf206aa220
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 28 Dec 2023 16:46:02 -0500

experimental no refresh menu

Diffstat:
Acmd/dkf/migrations/160.sql | 4++++
Mpkg/database/tableUsers.go | 2++
Mpkg/web/handlers/api/v1/chat.go | 45++++++++++++++++++++++++++++++++++++++-------
Mpkg/web/handlers/data.go | 1+
Mpkg/web/handlers/settings.go | 3+++
Mpkg/web/middlewares/middlewares.go | 2++
Mpkg/web/public/views/pages/settings/chat.gohtml | 7+++++++
7 files changed, 57 insertions(+), 7 deletions(-)

diff --git a/cmd/dkf/migrations/160.sql b/cmd/dkf/migrations/160.sql @@ -0,0 +1,4 @@ +-- +migrate Up +ALTER TABLE users ADD COLUMN use_stream_menu TINYINT(1) NOT NULL DEFAULT 0; + +-- +migrate Down diff --git a/pkg/database/tableUsers.go b/pkg/database/tableUsers.go @@ -125,6 +125,7 @@ type User struct { XmrBalance Piconero AFK bool UseStream bool + UseStreamMenu bool SyntaxHighlightCode string ConfirmExternalLinks bool ChessSoundsEnabled bool @@ -625,6 +626,7 @@ func (d *DkfDB) createUser(usernameStr, password, repassword, gpgPublicKey strin newUser.CollectMetadata = false newUser.RegistrationDuration = registrationDuration newUser.UseStream = true + newUser.UseStreamMenu = false newUser.CodeBlockHeight = 300 newUser.HellbanOpacity = 30 newUser.SignupMetadata = signupInfoEnc diff --git a/pkg/web/handlers/api/v1/chat.go b/pkg/web/handlers/api/v1/chat.go @@ -418,15 +418,46 @@ func ChatStreamMenuHandler(c echo.Context) error { return c.NoContent(http.StatusForbidden) } - data := GetChatMenuData(c, room) + if !authUser.UseStreamMenu { + data := GetChatMenuData(c, room) + s := utils.TernaryOrZero(!data.PreventRefresh, `<meta http-equiv="refresh" content="5" />`) + s += GenerateStyle(authUser, ChatMessagesData{}) + s += RenderRightColumn(authUser, data) + return c.HTML(http.StatusOK, s) + } - s := "" - if !data.PreventRefresh { - s += `<meta http-equiv="refresh" content="5" />` + // Setup headers for http request + hutils.SetStreamingHeaders(c) + quit := hutils.CloseSignalChan(c) + send := func(s string) { _, _ = c.Response().Write([]byte(s)) } + prevHash := "" + menuID := 0 + var once utils.Once +Loop: + for { + select { + case <-once.After(0 * time.Millisecond): + case <-time.After(5 * time.Second): + case <-quit: + break Loop + } + data := GetChatMenuData(c, room) + s := GenerateStyle(authUser, ChatMessagesData{}) + s += fmt.Sprintf(`<div id="menu_%d">`, menuID+1) + s += RenderRightColumn(authUser, data) + s += `</div>` + newHash := utils.MD5([]byte(s)) + if newHash != prevHash { + s += fmt.Sprintf(`<style>#menu_%d{display:none}</style>`, menuID) + send(s) + c.Response().Flush() + prevHash = newHash + menuID++ + } } - s += GenerateStyle(authUser, ChatMessagesData{}) - s += RenderRightColumn(authUser, data) - return c.HTML(http.StatusOK, s) + send(`<meta http-equiv="refresh" content="5" />`) + c.Response().Flush() + return nil } func ChatStreamMessagesRefreshHandler(c echo.Context) error { diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go @@ -677,6 +677,7 @@ type settingsChatData struct { DisplayKickButton bool DisplayHellbanButton bool UseStream bool + UseStreamMenu bool ManualMultiline bool ConfirmExternalLinks bool ChessSoundsEnabled bool diff --git a/pkg/web/handlers/settings.go b/pkg/web/handlers/settings.go @@ -65,6 +65,7 @@ func SettingsChatHandler(c echo.Context) error { data.NotifyChessGames = authUser.NotifyChessGames data.NotifyChessMove = authUser.NotifyChessMove data.UseStream = authUser.UseStream + data.UseStreamMenu = authUser.UseStreamMenu data.ConfirmExternalLinks = authUser.ConfirmExternalLinks data.ChessSoundsEnabled = authUser.ChessSoundsEnabled data.PokerSoundsEnabled = authUser.PokerSoundsEnabled @@ -114,6 +115,7 @@ func changeSettingsForm(c echo.Context, data settingsChatData) error { data.NotifyChessGames = utils.DoParseBool(c.Request().PostFormValue("notify_chess_games")) data.NotifyChessMove = utils.DoParseBool(c.Request().PostFormValue("notify_chess_move")) data.UseStream = utils.DoParseBool(c.Request().PostFormValue("use_stream")) + data.UseStreamMenu = utils.DoParseBool(c.Request().PostFormValue("use_stream_menu")) data.ConfirmExternalLinks = utils.DoParseBool(c.Request().PostFormValue("confirm_external_links")) data.ChessSoundsEnabled = utils.DoParseBool(c.Request().PostFormValue("chess_sounds_enabled")) data.PokerSoundsEnabled = utils.DoParseBool(c.Request().PostFormValue("poker_sounds_enabled")) @@ -161,6 +163,7 @@ func changeSettingsForm(c echo.Context, data settingsChatData) error { authUser.NotifyChessGames = data.NotifyChessGames authUser.NotifyChessMove = data.NotifyChessMove authUser.UseStream = data.UseStream + authUser.UseStreamMenu = data.UseStreamMenu authUser.ConfirmExternalLinks = data.ConfirmExternalLinks authUser.ChessSoundsEnabled = data.ChessSoundsEnabled authUser.PokerSoundsEnabled = data.PokerSoundsEnabled diff --git a/pkg/web/middlewares/middlewares.go b/pkg/web/middlewares/middlewares.go @@ -37,6 +37,7 @@ var GzipMiddleware = middleware.GzipWithConfig( c.Path() == "/poker/:roomID/logs" || c.Path() == "/poker/:roomID/bet" || c.Path() == "/api/v1/chat/messages/:roomName/stream" || + c.Path() == "/api/v1/chat/messages/:roomName/stream/menu" || c.Path() == "/uploads/:filename" || c.Path() == "/" { return true @@ -301,6 +302,7 @@ func IsAuthMiddleware(next echo.HandlerFunc) echo.HandlerFunc { !strings.Contains(c.Path(), "/chess/:key/stats") && !strings.Contains(c.Path(), "/api/v1/chat/messages") && !strings.Contains(c.Path(), "/api/v1/chat/messages/:roomName/stream") && + !strings.Contains(c.Path(), "/api/v1/chat/messages/:roomName/stream/menu") && !strings.Contains(c.Path(), "/api/v1/chat/top-bar") && !strings.Contains(c.Path(), "/api/v1/chat/controls") && !strings.Contains(c.Path(), "/poker/:roomID/stream") && diff --git a/pkg/web/public/views/pages/settings/chat.gohtml b/pkg/web/public/views/pages/settings/chat.gohtml @@ -205,6 +205,13 @@ </div> <div class="form-check form-check-1"> <div class="checkbox-wrapper form-check-input"> + <input class="my-cbx" type="checkbox" name="use_stream_menu" id="use_stream_menu" value="1"{{ if .Data.UseStreamMenu }} checked{{ end }} /> + <label for="use_stream_menu" class="toggle"><span></span></label> + </div> + <label class="form-check-label" for="use_stream_menu">{{ t "Use chat menu stream version" . }}</label> + </div> + <div class="form-check form-check-1"> + <div class="checkbox-wrapper form-check-input"> <input class="my-cbx" type="checkbox" name="confirm_external_links" id="confirm_external_links" value="1"{{ if .AuthUser.ConfirmExternalLinks }} checked{{ end }} /> <label for="confirm_external_links" class="toggle"><span></span></label> </div>