Some checks are pending
ci/woodpecker/push/build Pipeline is pending approval
88 lines
1.5 KiB
Go
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
|
|
}
|