From 1ee8f42c4b1650e18fa5a3c5381e690e38c52d1d Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Mon, 6 Dec 2021 05:55:43 +0100 Subject: [PATCH] evolve aocrr-bot --- aocrr_bot.py | 71 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/aocrr_bot.py b/aocrr_bot.py index 5371d99..2219ae4 100755 --- a/aocrr_bot.py +++ b/aocrr_bot.py @@ -3,12 +3,12 @@ import json import requests import sys -from daemon import Daemon from datetime import datetime, timedelta from datafiles import JSONFile from irc import Client from schedule import Scheduler from time import sleep +from tools import human_readable_time_from_delta IRC_SERVER = "irc.tu-ilmenau.de" IRC_PORT = 6667 @@ -27,15 +27,18 @@ def fetch_leaderboard(session_id: str, year: int = datetime.now().year) -> dict: ) -class IrcBot(Daemon): +class IrcBot: def __init__(self): super().__init__() self.cache = JSONFile("aocrr_bot.cache", create=True) + self.__session_id = open(".session", "r").readlines()[0].strip() self.irc_client = Client(IRC_SERVER, IRC_PORT, IRC_NICK, IRC_USER, IRC_REALNAME) self.irc_client.join(IRC_CHANNEL) self.irc_client.register('PRIVMSG', self.on_privmsg) + self.update_leaderboard() self.scheduler = Scheduler() self.scheduler.schedule('irc-receive', timedelta(seconds=10), self.irc_client.receive) + self.scheduler.schedule('leaderboard', timedelta(minutes=15), self.update_leaderboard) def on_privmsg(self, msg_from: str, msg_to: str, message: str): if msg_to != IRC_CHANNEL: @@ -48,7 +51,54 @@ class IrcBot(Daemon): elif message.startswith("!quit") and msg_from.startswith("stha!"): self.irc_client.privmsg(IRC_CHANNEL, "Oh, ok ... bye :'(") self.irc_client.quit() - self.stop() + sys.exit(0) + + def update_leaderboard(self): + try: + new_leaderboard = fetch_leaderboard(self.__session_id) + except: + return # didn't work this time? Well, we'll just try again in 15min ... + + now = datetime.now() + + new_stars = {} + for member, member_data in new_leaderboard['members'].items(): + if member not in self.cache: + self.cache[member] = { + 'name': member_data['name'], + 'days': {}, + } + + for day in member_data['completion_day_level']: + day_start = datetime(now.year, 12, int(day), 6, 0, 0) + if day not in self.cache[member]['days']: + self.cache[member]['days'][day] = {} + + for part in member_data['completion_day_level'][day]: + if part not in self.cache[member]['days'][day]: + completion_time = datetime.fromtimestamp( + member_data['completion_day_level'][day][part]['get_star_ts'] + ) + if member_data['name'] not in new_stars: + new_stars[member_data['name']] = {} + + finishing_time = human_readable_time_from_delta(completion_time - day_start) + new_stars[member_data['name']]['d' + day + 'p' + part] = finishing_time + self.cache[member]['days'][day][part] = finishing_time + + if len(new_stars) > 0: + self.irc_client.privmsg(IRC_CHANNEL, "New Stars found:") + for member, parts in new_stars.items(): + line = member + ": " + line += ", ".join( + "%s (%s)" + % (part, new_stars[member][part]) for part in sorted(new_stars[member].keys()) + ) + + self.irc_client.privmsg(IRC_CHANNEL, line) + + self.cache['__last_update__'] = datetime.now().isoformat() + self.cache.save() def run(self): while 1: @@ -56,17 +106,6 @@ class IrcBot(Daemon): sleep(1) -def main(): - ircbot = IrcBot() - if sys.argv[1] == 'start': - ircbot.start() - elif sys.argv[1] == "stop": - ircbot.stop() - elif sys.argv[1] == "restart": - ircbot.restart() - else: - print("unknown command '%s'. Must be one of 'start', 'stop', 'restart'" % sys.argv[1]) - - if __name__ == '__main__': - main() + ircbot = IrcBot() + ircbot.run()