dkforest

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

commit d6fa7637836a8927681ea218455006b0508eb06f
parent ca277866b24e4f9b133c9a8372d7c34cef9d4454
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon, 29 May 2023 06:14:03 -0700

Add fullscreen chat code page

Diffstat:
Mgo.mod | 4+++-
Mgo.sum | 2++
Mpkg/database/tableChatMessages.go | 13+++++++++++++
Mpkg/web/handlers/data.go | 4++++
Mpkg/web/handlers/handlers.go | 36++++++++++++++++++++++++++++++++++++
Apkg/web/public/views/pages/chat-code.gohtml | 22++++++++++++++++++++++
Mpkg/web/web.go | 1+
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;">&#8689;</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" }}&nbsp;{{ 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))