aocrr-bot: finally implement !today

This commit is contained in:
Stefan Harmuth 2021-12-07 08:34:49 +01:00
parent f4455f1c56
commit 9079bd2b01

View File

@ -4,15 +4,17 @@ import json
import requests import requests
import sys import sys
from datetime import datetime, timedelta from datetime import datetime, timedelta
from datafiles import JSONFile
from irc import Client
from schedule import Scheduler
from time import sleep from time import sleep
from tools import human_readable_time_from_delta from tools.datafiles import JSONFile
from tools.irc import Client
from tools.schedule import Scheduler
from tools.tools import human_readable_time_from_delta
IRC_SERVER = "irc.eu.libera.chat" #IRC_SERVER = "irc.eu.libera.chat"
IRC_SERVER = "irc.tu-ilmenau.de"
IRC_PORT = 6667 IRC_PORT = 6667
IRC_CHANNEL = "#aocrr" #IRC_CHANNEL = "#aocrr"
IRC_CHANNEL = "#hinterzimmer"
IRC_NICK = "aocrr-bot" IRC_NICK = "aocrr-bot"
IRC_USER = "aocrr-bot" IRC_USER = "aocrr-bot"
IRC_REALNAME = "#aocrr Leaderboard Announcer" IRC_REALNAME = "#aocrr Leaderboard Announcer"
@ -44,14 +46,80 @@ class IrcBot:
return return
if message.startswith("!today"): if message.startswith("!today"):
pass today = str(datetime.now().day)
elif message.startswith("!test"): day_start = datetime.today().replace(hour=6, minute=0, second=0)
self.irc_client.privmsg(IRC_CHANNEL, "What I've read: " + " ".join(message.split()[1:]))
today_list = []
for member, member_data in self.cache.items():
if not member.startswith("__") and 'days' in member_data and today in member_data['days']:
today_list.append(member)
self.irc_client.privmsg(
IRC_CHANNEL,
"Todays leaderboard (last updated: %s):" % self.cache['__last_update__']
)
for i, member in enumerate(sorted(today_list, key=lambda x: self.cache[x]['days'][today]['score'], reverse=True)):
if i > 3:
sleep(1) # don't flood
if "1" in self.cache[member]['days'][today]:
p1_time = "in " + human_readable_time_from_delta(
datetime.fromisoformat(self.cache[member]['days'][today]['1']) - day_start
)
else:
p1_time = "not yet solved"
if "2" in self.cache[member]['days'][today]:
p2_time = "in " + human_readable_time_from_delta(
datetime.fromisoformat(self.cache[member]['days'][today]['2']) - day_start
)
else:
p2_time = "not yet solved"
self.irc_client.privmsg(
IRC_CHANNEL,
"%d) %s (Scores: total: %d, today: %d) p1 %s, p2 %s"
% (
i + 1,
self.cache[member]['name'],
self.cache[member]['score'],
self.cache[member]['days'][today]['score'],
p1_time,
p2_time
)
)
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()
sys.exit(0) sys.exit(0)
def calc_scores(self):
member_count = len([x for x in self.cache.keys() if not x.startswith("__")])
for day in map(str, range(1, 26)):
p1_times = []
p2_times = []
for member, member_data in self.cache.items():
if member.startswith("__") or day not in member_data['days']:
continue
self.cache[member]['days'][day]['score'] = 0
if '1' in member_data['days'][day]:
p1_times.append(member_data['days'][day]['1'])
if '2' in member_data['days'][day]:
p2_times.append(member_data['days'][day]['2'])
for member, member_data in self.cache.items():
if member.startswith("__") or day not in member_data['days']:
continue
if '1' in member_data['days'][day] and member_data['days'][day]['1'] in p1_times:
score = member_count - sorted(p1_times).index(member_data['days'][day]['1'])
self.cache[member]['days'][day]['score'] += score
if '2' in member_data['days'][day] and member_data['days'][day]['2'] in p2_times:
score = member_count - sorted(p2_times).index(member_data['days'][day]['2'])
self.cache[member]['days'][day]['score'] += score
def update_leaderboard(self): def update_leaderboard(self):
try: try:
new_leaderboard = fetch_leaderboard(self.__session_id) new_leaderboard = fetch_leaderboard(self.__session_id)
@ -68,6 +136,9 @@ class IrcBot:
'days': {}, 'days': {},
} }
self.cache[member]['global_score'] = int(member_data['global_score'])
self.cache[member]['score'] = int(member_data['local_score'])
self.cache[member]['stars'] = int(member_data['stars'])
for day in member_data['completion_day_level']: for day in member_data['completion_day_level']:
day_start = datetime(now.year, 12, int(day), 6, 0, 0) day_start = datetime(now.year, 12, int(day), 6, 0, 0)
if day not in self.cache[member]['days']: if day not in self.cache[member]['days']:
@ -83,7 +154,7 @@ class IrcBot:
finishing_time = human_readable_time_from_delta(completion_time - day_start) finishing_time = human_readable_time_from_delta(completion_time - day_start)
new_stars[member_data['name']]['d' + day + 'p' + part] = finishing_time new_stars[member_data['name']]['d' + day + 'p' + part] = finishing_time
self.cache[member]['days'][day][part] = finishing_time self.cache[member]['days'][day][part] = completion_time.isoformat()
if len(new_stars) > 0: if len(new_stars) > 0:
self.irc_client.privmsg(IRC_CHANNEL, "New Stars found:") self.irc_client.privmsg(IRC_CHANNEL, "New Stars found:")
@ -98,6 +169,7 @@ class IrcBot:
self.cache['__last_update__'] = datetime.now().isoformat() self.cache['__last_update__'] = datetime.now().isoformat()
self.cache.save() self.cache.save()
self.calc_scores()
def run(self): def run(self):
while 1: while 1: