diff --git a/Makefile b/Makefile index 2e231f5..d36296c 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,7 @@ CGO_ENABLED = 0 GO_ARCH_AMD = amd64 GO_OS_LINUX = linux -EXECUTABLE_SERVER = budget-go -EXECUTABLE_CMD = budget-go-client +EXECUTABLE_SERVER = owncast-webhook CC = go build CFLAGS = -trimpath @@ -11,9 +10,7 @@ LDFLAGS = -d -s -w -extldflags=-static GCFLAGS = all= ASMFLAGS = all= - all: build -#docker .PHONY: rice: @@ -23,16 +20,12 @@ rice: front: NODE_ENV=prod ./node_modules/.bin/webpack -.PHONY: -tpl: - TEMPL_EXPERIMENT=rawgo templ generate - lint: npm run lint || true npm run format .PHONY: -build: tpl front rice +build: front rice CGO_ENABLED=$(CGO_ENABLED) \ GOARCH=$(GO_ARCH_AMD) \ GOOS=$(GO_OS_LINUX) \ diff --git a/backend/controller/chat/controller.go b/backend/controller/chat/controller.go index 63a4a2b..a04e5e8 100644 --- a/backend/controller/chat/controller.go +++ b/backend/controller/chat/controller.go @@ -1,10 +1,14 @@ package chat import ( + "fmt" + "github.com/labstack/echo/v4" + "gitnet.fr/deblan/owncast-webhook/backend/store" "gitnet.fr/deblan/owncast-webhook/backend/view" - tpl "gitnet.fr/deblan/owncast-webhook/backend/view/template/chat" - "gitnet.fr/deblan/owncast-webhook/backend/webhook" + . "maragu.dev/gomponents" + . "maragu.dev/gomponents/components" + . "maragu.dev/gomponents/html" ) type Controller struct { @@ -18,8 +22,57 @@ func New(e *echo.Echo) *Controller { return &c } -var messages []webhook.Message - func (ctrl *Controller) Messages(c echo.Context) error { - return view.Render(c, 200, tpl.Messages("Chat - Messages", messages)) + page := HTML5(HTML5Props{ + Title: "Chat", + Language: "fr", + Head: []Node{ + Group(view.EntrypointCss("main")), + Link(Rel("icon"), Type("image/x-icon"), Href(view.Asset("static/img/favicon.png"))), + }, + Body: []Node{ + ID("chat"), + Div( + Class("messages"), + Map(store.GetMessageStore().All(), func(message store.MessageInterface) Node { + var containerStyle Node + var userStyle Node + + if message.Origin() == 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, + )) + } + + return Div( + Class("message"), + ID(message.ID()), + containerStyle, + Div( + Class("message-user"), + userStyle, + Text(message.Author()), + ), + Div( + Class("message-body"), + Raw(message.Content()), + ), + ) + }), + ), + Group(view.EntrypointJs("main")), + }, + }) + + page.Render(c.Response().Writer) + + return nil } diff --git a/backend/controller/webhook/owncast/chat_message.go b/backend/controller/webhook/owncast/chat_message.go index e4c662e..cb9b7c1 100644 --- a/backend/controller/webhook/owncast/chat_message.go +++ b/backend/controller/webhook/owncast/chat_message.go @@ -1,10 +1,10 @@ package owncast import ( + "net/http" + "github.com/labstack/echo/v4" "gitnet.fr/deblan/owncast-webhook/backend/store" - "gitnet.fr/deblan/owncast-webhook/backend/view" - tpl "gitnet.fr/deblan/owncast-webhook/backend/view/template/chat" "gitnet.fr/deblan/owncast-webhook/backend/webhook" ) @@ -19,24 +19,16 @@ func New(e *echo.Echo) *Controller { return &c } -var messages []webhook.Message - -func (ctrl *Controller) Messages(c echo.Context) error { - return view.Render(c, 200, tpl.Messages("Chat - Messages", messages)) -} - func (ctrl *Controller) ChatMessage(c echo.Context) error { value := new(webhook.WebhookNewMessage) if err := c.Bind(value); err != nil { - return c.JSON(400, nil) + return c.JSON(http.StatusBadRequest, map[string]string{"status": "ko"}) } store.GetMessageStore().Add(store.OwncastMessage{ WebhookMessage: value.EventData, }) - messages = append(messages, value.EventData) - - return c.JSON(200, nil) + return c.JSON(http.StatusCreated, map[string]string{"status": "ok"}) } diff --git a/backend/router/router.go b/backend/router/router.go index 5862ebe..5a57fdf 100644 --- a/backend/router/router.go +++ b/backend/router/router.go @@ -3,8 +3,10 @@ package router import ( "github.com/labstack/echo/v4" "gitnet.fr/deblan/owncast-webhook/backend/controller/chat" + "gitnet.fr/deblan/owncast-webhook/backend/controller/webhook/owncast" ) func RegisterControllers(e *echo.Echo) { chat.New(e) + owncast.New(e) } diff --git a/backend/store/message.go b/backend/store/message.go index 6b39a1e..385a8c1 100644 --- a/backend/store/message.go +++ b/backend/store/message.go @@ -1,7 +1,5 @@ package store -import "gitnet.fr/deblan/owncast-webhook/backend/webhook" - type MessageOrigin int var messageStore *MessageStore @@ -32,28 +30,9 @@ func GetMessageStore() *MessageStore { } type MessageInterface interface { - IsVisible() bool - GetOrigin() MessageOrigin - GetAuthor() string - GetContent() string -} - -type OwncastMessage struct { - WebhookMessage webhook.Message -} - -func (o *OwncastMessage) IsVisible() bool { - return o.WebhookMessage.Visible -} - -func (o *OwncastMessage) GetOrigin() MessageOrigin { - return MessageOriginTwitch -} - -func (o *OwncastMessage) GetAuthor() string { - return o.WebhookMessage.User.DisplayName -} - -func (o *OwncastMessage) GetContent() string { - return o.WebhookMessage.GetBody() + ID() string + Visible() bool + Origin() MessageOrigin + Author() string + Content() string } diff --git a/backend/store/owncast_message.go b/backend/store/owncast_message.go new file mode 100644 index 0000000..70a0ce2 --- /dev/null +++ b/backend/store/owncast_message.go @@ -0,0 +1,39 @@ +package store + +import ( + "fmt" + "strings" + + "gitnet.fr/deblan/owncast-webhook/backend/webhook" + "gitnet.fr/deblan/owncast-webhook/config" +) + +type OwncastMessage struct { + WebhookMessage webhook.Message +} + +func (o OwncastMessage) ID() string { + return o.WebhookMessage.Id +} + +func (o OwncastMessage) Visible() bool { + return o.WebhookMessage.Visible +} + +func (o OwncastMessage) Origin() MessageOrigin { + return MessageOriginOwncast +} + +func (o OwncastMessage) Author() string { + return o.WebhookMessage.User.DisplayName +} + +func (o OwncastMessage) Content() string { + content := strings.ReplaceAll( + o.WebhookMessage.Body, + ` -} - -templ Head(title string) { - - - - @Fav(view.Asset("static/img/favicon.png")) - { title } - @templ.Raw(view.EntrypointCss("main")) - -} - -templ JS() { - @templ.Raw(view.EntrypointJs("main")) -} diff --git a/backend/view/template/chat/page.templ b/backend/view/template/chat/page.templ deleted file mode 100644 index 4022c86..0000000 --- a/backend/view/template/chat/page.templ +++ /dev/null @@ -1,48 +0,0 @@ -package chat - -import ( - "gitnet.fr/deblan/owncast-webhook/backend/view/template" - "gitnet.fr/deblan/owncast-webhook/backend/webhook" - "fmt" -) - -func getMessageUserStyle(message webhook.Message) templ.Attributes { - return templ.Attributes{ - "style": fmt.Sprintf("color: var(--theme-color-users-%d)", message.User.DisplayColor), - } -} - -func getMessageStyle(message webhook.Message) templ.Attributes { - return templ.Attributes{ - "style": fmt.Sprintf("border-color: var(--theme-color-users-%d)", message.User.DisplayColor), - } -} - -templ Message(message webhook.Message) { -
-
- { message.User.DisplayName } $ -
-
- @templ.Raw(message.GetBody()) -
-
-} - -templ Messages(title string, messages []webhook.Message) { - - - @template.Head(title) - -
- for _, message := range messages { - if message.Visible { - @Message(message) - } - } -
- - @template.JS() - - -} diff --git a/backend/view/view.go b/backend/view/view.go index 81c5421..15e5e8b 100644 --- a/backend/view/view.go +++ b/backend/view/view.go @@ -3,11 +3,11 @@ package view import ( "embed" "encoding/json" - "fmt" - "strings" "github.com/a-h/templ" "github.com/labstack/echo/v4" + . "maragu.dev/gomponents" + . "maragu.dev/gomponents/html" ) var ( @@ -64,24 +64,30 @@ func entrypointFiles(app, category string) []string { return files } -func EntrypointJs(app string) string { +func EntrypointJs(app string) []Node { files := entrypointFiles(app, "js") - results := []string{} + var results []Node for _, file := range files { - results = append(results, fmt.Sprintf(``, file)) + results = append( + results, + Script(Src(file)), + ) } - return strings.Join(results, "") + return results } -func EntrypointCss(app string) string { +func EntrypointCss(app string) []Node { files := entrypointFiles(app, "css") - results := []string{} + var results []Node for _, file := range files { - results = append(results, fmt.Sprintf(``, file)) + results = append( + results, + Link(Rel("stylesheet"), Href(file)), + ) } - return strings.Join(results, "") + return results } diff --git a/backend/webhook/message.go b/backend/webhook/message.go index 8bad58c..0ef0f9a 100644 --- a/backend/webhook/message.go +++ b/backend/webhook/message.go @@ -1,7 +1,6 @@ package webhook import ( - "strings" "time" ) @@ -26,12 +25,6 @@ type Message struct { User MessageUser `json:"user"` } -func (m *Message) GetBody() string { - m.Body = strings.ReplaceAll(m.Body, `