owncast-webhook/internal/web/controller/chat/controller.go
Simon Vieille 68c05816dd
Some checks are pending
ci/woodpecker/push/build Pipeline is pending approval
feat(chat): add effect and improve faker
2025-09-07 20:14:05 +02:00

88 lines
1.5 KiB
Go

package chat
import (
"bytes"
"encoding/json"
"github.com/gorilla/websocket"
"github.com/labstack/echo/v4"
"gitnet.fr/deblan/owncast-webhook/assets"
"gitnet.fr/deblan/owncast-webhook/internal/store"
. "maragu.dev/gomponents"
. "maragu.dev/gomponents/components"
. "maragu.dev/gomponents/html"
)
var (
upgrader = websocket.Upgrader{}
)
type Controller struct {
}
func New(e *echo.Echo) *Controller {
c := Controller{}
e.GET("/chat/messages", c.Messages)
e.GET("/ws/chat/messages", c.WebsocketMessages)
return &c
}
func (ctrl *Controller) WebsocketMessages(c echo.Context) error {
ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil)
if err != nil {
return err
}
defer ws.Close()
storage := store.GetMessageStore()
for {
messages := storage.All()
if len(messages) == 0 {
continue
}
storage.Clear()
var items []string
for _, message := range messages {
var buff bytes.Buffer
msg := CreateMessageView(message)
msg.Render(&buff)
items = append(items, buff.String())
}
j, _ := json.Marshal(items)
ws.WriteMessage(websocket.TextMessage, j)
}
return nil
}
func (ctrl *Controller) Messages(c echo.Context) error {
page := HTML5(HTML5Props{
Title: "Chat",
Language: "fr",
Head: []Node{
Group(assets.EntrypointCss("main")),
Link(Rel("icon"), Type("image/x-icon"), Href(assets.Asset("dist/img/favicon.png"))),
},
Body: []Node{
ID("chat"),
Div(Class("messages")),
Group(assets.EntrypointJs("main")),
},
})
page.Render(c.Response().Writer)
return nil
}