owncast-webhook/internal/web/controller/chat/controller.go
2025-08-29 12:46:37 +02:00

86 lines
1.8 KiB
Go

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("static/img/owncast.png")), Class("message-origin"))
case store.MessageOriginTwitch:
originIcon = Img(Src(assets.Asset("static/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("static/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
}