Compare commits

..

2 Commits

Author SHA1 Message Date
c3df316aa4
add bot 2023-04-07 10:01:57 +10:00
008ddf6298
move main file 2023-04-07 09:16:15 +10:00
5 changed files with 83 additions and 6 deletions

3
.gitignore vendored
View File

@ -8,5 +8,6 @@ tmp/
build
htmlcov
data.db
*.db
cache/
token

View File

@ -11,8 +11,8 @@ fuck.
## Usage
```sh
$ ./main.py -h
usage: hhirlstats [-h] [-v] [-C] [-o FILE] replay [replay ...]
$ ./index.py -h
usage: hhirlstats [-h] [-v] [-C] [-t FILE] [-o FILE] replay [replay ...]
extracts stats from a Showdown replay
@ -23,6 +23,8 @@ options:
-h, --help show this help message and exit
-v, --verbose add debugging info (default: None)
-C, --no-cache fetch replays instead of using cache (default: False)
-t FILE, --teams FILE
JSON file defining players to teams (default: teams.json)
-o FILE, --output FILE
output data file (default: data.db)
```

73
bot.py Executable file
View File

@ -0,0 +1,73 @@
#!/usr/bin/env python3
from discord.utils import setup_logging
import argparse
import discord
import logging
import os
import re
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)
os.rename(_DB, _DB_DEST)
except:
_log.exception(f"failed updating db")
class BotClient(discord.Client):
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()
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"-t",
"--token-file",
metavar="FILE",
default="token",
help="file containing Discord API token",
)
args = parser.parse_args()
intents = discord.Intents.default()
intents.message_content = True
client = BotClient(intents=intents)
with open(args.token_file) as f:
token = f.read().strip()
client.run(token, log_handler=None)
if __name__ == "__main__":
main()

View File

@ -13,6 +13,7 @@
buildInputs =
let
python = pkgs.python3.withPackages (ps: [
ps.discordpy
ps.mypy
ps.requests
ps.types-requests

View File

@ -493,7 +493,7 @@ def fetch(replay: str, cache: bool = True) -> Replay:
return Replay(**data) # type: ignore
def main(args):
def main():
parser = argparse.ArgumentParser(
prog=APP,
description="extracts stats from a Showdown replay",
@ -524,7 +524,7 @@ def main(args):
)
parser.add_argument("replay", nargs="+", help="replay ID or URL")
args = parser.parse_args(args)
args = parser.parse_args()
if args.verbose and args.verbose > 1:
LOG.setLevel(logging.TRACE)
elif args.verbose:
@ -570,4 +570,4 @@ def main(args):
if __name__ == "__main__":
main(sys.argv[1:])
main()