From a8730ed579b4349212f6d39e96194f07385146db Mon Sep 17 00:00:00 2001
From: xeals <dev@xeal.me>
Date: Sat, 8 Apr 2023 09:50:32 +1000
Subject: [PATCH] leaguefacts

---
 bot.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 53 insertions(+), 5 deletions(-)

diff --git a/bot.py b/bot.py
index 197bc92..17a326d 100755
--- a/bot.py
+++ b/bot.py
@@ -1,9 +1,11 @@
 #!/usr/bin/env python3
 
 from discord.utils import setup_logging
+from typing import Optional
 import argparse
 import discord
 import logging
+import random
 import re
 import shutil
 import subprocess as sp
@@ -39,15 +41,48 @@ def _update_db():
 
 
 class BotClient(discord.Client):
+    def __init__(
+        self,
+        leaguefacts: Optional[list[str]] = None,
+        intents: discord.Intents = discord.Intents.default(),
+        **options,
+    ):
+        super(discord.Client, self).__init__(intents, options)
+        self._leaguefacts = leaguefacts or []
+
     async def on_ready(self):
         _log.info(f"ready as {self.user}")
 
     async def on_message(self, message: discord.Message):
         content = message.content
-        if re.match("https://replay.pokemonshowdown.com/dl-.*", content):
-            _log.info(f"Recognised {content} as a League game")
-            _write_game(content)
-            _update_db()
+        if self.is_replay(message):
+            await self.on_replay(message)
+        elif self.is_leaguefact(message):
+            await self.on_leaguefact(message)
+
+    async def is_replay(self, message: discord.Message) -> bool:
+        if re.match("https://replay.pokemonshowdown.com/dl-.*", message.content):
+            return True
+        return False
+
+    async def on_replay(self, message: discord.Message):
+        _log.info(f"Recognised {message.content} as a League game")
+        _write_game(message.content)
+        _update_db()
+
+    async def is_leaguefact(self, message: discord.Message) -> bool:
+        return message.content.lower() == "notleaguefact"
+
+    async def on_leaguefact(self, message: discord.Message):
+        fact = self._select_leaguefact()
+        if fact:
+            message.channel.send(fact)
+
+    def _select_leaguefact(self) -> Optional[str]:
+        if not self._leaguefacts:
+            return None
+        random.seed()
+        return random.choice(self._leaguefacts)
 
 
 def main():
@@ -59,12 +94,25 @@ def main():
         default="token",
         help="file containing Discord API token",
     )
+    parser.add_argument(
+        "-f",
+        "--facts",
+        metavar="FILE",
+        default="facts.txt",
+        help="file containing leagefacts",
+    )
 
     args = parser.parse_args()
 
+    facts = []
+    with open(args.facts) as f:
+        for line in f:
+            facts.append(line)
+
     intents = discord.Intents.default()
     intents.message_content = True
-    client = BotClient(intents=intents)
+    client = BotClient(leaguefacts=facts, intents=intents)
+
     with open(args.token_file) as f:
         token = f.read().strip()
         client.run(token, log_handler=None)