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:
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 {