dkforest

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

commit d4f4b9fc521f37265c8cd7e6851aa6a61b0566ba
parent 813869e56b9095dd521f3286b98f00e5ea81d08f
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Wed,  7 Jun 2023 06:26:50 -0700

have /code work for moderator channel and PMs

Diffstat:
Mpkg/database/tableChatMessages.go | 6++++--
Apkg/web/handlers/api/v1/codeModalInterceptor.go | 42++++++++++++++++++++++++++++++++++++++++++
Mpkg/web/handlers/api/v1/slashInterceptor.go | 16+++++++++++++++-
Mpkg/web/handlers/api/v1/topBarHandler.go | 23+----------------------
Mpkg/web/handlers/handlers.go | 16++++++++++++----
5 files changed, 74 insertions(+), 29 deletions(-)

diff --git a/pkg/database/tableChatMessages.go b/pkg/database/tableChatMessages.go @@ -620,8 +620,10 @@ const ( ) type ChatMessageType struct { - Typ PubSubMessageType - Msg ChatMessage + Typ PubSubMessageType + Msg ChatMessage + IsMod bool + ToUserUsername *Username } var MsgPubSub = pubsub.NewPubSub[ChatMessageType]() diff --git a/pkg/web/handlers/api/v1/codeModalInterceptor.go b/pkg/web/handlers/api/v1/codeModalInterceptor.go @@ -0,0 +1,42 @@ +package v1 + +import ( + "dkforest/pkg/database" + "dkforest/pkg/utils" +) + +type CodeModalInterceptor struct{} + +func (i CodeModalInterceptor) InterceptMsg(cmd *Command) { + sender := cmd.c.Request().PostFormValue("sender") + lang := cmd.c.Request().PostFormValue("lang") + isMod := utils.DoParseBool(cmd.c.Request().PostFormValue("isMod")) + pm := cmd.c.Request().PostFormValue("pm") + + if !cmd.authUser.CanUseMultiline || sender != "codeModal" { + return + } + + database.MsgPubSub.Pub("code_hide_"+cmd.authUser.ID.String()+"_"+cmd.room.ID.String(), database.ChatMessageType{}) + + if cmd.origMessage == "" { + cmd.err = ErrRedirect + return + } + + cmd.modMsg = isMod + if pm != "" { + toUser, err := cmd.db.GetUserByUsername(database.Username(pm)) + if err != nil { + cmd.err = ErrRedirect + return + } + cmd.toUser = &toUser + } + + if !utils.InArr(lang, []string{"go", "c", "cpp", "py", "js", "php", "css", "sql", "rs", "c#", "rb"}) { + lang = "" + } + cmd.origMessage = "\n```" + lang + "\n" + cmd.origMessage + "\n```\n" + cmd.message = "\n```" + lang + "\n" + cmd.message + "\n```\n" +} diff --git a/pkg/web/handlers/api/v1/slashInterceptor.go b/pkg/web/handlers/api/v1/slashInterceptor.go @@ -160,6 +160,8 @@ func handleModeratorGroupCmd(c *Command) (handled bool) { c.modMsg = true if handleMeCmd(c) { return true + } else if handleCodeCmd(c) { + return true } return true } @@ -966,6 +968,10 @@ func handlePMCmd(c *Command) (handled bool) { return handled } + if handleCodeCmd(c) { + return true + } + return true } else if strings.HasPrefix(c.message, "/pm ") { c.err = errors.New("invalid /pm command") @@ -1766,7 +1772,15 @@ func handleCodeCmd(c *Command) (handled bool) { c.err = errors.New("multiline is disabled for your account") return true } - database.MsgPubSub.Pub("code_show_"+c.authUser.ID.String()+"_"+c.room.ID.String(), database.ChatMessageType{}) + payload := database.ChatMessageType{} + if c.modMsg { + payload.IsMod = true + } + if c.toUser != nil { + toUserUsername := c.toUser.Username + payload.ToUserUsername = &toUserUsername + } + database.MsgPubSub.Pub("code_show_"+c.authUser.ID.String()+"_"+c.room.ID.String(), payload) return true } return diff --git a/pkg/web/handlers/api/v1/topBarHandler.go b/pkg/web/handlers/api/v1/topBarHandler.go @@ -269,28 +269,6 @@ func ChatTopBarHandler(c echo.Context) error { origMessage := strings.TrimSpace(c.Request().PostFormValue("message")) - if authUser.CanUseMultiline && c.Request().PostFormValue("sender") == "codeModal" { - database.MsgPubSub.Pub("code_hide_"+authUser.ID.String()+"_"+room.ID.String(), database.ChatMessageType{}) - lang := c.Request().PostFormValue("lang") - if !utils.InArr(lang, []string{"go", "c", "cpp", "py", "js", "php", "css", "sql", "rs", "c#", "rb"}) { - lang = "" - } - newOrigMessage := "\n```" + lang + "\n" + origMessage + "\n```\n" - cmd := NewCommand(c, newOrigMessage, room, roomKey) - cmd.redirectQP = redirectQP - - if origMessage == "" { - return c.Redirect(http.StatusFound, cmd.redirectURL()) - } - - MsgInterceptor{}.InterceptMsg(cmd) - data.Message = cmd.dataMessage - if cmd.err != nil { - return handleCmdError(cmd.err, c, data, cmd.redirectURL(), cmd.origMessage) - } - return c.Redirect(http.StatusFound, cmd.redirectURL()) - } - cmd := NewCommand(c, origMessage, room, roomKey) cmd.redirectQP = redirectQP @@ -307,6 +285,7 @@ func ChatTopBarHandler(c echo.Context) error { BangInterceptor{}, UploadInterceptor{}, SlashInterceptor{}, + CodeModalInterceptor{}, MsgInterceptor{}, } for _, interceptor := range interceptors { diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -5253,7 +5253,7 @@ Loop: } if topic == selfCodeShowTopic { - send(getCodeModalHTML(codeModalIdx, roomName, csrf)) + send(getCodeModalHTML(codeModalIdx, roomName, csrf, msgTyp)) c.Response().Flush() continue } @@ -5361,10 +5361,17 @@ Loop: return nil } -func getCodeModalHTML(codeModalIdx int, roomName, csrf string) string { - return `<div class="code-modal code-modal-` + strconv.Itoa(codeModalIdx) + `"> +func getCodeModalHTML(codeModalIdx int, roomName, csrf string, msgTyp database.ChatMessageType) string { + out := `<div class="code-modal code-modal-` + strconv.Itoa(codeModalIdx) + `"> <form method="post" target="iframe1" action="/api/v1/chat/top-bar/` + roomName + `"> - <input type="hidden" name="csrf" value="` + csrf + `" /> + <input type="hidden" name="csrf" value="` + csrf + `" />` + if msgTyp.IsMod { + out += `<input type="hidden" name="isMod" value="1" />` + } + if msgTyp.ToUserUsername != nil { + out += `<input type="hidden" name="pm" value="` + msgTyp.ToUserUsername.String() + `" />` + } + out += ` <input type="hidden" name="sender" value="codeModal" /> <div class=wrapper> <textarea name="message" placeholder="Paste your code here..."></textarea> @@ -5388,6 +5395,7 @@ func getCodeModalHTML(codeModalIdx int, roomName, csrf string) string { </div> </form> </div>` + return out } func ChatCodeHandler(c echo.Context) error {