evolve aocrr-bot

This commit is contained in:
Stefan Harmuth 2021-12-06 05:55:43 +01:00
parent e3e7eb7184
commit 1ee8f42c4b

View File

@ -3,12 +3,12 @@
import json import json
import requests import requests
import sys import sys
from daemon import Daemon
from datetime import datetime, timedelta from datetime import datetime, timedelta
from datafiles import JSONFile from datafiles import JSONFile
from irc import Client from irc import Client
from schedule import Scheduler from schedule import Scheduler
from time import sleep from time import sleep
from tools import human_readable_time_from_delta
IRC_SERVER = "irc.tu-ilmenau.de" IRC_SERVER = "irc.tu-ilmenau.de"
IRC_PORT = 6667 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): def __init__(self):
super().__init__() super().__init__()
self.cache = JSONFile("aocrr_bot.cache", create=True) 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 = Client(IRC_SERVER, IRC_PORT, IRC_NICK, IRC_USER, IRC_REALNAME)
self.irc_client.join(IRC_CHANNEL) self.irc_client.join(IRC_CHANNEL)
self.irc_client.register('PRIVMSG', self.on_privmsg) self.irc_client.register('PRIVMSG', self.on_privmsg)
self.update_leaderboard()
self.scheduler = Scheduler() self.scheduler = Scheduler()
self.scheduler.schedule('irc-receive', timedelta(seconds=10), self.irc_client.receive) 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): def on_privmsg(self, msg_from: str, msg_to: str, message: str):
if msg_to != IRC_CHANNEL: if msg_to != IRC_CHANNEL:
@ -48,7 +51,54 @@ class IrcBot(Daemon):
elif message.startswith("!quit") and msg_from.startswith("stha!"): elif message.startswith("!quit") and msg_from.startswith("stha!"):
self.irc_client.privmsg(IRC_CHANNEL, "Oh, ok ... bye :'(") self.irc_client.privmsg(IRC_CHANNEL, "Oh, ok ... bye :'(")
self.irc_client.quit() 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): def run(self):
while 1: while 1:
@ -56,17 +106,6 @@ class IrcBot(Daemon):
sleep(1) 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__': if __name__ == '__main__':
main() ircbot = IrcBot()
ircbot.run()