commit d6fa7637836a8927681ea218455006b0508eb06f
parent ca277866b24e4f9b133c9a8372d7c34cef9d4454
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Mon, 29 May 2023 06:14:03 -0700
Add fullscreen chat code page
Diffstat:
7 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/go.mod b/go.mod
@@ -5,6 +5,7 @@ go 1.18
require (
filippo.io/age v1.0.0
github.com/ProtonMail/go-crypto v0.0.0-20230127150802-22e9f3c8043c
+ github.com/PuerkitoBio/goquery v1.5.1
github.com/alecthomas/chroma v0.9.2
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc
@@ -31,6 +32,7 @@ require (
github.com/t-tiger/gorm-bulk-insert v1.3.0
github.com/ulule/limiter v2.2.2+incompatible
github.com/urfave/cli/v2 v2.3.0
+ github.com/valyala/quicktemplate v1.7.0
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
golang.org/x/image v0.0.0-20211028202545-6944b10bf410
golang.org/x/net v0.8.0
@@ -41,6 +43,7 @@ require (
require (
github.com/alecthomas/repr v0.0.0-20200325044227-4184120f674c // indirect
+ github.com/andybalholm/cascadia v1.1.0 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/cloudflare/circl v1.1.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect
@@ -59,7 +62,6 @@ require (
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.1.0 // indirect
- github.com/valyala/quicktemplate v1.7.0 // indirect
golang.org/x/sys v0.6.0 // indirect
gopkg.in/gorp.v1 v1.7.2 // indirect
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
diff --git a/go.sum b/go.sum
@@ -9,6 +9,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/ProtonMail/go-crypto v0.0.0-20230127150802-22e9f3c8043c h1:3SOlz3Ldp5+/KwuXDbuoj1nWPI6MzqBfCz/KvlPS4ko=
github.com/ProtonMail/go-crypto v0.0.0-20230127150802-22e9f3c8043c/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
+github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
@@ -31,6 +32,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
diff --git a/pkg/database/tableChatMessages.go b/pkg/database/tableChatMessages.go
@@ -11,6 +11,8 @@ import (
"fmt"
"io"
"math"
+ "regexp"
+ "strconv"
"strings"
"time"
@@ -591,6 +593,17 @@ func (d *DkfDB) CreateOrEditMessage(
}
}
editMsg.DoSave(d)
+
+ i := 0
+ rgx := regexp.MustCompile(`</pre>`)
+ editMsg.Message = rgx.ReplaceAllStringFunc(editMsg.Message, func(s string) string {
+ i++
+ return `</pre><a href="/chat-code/` + editMsg.UUID + `/` + strconv.Itoa(i-1) + `" rel="noopener noreferrer" target="_blank" style="position: absolute; margin-top: -20px; right: 0;">⇱</a>`
+ })
+ if i > 0 {
+ editMsg.DoSave(d)
+ }
+
MsgPubSub.Pub("room_"+roomID.String(), ChatMessageType{Typ: typ, Msg: *editMsg})
return editMsg.ID, nil
}
diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go
@@ -389,6 +389,10 @@ type chatData struct {
PowEnabled bool
}
+type chatCodepData struct {
+ Code string
+}
+
type chatHelpData struct {
}
diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go
@@ -17,6 +17,7 @@ import (
"encoding/pem"
"errors"
"fmt"
+ "github.com/PuerkitoBio/goquery"
"github.com/jinzhu/gorm"
"github.com/notnil/chess"
_ "golang.org/x/image/bmp"
@@ -5255,3 +5256,38 @@ Loop:
c.Response().Flush()
return nil
}
+
+func ChatCodeHandler(c echo.Context) error {
+ messageUUID := c.Param("messageUUID")
+ idx, err := strconv.Atoi(c.Param("idx"))
+ if err != nil {
+ return c.Redirect(http.StatusFound, "/")
+ }
+
+ authUser := c.Get("authUser").(*database.User)
+ db := c.Get("database").(*database.DkfDB)
+ msg, err := db.GetChatMessageByUUID(messageUUID)
+ if err != nil {
+ return c.Redirect(http.StatusFound, "/")
+ }
+
+ if !verifyMsgAuth(db, authUser, &msg) {
+ return c.Redirect(http.StatusFound, "/")
+ }
+
+ doc, err := goquery.NewDocumentFromReader(strings.NewReader(msg.Message))
+ if err != nil {
+ return c.Redirect(http.StatusFound, "/")
+ }
+ n := doc.Find("pre").Eq(idx)
+ if n == nil {
+ return c.Redirect(http.StatusFound, "/")
+ }
+
+ var data chatCodepData
+ data.Code, err = n.Html()
+ if err != nil {
+ return c.Redirect(http.StatusFound, "/")
+ }
+ return c.Render(http.StatusOK, "chat-code", data)
+}
diff --git a/pkg/web/public/views/pages/chat-code.gohtml b/pkg/web/public/views/pages/chat-code.gohtml
@@ -0,0 +1,21 @@
+{{ define "title" }}dkf - chat code{{ end }}
+
+{{ define "navbar" }} {{ end }}}
+
+{{ define "content" }}
+
+<style>
+ pre {
+ border: 1px solid #2b442b;
+ padding: 2px;
+ margin: 2px 0;
+ overflow: auto;
+ font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
+ }
+</style>
+
+<div class="container-fluid">
+ <pre style="color:#f8f8f2;background-color:#272822">{{ .Data.Code | safe }}</pre>
+</div>
+
+{{ end }}
+\ No newline at end of file
diff --git a/pkg/web/web.go b/pkg/web/web.go
@@ -215,6 +215,7 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te
authGroup.GET("/chat", handlers.ChatHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 4))
authGroup.POST("/chat", handlers.ChatHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 2))
authGroup.GET("/chat/help", handlers.ChatHelpHandler)
+ authGroup.GET("/chat-code/:messageUUID/:idx", handlers.ChatCodeHandler)
authGroup.GET("/chat/create-room", handlers.ChatCreateRoomHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 2))
authGroup.POST("/chat/create-room", handlers.ChatCreateRoomHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 2))
authGroup.GET("/chat/:roomName/stream", handlers.ChatStreamHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 4))