dkforest

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

commit 13b33999ba436959cb731dbc27362404e903d009
parent 095716576f83f1d7b453c17af3ac950b50563c52
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon, 22 May 2023 00:47:10 -0700

improve streaming chat

Diffstat:
Mpkg/web/handlers/chat.go | 3++-
Mpkg/web/handlers/data.go | 1+
Mpkg/web/handlers/handlers.go | 25++++++-------------------
Mpkg/web/middlewares/middlewares.go | 3++-
Mpkg/web/public/views/pages/chat.gohtml | 4++--
Mpkg/web/web.go | 1+
6 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/pkg/web/handlers/chat.go b/pkg/web/handlers/chat.go @@ -11,7 +11,7 @@ import ( "time" ) -func chatHandler(c echo.Context, redRoom bool) error { +func chatHandler(c echo.Context, redRoom, stream bool) error { const chatPasswordTmplName = "standalone.chat-password" authUser := c.Get("authUser").(*database.User) db := c.Get("database").(*database.DkfDB) @@ -80,6 +80,7 @@ func chatHandler(c echo.Context, redRoom bool) error { data.IsSubscribed = db.IsUserSubscribedToRoom(authUser.ID, room.ID) data.IsOfficialRoom = room.IsOfficialRoom() + data.IsStream = stream return c.Render(http.StatusOK, "chat", data) } diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go @@ -380,6 +380,7 @@ type chatData struct { ErrCaptcha string TutoSecs int64 TutoFrames []string + IsStream bool } type chatHelpData struct { diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -2336,11 +2336,11 @@ func RoomsHandler(c echo.Context) error { } func RedRoomHandler(c echo.Context) error { - return chatHandler(c, true) + return chatHandler(c, true, false) } func ChatHandler(c echo.Context) error { - return chatHandler(c, false) + return chatHandler(c, false, false) } func getTutorialStepDuration() int64 { @@ -4876,6 +4876,10 @@ Loop: } func ChatStreamHandler(c echo.Context) error { + return chatHandler(c, false, true) +} + +func ChatStreamMessagesHandler(c echo.Context) error { db := c.Get("database").(*database.DkfDB) authUser := c.Get("authUser").(*database.User) @@ -4913,23 +4917,6 @@ func ChatStreamHandler(c echo.Context) error { c.Response().Header().Set("Transfer-Encoding", "chunked") c.Response().Header().Set("Connection", "keep-alive") - chatQueryParams := "" - _, _ = c.Response().Write([]byte(fmt.Sprintf(` -<style> -#chat-top-bar { - border: 0; - height: 57px; - width: 800px; -} -.container-fluid { - width: 800px; -} -</style> -<div class="container-fluid"> - <iframe id="chat-top-bar" name="iframe1" src="/api/v1/chat/top-bar/` + room.Name + chatQueryParams + `" sandbox="allow-forms allow-scripts allow-same-origin allow-top-navigation-by-user-activation"></iframe> -</div> -`))) - _, _ = c.Response().Write([]byte(cssReset)) data := v1.ChatMessagesData{} data.RoomName = room.Name diff --git a/pkg/web/middlewares/middlewares.go b/pkg/web/middlewares/middlewares.go @@ -31,7 +31,7 @@ var GzipMiddleware = middleware.GzipWithConfig( c.Path() == "/vip/downloads/:filename" || c.Path() == "/vip/challenges/re-1/:filename" || c.Path() == "/chess/:key" || - c.Path() == "/chat/:roomName/stream" || + c.Path() == "/api/v1/chat/messages/:roomName/stream" || c.Path() == "/uploads/:filename" || c.Path() == "/" { return true @@ -273,6 +273,7 @@ func IsAuthMiddleware(next echo.HandlerFunc) echo.HandlerFunc { // Prevent clickjacking by setting the header on every logged in page if !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/top-bar") { c.Response().Header().Set("X-Frame-Options", "DENY") } diff --git a/pkg/web/public/views/pages/chat.gohtml b/pkg/web/public/views/pages/chat.gohtml @@ -147,7 +147,7 @@ <div> {{ if .AuthUser.ChatBarAtBottom }} <div> - <iframe id="chat-content" name="iframe2" src="/api/v1/chat/messages/{{ .Data.Room.Name }}{{ .Data.ChatQueryParams }}"></iframe> + <iframe id="chat-content" name="iframe2" src="/api/v1/chat/messages/{{ .Data.Room.Name }}{{ if .Data.IsStream }}/stream{{ end }}{{ .Data.ChatQueryParams }}"></iframe> </div> {{ end }} <div> @@ -221,7 +221,7 @@ allow-popups allow-popups-to-escape-sandbox" */}} - <iframe id="chat-content" name="iframe2" src="/api/v1/chat/messages/{{ .Data.Room.Name }}{{ .Data.ChatQueryParams }}"></iframe> + <iframe id="chat-content" name="iframe2" src="/api/v1/chat/messages/{{ .Data.Room.Name }}{{ if .Data.IsStream }}/stream{{ end }}{{ .Data.ChatQueryParams }}"></iframe> </div> {{ end }} <div> diff --git a/pkg/web/web.go b/pkg/web/web.go @@ -143,6 +143,7 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te authGroup.GET("/api/v1/chat/top-bar/:roomName", v1.ChatTopBarHandler) authGroup.POST("/api/v1/chat/top-bar/:roomName", v1.ChatTopBarHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 3)) authGroup.GET("/api/v1/chat/messages/:roomName", v1.ChatMessagesHandler) + authGroup.GET("/api/v1/chat/messages/:roomName/stream", handlers.ChatStreamMessagesHandler) authGroup.POST("/api/v1/notifications/delete/:notificationID", v1.DeleteNotificationHandler) authGroup.POST("/api/v1/session-notifications/delete/:sessionNotificationID", v1.DeleteSessionNotificationHandler) authGroup.POST("/api/v1/inbox/delete/:messageID", v1.ChatInboxDeleteMessageHandler)