From d06e724f067deb55b8009b62be8e300fe79d1961 Mon Sep 17 00:00:00 2001
From: Georg Pfuetzenreuter
Date: Sun, 29 Sep 2024 14:35:25 +0200
Subject: Refactor integrations

Move to a separate file for better code structure and to avoid huge
branching inside Msg().

Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
---
 wat/bot.go         | 61 +++------------------------------------
 wat/integration.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 57 deletions(-)
 create mode 100644 wat/integration.go

(limited to 'wat')

diff --git a/wat/bot.go b/wat/bot.go
index b361137..41c030f 100644
--- a/wat/bot.go
+++ b/wat/bot.go
@@ -3,7 +3,6 @@ package wat
 import (
 	"crypto/tls"
 	"fmt"
-	"strconv"
 	"strings"
 
 	"github.com/go-irc/irc"
@@ -14,17 +13,11 @@ type WatBot struct {
 	conn   *tls.Conn
 	c      *WatConfig
 	game   *WatGame
+	integration *WatIntegration
 	Db     *WatDb
 	Nick   string
 }
 
-type BotGame struct {
-	Games []string
-	Name  string
-}
-
-type BotGameConfig map[string][]string
-
 type WatConfig struct {
 	BotHosts          []string
 	BotGames          BotGameConfig
@@ -38,6 +31,7 @@ func NewWatBot(config *irc.ClientConfig, watConfig *WatConfig, serverConn *tls.C
 	wat := WatBot{conn: serverConn, Nick: config.Nick, c: watConfig}
 	wat.Db = NewWatDb()
 	wat.game = NewWatGame(&wat, wat.Db)
+	wat.integration = NewWatIntegration(&wat, wat.Db, &WatIntegrationConfig{BotHosts: watConfig.BotHosts, BotGames: watConfig.BotGames})
 	config.Handler = irc.HandlerFunc(wat.HandleIrcMsg)
 	wat.client = irc.NewClient(wat.conn, *config)
 	return &wat
@@ -72,20 +66,6 @@ func (w *WatBot) Admin(m *irc.Message) bool {
 	return w.Allowed(m.Prefix.Host, w.c.AdminHosts)
 }
 
-func (w *WatBot) Bot(m *irc.Message) (bool, []string) {
-	isBot := w.Allowed(m.Prefix.Host, w.c.BotHosts)
-	var games []string
-	if isBot {
-		for b, g := range w.c.BotGames {
-			if b == m.Prefix.Name {
-				games = g
-				break
-			}
-		}
-	}
-	return isBot, games
-}
-
 func (w *WatBot) Allowed(c string, r []string) bool {
 	for _, allowed := range r {
 		if c == allowed {
@@ -148,41 +128,8 @@ func (w *WatBot) Msg(m *irc.Message) {
 	}
 
 	// integration with games in other bots
-	isBot, games := w.Bot(m)
-	if isBot {
-		// Jeopardy
-		// parses a message "Top finishers: (nick1: 1300) (nick2: 1200)" from an authorized Jeopardy game bot
-		if args[0] == "Top" && args[1] == "finishers:" && w.Allowed("jeopardy", games) {
-			// hey, I avoided regex!
-			finisherPrizes := strings.Split(strings.Replace(strings.Replace(strings.Replace(strings.Replace(strings.Join(args[2:], " "), ") (", ";", -1), ": ", ":", -1), "(", "", 1), ")", "", 1), ";")
-			fmt.Printf("Processing Jeopardy: %s\n", finisherPrizes)
-			for _, pair := range finisherPrizes {
-				nameCoinPair := strings.Split(pair, ":")
-				coins, err := strconv.ParseUint(nameCoinPair[1], 10, 64)
-				if err != nil {
-					fmt.Printf("Invalid coins, cannot process pair for cashout: %s.\n", nameCoinPair)
-					continue
-				}
-				name := nameCoinPair[0]
-				// Jeopardy prizes are quite a lot of $$$, make it a bit more sane
-				coins = coins / 40
-				// name   = we assume the Jeopardy player name to match a Watbot player name
-				// host   = we could use some WHO logic to find the host, but assuming nickname lookup to be sufficient here
-				// create = based on the above, maybe rather not create Watbot players based on only a nick?
-				//          but it expects someone to have played with Watbot before to be eligible for Jeopardy cashout ..
-				player := w.Db.User(name, "", false)
-				if player.Nick == "" {
-					fmt.Printf("Player %s does not exist in Watbot, skipping cashout.\n", name)
-					continue
-				} else {
-					w.reply(m, fmt.Sprintf("smartass %s, gave u %d :)", player.Nick, coins))
-					player.Coins += coins
-					w.Db.Update(player)
-				}
-			}
-
-			return
-		}
+	if w.integration.HandleIntegration(m, args) {
+		return
 	}
 
 	// check if command char (or something weird) is present
diff --git a/wat/integration.go b/wat/integration.go
new file mode 100644
index 0000000..833b9a3
--- /dev/null
+++ b/wat/integration.go
@@ -0,0 +1,83 @@
+package wat
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+
+	"github.com/go-irc/irc"
+)
+
+type BotGameConfig map[string][]string
+
+type WatIntegrationConfig struct {
+	BotHosts []string
+	BotGames BotGameConfig
+}
+
+type WatIntegration struct {
+	bot *WatBot
+	db  *WatDb
+	c   *WatIntegrationConfig
+}
+
+func NewWatIntegration(bot *WatBot, db *WatDb, c *WatIntegrationConfig) *WatIntegration {
+	return &WatIntegration{bot, db, c}
+}
+
+func (w *WatIntegration) Bot(m *irc.Message) (bool, []string) {
+	isBot := w.bot.Allowed(m.Prefix.Host, w.c.BotHosts)
+	var games []string
+	if isBot {
+		for b, g := range w.c.BotGames {
+			if b == m.Prefix.Name {
+				games = g
+				break
+			}
+		}
+	}
+	return isBot, games
+}
+
+func (w *WatIntegration) HandleIntegration(m *irc.Message, msgargs []string) bool {
+	isBot, games := w.Bot(m)
+	if isBot {
+		// handles a message "Top finishers: (nick1: 1300) (nick2: 1200)" from an authorized Jeopardy game bot
+		if msgargs[0] == "Top" && msgargs[1] == "finishers:" && w.bot.Allowed("jeopardy", games) {
+			w.Jeopardy(m, msgargs)
+			return true
+		}
+	}
+	// not an authorized bot or no integration matched the given message
+	return false
+}
+
+func (w *WatIntegration) Jeopardy(m *irc.Message, msgargs []string) {
+	// hey, I avoided regex!
+	finisherPrizes := strings.Split(strings.Replace(strings.Replace(strings.Replace(strings.Replace(strings.Join(msgargs[2:], " "), ") (", ";", -1), ": ", ":", -1), "(", "", 1), ")", "", 1), ";")
+	fmt.Printf("Processing Jeopardy: %s\n", finisherPrizes)
+	for _, pair := range finisherPrizes {
+		nameCoinPair := strings.Split(pair, ":")
+		coins, err := strconv.ParseUint(nameCoinPair[1], 10, 64)
+		if err != nil {
+			fmt.Printf("Invalid coins, cannot process pair for cashout: %s.\n", nameCoinPair)
+			continue
+		}
+		name := nameCoinPair[0]
+		// Jeopardy prizes are quite a lot of $$$, make it a bit more sane
+		coins = coins / 40
+		// name   = we assume the Jeopardy player name to match a Watbot player name
+		// host   = we could use some WHO logic to find the host, but assuming nickname lookup to be sufficient here
+		// create = based on the above, maybe rather not create Watbot players based on only a nick?
+		//          but it expects someone to have played with Watbot before to be eligible for Jeopardy cashout ..
+		player := w.db.User(name, "", false)
+		if player.Nick == "" {
+			fmt.Printf("Player %s does not exist in Watbot, skipping cashout.\n", name)
+			continue
+		} else {
+			w.bot.reply(m, fmt.Sprintf("smartass %s, gave u %d :)", player.Nick, coins))
+			player.Coins += coins
+			w.db.Update(player)
+		}
+	}
+}
-- 
cgit v1.2.3