audon/webhooks.go

109 wiersze
3.2 KiB
Go

2022-12-05 01:11:44 +00:00
package main
import (
2023-05-26 14:32:52 +00:00
"context"
2023-01-20 15:39:51 +00:00
"fmt"
2023-01-23 12:10:21 +00:00
"log"
2022-12-05 01:11:44 +00:00
"net/http"
2023-01-20 15:39:51 +00:00
"strings"
2023-01-23 12:10:21 +00:00
"time"
2022-12-05 01:11:44 +00:00
"github.com/labstack/echo/v4"
"github.com/livekit/protocol/auth"
"github.com/livekit/protocol/webhook"
2023-01-20 15:39:51 +00:00
mastodon "github.com/mattn/go-mastodon"
"github.com/nicksnyder/go-i18n/v2/i18n"
2022-12-05 01:11:44 +00:00
)
func livekitWebhookHandler(c echo.Context) error {
authProvider := auth.NewSimpleKeyProvider(mainConfig.Livekit.APIKey, mainConfig.Livekit.APISecret)
event, err := webhook.ReceiveWebhookEvent(c.Request(), authProvider)
if err == webhook.ErrNoAuthHeader {
return echo.NewHTTPError(http.StatusForbidden)
}
if event.GetEvent() == webhook.EventRoomFinished {
2023-01-25 06:37:31 +00:00
lkRoom := event.GetRoom()
room, err := findRoomByID(c.Request().Context(), lkRoom.GetName())
2023-01-20 15:39:51 +00:00
if err != nil {
c.Logger().Error(err)
return echo.NewHTTPError(http.StatusNotFound)
}
if room.EndedAt.IsZero() {
if err := endRoom(c.Request().Context(), room); err != nil {
c.Logger().Error(err)
return echo.NewHTTPError(http.StatusInternalServerError)
2022-12-05 01:11:44 +00:00
}
}
2023-01-23 12:10:21 +00:00
} else if event.GetEvent() == webhook.EventParticipantLeft {
audonID := event.GetParticipant().GetIdentity()
user, err := findUserByID(c.Request().Context(), audonID)
if user == nil || err != nil {
c.Logger().Error(err)
return echo.NewHTTPError(http.StatusNotFound)
}
still, err := user.InLivekit(c.Request().Context())
if !still && err == nil {
2023-01-26 22:31:53 +00:00
data := userSessionCache.Get(audonID)
2023-01-23 12:10:21 +00:00
if data == nil {
return echo.NewHTTPError(http.StatusGone)
}
2023-05-26 14:32:52 +00:00
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
nextUser, err := findUserByID(ctx, audonID)
if err != nil {
log.Println(err)
2023-01-23 12:10:21 +00:00
}
2023-05-26 14:32:52 +00:00
nextUser.ClearUserAvatar(ctx)
2023-01-23 12:10:21 +00:00
}
2023-01-20 15:39:51 +00:00
} else if event.GetEvent() == webhook.EventRoomStarted {
// Have the bot advertise the room
room, err := findRoomByID(c.Request().Context(), event.GetRoom().GetName())
if err != nil {
c.Logger().Error(err)
return echo.NewHTTPError(http.StatusNotFound)
}
if err == nil && mainConfig.Bot.Enable && room.Advertise != "" && room.Restriction == EVERYONE {
botClient := mastodon.NewClient(&mastodon.Config{
Server: mainConfig.Bot.Server.String(),
ClientID: mainConfig.Bot.ClientID,
ClientSecret: mainConfig.Bot.ClientSecret,
AccessToken: mainConfig.Bot.AccessToken,
})
botClient.UserAgent = USER_AGENT
localizer := i18n.NewLocalizer(localeBundle, room.Advertise)
header := localizer.MustLocalize(&i18n.LocalizeConfig{
DefaultMessage: &i18n.Message{
ID: "Advertise",
Other: "@{{.Host}} is streaming now!",
},
TemplateData: map[string]string{
"Host": room.Host.Webfinger,
},
})
messages := []string{
header,
2023-01-26 22:43:04 +00:00
fmt.Sprintf(":udon: %s\n🎙 https://%s/u/@%s", room.Title, mainConfig.LocalDomain, room.Host.Webfinger),
2023-01-20 15:39:51 +00:00
}
if room.Description != "" {
messages = append(messages, room.Description)
}
messages = append(messages, "#Audon")
message := strings.Join(messages, "\n\n")
2022-12-05 01:11:44 +00:00
2023-01-20 15:39:51 +00:00
if _, err := botClient.PostStatus(c.Request().Context(), &mastodon.Toot{
Status: message,
Language: room.Advertise,
Visibility: "public",
}); err != nil {
c.Logger().Error(err)
}
}
2022-12-05 01:11:44 +00:00
}
2023-01-20 15:39:51 +00:00
return c.NoContent(http.StatusOK)
2022-12-05 01:11:44 +00:00
}