commit 025a169a07d2834f7ae7f3fd677b241071aa23ef
parent 8cd56e173ba3df56ec01b5684e33f8cf206aa220
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 28 Dec 2023 16:46:02 -0500
experimental no refresh menu
Diffstat:
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>