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')]"
>
+
+
+
+
+ now@audon.space
+
+
+
+
-
+
{{ $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",