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 }