#!/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 discord.utils.setup_logging() _log = logging.getLogger("statbot") _GAMES = "games.txt" _DB = "holy-heck2.db" _DB_DEST = f"/var/lib/grafana/{_DB}" def _write_game(content: str): try: with open(_GAMES, "a") as f: f.write(content) f.write("\n") except: _log.exception(f"failed writing game {content}") def _update_db(): try: games = [] with open(_GAMES) as f: for line in f: games.append(line.strip()) sp.run(["./index.py", "-o", _DB] + games) shutil.move(_DB, _DB_DEST) _log.info("updated db") except: _log.exception(f"failed updating 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 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(): parser = argparse.ArgumentParser() parser.add_argument( "-t", "--token-file", metavar="FILE", 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(leaguefacts=facts, intents=intents) with open(args.token_file) as f: token = f.read().strip() client.run(token, log_handler=None) if __name__ == "__main__": main()