commit 6acb4c819a1db4c179e78e332c8075c9d3b81a6d
parent e1762779dd795f8363ee876fd876f6bc4c78a34b
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Wed, 11 Jan 2023 10:21:20 -0800
move code
Diffstat:
2 files changed, 167 insertions(+), 154 deletions(-)
diff --git a/pkg/web/handlers/chat.go b/pkg/web/handlers/chat.go
@@ -0,0 +1,167 @@
+package handlers
+
+import (
+ "dkforest/pkg/captcha"
+ "dkforest/pkg/config"
+ "dkforest/pkg/database"
+ "dkforest/pkg/utils"
+ hutils "dkforest/pkg/web/handlers/utils"
+ "github.com/labstack/echo"
+ "github.com/sirupsen/logrus"
+ "net/http"
+ "time"
+)
+
+func chatHandler(c echo.Context, redRoom bool) error {
+ authUser := c.Get("authUser").(*database.User)
+ var data chatData
+ data.RedRoom = redRoom
+ preventRefresh := utils.DoParseBool(c.QueryParam("r"))
+ data.TogglePms = utils.DoParseInt64(c.QueryParam("pmonly"))
+ data.ToggleMentions = utils.DoParseBool(c.QueryParam("mentionsOnly"))
+
+ v := c.QueryParams()
+ if preventRefresh {
+ v.Set("r", "1")
+ }
+ if data.TogglePms != 0 {
+ v.Set("pmonly", utils.FormatInt64(data.TogglePms))
+ }
+ if data.ToggleMentions {
+ v.Set("mentionsOnly", "1")
+ }
+ if _, found := c.QueryParams()["ml"]; found {
+ v.Set("ml", "1")
+ data.Multiline = true
+ }
+ data.ChatQueryParams = "?" + v.Encode()
+
+ if authUser == nil {
+ if config.SignupEnabled.IsFalse() {
+ return c.Render(http.StatusOK, "flash", FlashResponse{Message: "New signup are temporarily disabled", Redirect: "/", Type: "alert-danger"})
+ }
+
+ data.CaptchaID, data.CaptchaImg = captcha.New()
+ }
+
+ roomName := c.Param("roomName")
+ if roomName == "" {
+ roomName = "general"
+ }
+ room, err := database.GetChatRoomByName(roomName)
+ if err != nil {
+ return c.Redirect(http.StatusFound, "/")
+ }
+
+ if authUser != nil {
+ data.DisplayTutorial = (room.ID < 5 || (room.IsListed && !room.IsProtected())) && !authUser.TutorialCompleted()
+
+ if data.DisplayTutorial {
+ data.TutoSecs = getTutorialStepDuration()
+ data.TutoFrames = generateCssFrames(data.TutoSecs, nil, true)
+ if c.Request().Method == http.MethodGet {
+ authUser.ChatTutorialTime = time.Now()
+ authUser.DoSave()
+ }
+ }
+ }
+
+ if c.Request().Method == http.MethodPost {
+
+ btnSubmit := c.Request().PostFormValue("btn_submit")
+ if btnSubmit == "logout" {
+ hutils.DeleteRoomCookie(c, int64(room.ID))
+ return c.Redirect(http.StatusFound, "/chat")
+ }
+
+ formName := c.Request().PostFormValue("formName")
+ switch formName {
+ case "toggle-hb":
+ if authUser.CanSeeHB() {
+ authUser.DisplayHellbanned = !authUser.DisplayHellbanned
+ authUser.DoSave()
+ }
+ return c.Redirect(http.StatusFound, c.Request().Referer())
+
+ case "toggle-m":
+ if authUser.IsModerator() {
+ authUser.DisplayModerators = !authUser.DisplayModerators
+ authUser.DoSave()
+ }
+ return c.Redirect(http.StatusFound, c.Request().Referer())
+
+ case "toggle-ignored":
+ authUser.DisplayIgnored = !authUser.DisplayIgnored
+ authUser.DoSave()
+ return c.Redirect(http.StatusFound, c.Request().Referer())
+
+ case "afk":
+ authUser.AFK = !authUser.AFK
+ authUser.DoSave()
+ return c.Redirect(http.StatusFound, c.Request().Referer())
+
+ case "update-read-marker":
+ database.UpdateChatReadMarker(authUser.ID, room.ID)
+ return c.Redirect(http.StatusFound, c.Request().Referer())
+
+ case "tutorialP1", "tutorialP2", "tutorialP3":
+ if authUser.ChatTutorial < 3 && time.Since(authUser.ChatTutorialTime) >= time.Duration(data.TutoSecs)*time.Second {
+ authUser.ChatTutorial++
+ authUser.DoSave()
+ }
+ return c.Redirect(http.StatusFound, c.Request().Referer())
+
+ case "chat-password":
+ data.RoomPassword = c.Request().PostFormValue("password")
+ if authUser == nil {
+ data.GuestUsername = c.Request().PostFormValue("guest_username")
+ captchaID := c.Request().PostFormValue("captcha_id")
+ captchaInput := c.Request().PostFormValue("captcha")
+ if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil {
+ data.ErrCaptcha = err.Error()
+ return c.Render(http.StatusOK, "chat-password", data)
+ }
+
+ if err := database.CanUseUsername(data.GuestUsername, false); err != nil {
+ data.ErrGuestUsername = err.Error()
+ return c.Render(http.StatusOK, "chat-password", data)
+ }
+ }
+ key := utils.Sha256([]byte(config.RoomPasswordSalt + data.RoomPassword))[:32]
+ hashedPassword := utils.Sha512([]byte(config.RoomPasswordSalt + data.RoomPassword))
+ if hashedPassword != room.Password {
+ data.Error = "Invalid room password"
+ return c.Render(http.StatusOK, "chat-password", data)
+ }
+
+ if authUser == nil {
+ password := utils.GenerateToken32()
+ newUser, errs := database.CreateGuestUser(data.GuestUsername, password)
+ if errs.HasError() {
+ data.ErrGuestUsername = errs.Username
+ return c.Render(http.StatusOK, "chat-password", data)
+ }
+
+ session, err := database.CreateSession(newUser.ID, c.Request().UserAgent())
+ if err != nil {
+ logrus.Error("Failed to create session : ", err)
+ }
+ c.SetCookie(createSessionCookie(session.Token))
+ }
+
+ hutils.CreateRoomCookie(c, int64(room.ID), hashedPassword, key)
+ return c.Redirect(http.StatusFound, "/chat/"+room.Name)
+ }
+
+ return c.Redirect(http.StatusFound, c.Request().Referer())
+ }
+
+ if !room.HasAccess(c) {
+ return c.Render(http.StatusOK, "chat-password", data)
+ }
+
+ data.IsSubscribed = database.IsUserSubscribedToRoom(authUser.ID, room.ID)
+ data.Room = room
+ data.IsOfficialRoom = room.IsOfficialRoom()
+ return c.Render(http.StatusOK, "chat", data)
+}
diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go
@@ -2241,160 +2241,6 @@ func getTutorialStepDuration() int64 {
return secs
}
-func chatHandler(c echo.Context, redRoom bool) error {
- authUser := c.Get("authUser").(*database.User)
- var data chatData
- data.RedRoom = redRoom
- preventRefresh := utils.DoParseBool(c.QueryParam("r"))
- data.TogglePms = utils.DoParseInt64(c.QueryParam("pmonly"))
- data.ToggleMentions = utils.DoParseBool(c.QueryParam("mentionsOnly"))
-
- v := c.QueryParams()
- if preventRefresh {
- v.Set("r", "1")
- }
- if data.TogglePms != 0 {
- v.Set("pmonly", utils.FormatInt64(data.TogglePms))
- }
- if data.ToggleMentions {
- v.Set("mentionsOnly", "1")
- }
- if _, found := c.QueryParams()["ml"]; found {
- v.Set("ml", "1")
- data.Multiline = true
- }
- data.ChatQueryParams = "?" + v.Encode()
-
- if authUser == nil {
- if config.SignupEnabled.IsFalse() {
- return c.Render(http.StatusOK, "flash", FlashResponse{Message: "New signup are temporarily disabled", Redirect: "/", Type: "alert-danger"})
- }
-
- data.CaptchaID, data.CaptchaImg = captcha.New()
- }
-
- roomName := c.Param("roomName")
- if roomName == "" {
- roomName = "general"
- }
- room, err := database.GetChatRoomByName(roomName)
- if err != nil {
- return c.Redirect(http.StatusFound, "/")
- }
-
- if authUser != nil {
- data.DisplayTutorial = (room.ID < 5 || (room.IsListed && !room.IsProtected())) && !authUser.TutorialCompleted()
-
- if data.DisplayTutorial {
- data.TutoSecs = getTutorialStepDuration()
- data.TutoFrames = generateCssFrames(data.TutoSecs, nil, true)
- if c.Request().Method == http.MethodGet {
- authUser.ChatTutorialTime = time.Now()
- authUser.DoSave()
- }
- }
- }
-
- if c.Request().Method == http.MethodPost {
-
- btnSubmit := c.Request().PostFormValue("btn_submit")
- if btnSubmit == "logout" {
- hutils.DeleteRoomCookie(c, int64(room.ID))
- return c.Redirect(http.StatusFound, "/chat")
- }
-
- formName := c.Request().PostFormValue("formName")
- switch formName {
- case "toggle-hb":
- if authUser.CanSeeHB() {
- authUser.DisplayHellbanned = !authUser.DisplayHellbanned
- authUser.DoSave()
- }
- return c.Redirect(http.StatusFound, c.Request().Referer())
-
- case "toggle-m":
- if authUser.IsModerator() {
- authUser.DisplayModerators = !authUser.DisplayModerators
- authUser.DoSave()
- }
- return c.Redirect(http.StatusFound, c.Request().Referer())
-
- case "toggle-ignored":
- authUser.DisplayIgnored = !authUser.DisplayIgnored
- authUser.DoSave()
- return c.Redirect(http.StatusFound, c.Request().Referer())
-
- case "afk":
- authUser.AFK = !authUser.AFK
- authUser.DoSave()
- return c.Redirect(http.StatusFound, c.Request().Referer())
-
- case "update-read-marker":
- database.UpdateChatReadMarker(authUser.ID, room.ID)
- return c.Redirect(http.StatusFound, c.Request().Referer())
-
- case "tutorialP1", "tutorialP2", "tutorialP3":
- if authUser.ChatTutorial < 3 && time.Since(authUser.ChatTutorialTime) >= time.Duration(data.TutoSecs)*time.Second {
- authUser.ChatTutorial++
- authUser.DoSave()
- }
- return c.Redirect(http.StatusFound, c.Request().Referer())
-
- case "chat-password":
- data.RoomPassword = c.Request().PostFormValue("password")
- if authUser == nil {
- data.GuestUsername = c.Request().PostFormValue("guest_username")
- captchaID := c.Request().PostFormValue("captcha_id")
- captchaInput := c.Request().PostFormValue("captcha")
- if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil {
- data.ErrCaptcha = err.Error()
- return c.Render(http.StatusOK, "chat-password", data)
- }
-
- if err := database.CanUseUsername(data.GuestUsername, false); err != nil {
- data.ErrGuestUsername = err.Error()
- return c.Render(http.StatusOK, "chat-password", data)
- }
- }
- key := utils.Sha256([]byte(config.RoomPasswordSalt + data.RoomPassword))[:32]
- hashedPassword := utils.Sha512([]byte(config.RoomPasswordSalt + data.RoomPassword))
- if hashedPassword != room.Password {
- data.Error = "Invalid room password"
- return c.Render(http.StatusOK, "chat-password", data)
- }
-
- if authUser == nil {
- password := utils.GenerateToken32()
- newUser, errs := database.CreateGuestUser(data.GuestUsername, password)
- if errs.HasError() {
- data.ErrGuestUsername = errs.Username
- return c.Render(http.StatusOK, "chat-password", data)
- }
-
- session, err := database.CreateSession(newUser.ID, c.Request().UserAgent())
- if err != nil {
- logrus.Error("Failed to create session : ", err)
- }
- c.SetCookie(createSessionCookie(session.Token))
- }
-
- hutils.CreateRoomCookie(c, int64(room.ID), hashedPassword, key)
- return c.Redirect(http.StatusFound, "/chat/"+room.Name)
- }
-
- return c.Redirect(http.StatusFound, c.Request().Referer())
- }
-
- if !room.HasAccess(c) {
- return c.Render(http.StatusOK, "chat-password", data)
- }
-
- data.IsSubscribed = database.IsUserSubscribedToRoom(authUser.ID, room.ID)
- data.Room = room
- data.IsOfficialRoom = room.IsOfficialRoom()
- return c.Render(http.StatusOK, "chat", data)
-}
-
func ChatHelpHandler(c echo.Context) error {
var data chatHelpData
return c.Render(http.StatusOK, "chat-help", data)