commit 13b33999ba436959cb731dbc27362404e903d009
parent 095716576f83f1d7b453c17af3ac950b50563c52
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Mon, 22 May 2023 00:47:10 -0700
improve streaming chat
Diffstat:
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)