diff --git a/.env.production.sample b/.env.production.sample index af59748..6560ff0 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -28,3 +28,10 @@ LIVEKIT_API_SECRET=secret LIVEKIT_HOST=livekit.example.com # This value will be returned by Audon backend to browsers. Set the same domain as LIVEKIT_HOST if you are not sure. LIVEKIT_LOCAL_DOMAIN=livekit.example.com + +### Bot Settings ### +# Leave the following fields empty to disable the notification bot. +BOT_SERVER= +BOT_CLIENT_ID= +BOT_CLIENT_SECRET= +BOT_ACCESS_TOKEN= diff --git a/audon-fe/src/locales/en.yaml b/audon-fe/src/locales/en.yaml index d710876..3faeba8 100644 --- a/audon-fe/src/locales/en.yaml +++ b/audon-fe/src/locales/en.yaml @@ -29,6 +29,7 @@ form: cohosts: "Cohosts" cohostCanAlwaysJoin: "Cohosts can join regardless of this setting." schedule: "Schedule at" + advertise: "Allow the bot ({bot}) to advertise your room" relationships: everyone: "Everyone" following: "Followed accounts only" diff --git a/audon-fe/src/locales/fr.yaml b/audon-fe/src/locales/fr.yaml index 8ad2f60..e3029e9 100644 --- a/audon-fe/src/locales/fr.yaml +++ b/audon-fe/src/locales/fr.yaml @@ -29,6 +29,7 @@ form: cohosts: "Cohôtes" cohostCanAlwaysJoin: "Cohôtes peuvent s'y joindre, quel que soit le paramètre de confidentialité." schedule: "Programmée à" + advertise: "Autorisez le robot ({bot}) à faire de la publicité pour votre salle" relationships: everyone: "Tout le monde" following: "Vos abonnements" diff --git a/audon-fe/src/locales/ja.yaml b/audon-fe/src/locales/ja.yaml index ad7ed78..ab0997a 100644 --- a/audon-fe/src/locales/ja.yaml +++ b/audon-fe/src/locales/ja.yaml @@ -28,6 +28,7 @@ form: cohosts: "共同ホスト" cohostCanAlwaysJoin: "共同ホストは制限に関わらず入室できます。" schedule: "開始予約" + advertise: "Bot({bot})による部屋の宣伝を許可する" relationships: everyone: "制限なし" following: "あなたのフォロー限定" diff --git a/audon-fe/src/views/CreateView.vue b/audon-fe/src/views/CreateView.vue index 7b6c09c..60d4231 100644 --- a/audon-fe/src/views/CreateView.vue +++ b/audon-fe/src/views/CreateView.vue @@ -65,6 +65,7 @@ export default { }, isSubmissionLoading: false, createdRoomID: "", + advertise: true, }; }, validations() { @@ -121,6 +122,9 @@ export default { this.isCandiadateLoading = true; this.cohostSearch(val); }, + relationship(to) { + this.advertise = to === "everyone"; + } }, methods: { async search(val) { @@ -172,6 +176,10 @@ export default { remote_url: u.url, })), restriction: this.relationship, + advertise: + this.advertise && this.relationship === "everyone" + ? this.$i18n.locale + : "", }; this.isSubmissionLoading = false; try { @@ -364,10 +372,31 @@ export default { disabled :messages="[$t('comingFuture')]" > + + + - + {{ $t("create") }} diff --git a/audon-fe/src/views/RoomView.vue b/audon-fe/src/views/RoomView.vue index 4ca93b7..ef8bac6 100644 --- a/audon-fe/src/views/RoomView.vue +++ b/audon-fe/src/views/RoomView.vue @@ -84,15 +84,15 @@ export default { sounds: { boop: new Howl({ src: [boopSound], - volume: 0.4, + volume: 0.7, }), message: new Howl({ src: [messageSound], - volume: 0.15, + volume: 0.3, }), request: new Howl({ src: [requestSound], - volume: 0.4, + volume: 0.7, }) }, }; diff --git a/config.go b/config.go index ca66b3c..e99e065 100644 --- a/config.go +++ b/config.go @@ -14,6 +14,7 @@ type ( MongoURL *url.URL Database *DBConfig Redis *RedisConfig + Bot *BotConfig } AppConfigBase struct { @@ -41,6 +42,14 @@ type ( User string `validate:"printascii"` Password string `validate:"printascii"` } + + BotConfig struct { + Enable bool + Server *url.URL + ClientID string + ClientSecret string + AccessToken string + } ) const ( @@ -124,5 +133,22 @@ func loadConfig(envname string) (*AppConfig, error) { lkConf.URL = lkURL appConf.Livekit = lkConf + // Setup Notification Bot config + botHost := os.Getenv("BOT_SERVER") + botConf := &BotConfig{ + Enable: botHost != "", + ClientID: os.Getenv("BOT_CLIENT_ID"), + ClientSecret: os.Getenv("BOT_CLIENT_SECRET"), + AccessToken: os.Getenv("BOT_ACCESS_TOKEN"), + } + if botConf.Enable { + botConf.Server = &url.URL{ + Host: botHost, + Scheme: "https", + Path: "/", + } + } + appConf.Bot = botConf + return &appConf, nil } diff --git a/go.mod b/go.mod index d519c89..9af748a 100644 --- a/go.mod +++ b/go.mod @@ -13,10 +13,13 @@ require ( github.com/livekit/protocol v1.2.3 github.com/livekit/server-sdk-go v1.0.5 github.com/mattn/go-mastodon v0.0.6 + github.com/nicksnyder/go-i18n/v2 v2.2.1 github.com/oklog/ulid/v2 v2.1.0 github.com/pkg/errors v0.9.1 github.com/rbcervilla/redisstore/v9 v9.0.0-rc1 go.mongodb.org/mongo-driver v1.11.0 + golang.org/x/text v0.4.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -87,13 +90,11 @@ require ( go.uber.org/zap v1.23.0 // indirect golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 // indirect golang.org/x/net v0.2.0 // indirect - golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect golang.org/x/sys v0.2.0 // indirect - golang.org/x/text v0.4.0 // indirect golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect google.golang.org/grpc v1.50.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index a84b7d9..e4e86af 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= +github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -247,6 +249,8 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6f github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYojM/PaA= +github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -379,6 +383,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE= go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -402,6 +407,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -437,6 +443,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -470,6 +477,7 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -478,6 +486,7 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221004154528-8021a29435af/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= @@ -500,8 +509,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -553,6 +562,7 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220608164250-635b8c9b7f68/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= @@ -615,6 +625,7 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -717,6 +728,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/locale.go b/locale.go new file mode 100644 index 0000000..6b7192b --- /dev/null +++ b/locale.go @@ -0,0 +1,16 @@ +package main + +import ( + "github.com/nicksnyder/go-i18n/v2/i18n" + "golang.org/x/text/language" + yaml "gopkg.in/yaml.v3" +) + +func initLocaleBundle() *i18n.Bundle { + bundle := i18n.NewBundle(language.English) + bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal) + bundle.LoadMessageFile("locales/active.ja.yaml") + bundle.LoadMessageFile("locales/active.fr.yaml") + + return bundle +} diff --git a/locales/active.en.yaml b/locales/active.en.yaml new file mode 100644 index 0000000..fb1a2d8 --- /dev/null +++ b/locales/active.en.yaml @@ -0,0 +1 @@ +Advertise: '@{{.Host}} is now hosting Audon!' diff --git a/locales/active.fr.yaml b/locales/active.fr.yaml new file mode 100644 index 0000000..ad2c30d --- /dev/null +++ b/locales/active.fr.yaml @@ -0,0 +1,3 @@ +Advertise: + hash: sha1-bac4955e5b2655d6226dfb6e190f591f0e9f64cf + other: '@{{.Host}} est maintenant l'hôte d'Audon !' diff --git a/locales/active.ja.yaml b/locales/active.ja.yaml new file mode 100644 index 0000000..bd987c7 --- /dev/null +++ b/locales/active.ja.yaml @@ -0,0 +1,3 @@ +Advertise: + hash: sha1-bac4955e5b2655d6226dfb6e190f591f0e9f64cf + other: "@{{.Host}} が Audon をホスト中!" diff --git a/room.go b/room.go index 20d4646..38032d8 100644 --- a/room.go +++ b/room.go @@ -4,13 +4,17 @@ import ( "context" "encoding/json" "errors" + "fmt" "net/http" + "strings" "time" "github.com/jaevor/go-nanoid" "github.com/labstack/echo/v4" "github.com/livekit/protocol/auth" "github.com/livekit/protocol/livekit" + mastodon "github.com/mattn/go-mastodon" + "github.com/nicksnyder/go-i18n/v2/i18n" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" ) @@ -338,6 +342,45 @@ func joinRoomHandler(c echo.Context) (err error) { c.Logger().Error(err) return echo.NewHTTPError(http.StatusConflict) } + + if mainConfig.Bot.Enable && room.Advertise != "" { + 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 now hosting Audon!", + }, + TemplateData: map[string]string{ + "Host": room.Host.Webfinger, + }, + }) + + messages := []string{ + header, + fmt.Sprintf("🎙 %s\n🔗 https://%s/r/%s", room.Title, mainConfig.LocalDomain, room.RoomID), + } + if room.Description != "" { + messages = append(messages, room.Description) + } + messages = append(messages, "#Audon") + message := strings.Join(messages, "\n\n") + + if _, err := botClient.PostStatus(c.Request().Context(), &mastodon.Toot{ + Status: message, + Language: room.Advertise, + Visibility: "public", + }); err != nil { + c.Logger().Error(err) + } + } } return c.JSON(http.StatusOK, resp) diff --git a/schema.go b/schema.go index 54b521d..3c7c3ee 100644 --- a/schema.go +++ b/schema.go @@ -43,6 +43,7 @@ type ( ScheduledAt time.Time `bson:"scheduled_at" json:"scheduled_at"` EndedAt time.Time `bson:"ended_at" json:"ended_at"` CreatedAt time.Time `bson:"created_at" json:"created_at"` + Advertise string `bson:"advertise" json:"advertise"` } TokenResponse struct { diff --git a/server.go b/server.go index 05fc92b..cf9eca6 100644 --- a/server.go +++ b/server.go @@ -22,6 +22,7 @@ import ( "github.com/labstack/echo/v4" lksdk "github.com/livekit/server-sdk-go" "github.com/mattn/go-mastodon" + "github.com/nicksnyder/go-i18n/v2/i18n" "github.com/rbcervilla/redisstore/v9" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -50,6 +51,7 @@ var ( mainValidator = validator.New() mainConfig *AppConfig lkRoomServiceClient *lksdk.RoomServiceClient + localeBundle *i18n.Bundle ) func init() { @@ -69,6 +71,9 @@ func main() { log.Fatalf("Failed loading config values: %s\n", err.Error()) } + // Load locales + localeBundle = initLocaleBundle() + // Setup Livekit RoomService Client lkURL := &url.URL{ Scheme: "https",