summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-10-14 16:46:58 +0500
committerilotterytea <iltsu@alright.party>2025-10-14 16:46:58 +0500
commite4c92920e627b7ad17f51637f52ca36e8468341f (patch)
tree1fd96dca1bae51698e61b7d65f7b859643df1baf
parent33fd114a314212b8759b525fb9e08d4ff4ca8869 (diff)
feat: join channels in goroutine
-rw-r--r--cmd/statsbot/main.go8
-rw-r--r--internal/channel.go59
2 files changed, 62 insertions, 5 deletions
diff --git a/cmd/statsbot/main.go b/cmd/statsbot/main.go
index 35e8f28..69fc7a5 100644
--- a/cmd/statsbot/main.go
+++ b/cmd/statsbot/main.go
@@ -11,6 +11,8 @@ import (
)
func main() {
+ channels := []stats.Channel{}
+
db, err := stats.NewDatabaseConnection("mysql", "kochan:kochan@/stats")
if err != nil {
log.Panicf("Failed to establish a database connection: %v\n", err)
@@ -27,11 +29,7 @@ func main() {
go stats.HandleMessageEvent(channel, user, message, db)
})
- channels, _ := db.Query("SELECT alias_name FROM channels WHERE opted_out_at IS NULL")
- for _, c := range channels {
- log.Printf("Joining #%s...\n", c["alias_name"])
- client.Join(c["alias_name"])
- }
+ go stats.JoinChannels(&channels, client, db)
if err := client.Connect(); err != nil {
log.Panicf("Failed to connect Twitch IRC: %v\n", err)
diff --git a/internal/channel.go b/internal/channel.go
new file mode 100644
index 0000000..c6100c5
--- /dev/null
+++ b/internal/channel.go
@@ -0,0 +1,59 @@
+package stats
+
+import (
+ "log"
+ "slices"
+ "time"
+
+ "github.com/gempir/go-twitch-irc"
+)
+
+type Channel struct {
+ id string
+ name string
+}
+
+func NewChannel(id string, name string) Channel {
+ c := Channel{
+ id: id,
+ name: name,
+ }
+
+ return c
+}
+
+func (c *Channel) HandleMessageEvent(sender twitch.User, message twitch.Message, db *DatabaseConnection) {
+}
+
+func JoinChannels(channels *[]Channel, client *twitch.Client, db *DatabaseConnection) {
+ for {
+ cc, _ := db.Query("SELECT alias_id, alias_name FROM channels WHERE opted_out_at IS NULL")
+
+ for _, c := range cc {
+ if slices.ContainsFunc(*channels, func(c2 Channel) bool {
+ return c2.name == c["alias_name"]
+ }) {
+ continue
+ }
+
+ log.Printf("Joining #%s...\n", c["alias_name"])
+ client.Join(c["alias_name"])
+ *channels = append(*channels, NewChannel(c["alias_id"], c["alias_name"]))
+ }
+
+ for _, c := range *channels {
+ if !slices.ContainsFunc(cc, func(x map[string]string) bool {
+ return x["alias_name"] == c.name
+ }) {
+ log.Printf("Parting #%s...\n", c.name)
+ client.Depart(c.name)
+
+ *channels = slices.DeleteFunc(*channels, func(c2 Channel) bool {
+ return c2.name == c.name
+ })
+ }
+ }
+
+ time.Sleep(5 * time.Second)
+ }
+}