package chat import ( "fmt" "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" ) type Controller struct { } func New(e *echo.Echo) *Controller { c := Controller{} e.GET("/chat/messages", c.Messages) return &c } func (ctrl *Controller) Messages(c echo.Context) error { createMessage := func(message store.MessageInterface) Node { var containerStyle Node var userStyle Node var originIcon Node switch message.Origin() { case store.MessageOriginOwncast: msg := message.(store.OwncastMessage) containerStyle = StyleAttr(fmt.Sprintf( "border-color: var(--theme-color-users-%d)", msg.WebhookMessage.User.DisplayColor, )) userStyle = StyleAttr(fmt.Sprintf( "color: var(--theme-color-users-%d)", msg.WebhookMessage.User.DisplayColor, )) originIcon = Img(Src(assets.Asset("dist/img/owncast.png")), Class("message-origin")) case store.MessageOriginTwitch: originIcon = Img(Src(assets.Asset("dist/img/twitch.png")), Class("message-origin")) } return Div( Class("message"), ID(message.ID()), containerStyle, Div( Class("message-user"), userStyle, Group([]Node{originIcon, Text(message.Author())}), ), Div( Class("message-body"), Raw(message.Content()), ), ) } 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"), Map(store.GetMessageStore().All(), createMessage), ), Group(assets.EntrypointJs("main")), }, }) page.Render(c.Response().Writer) return nil }