aocrr-bot: finally implement !today
This commit is contained in:
parent
f4455f1c56
commit
9079bd2b01
92
aocrr_bot.py
92
aocrr_bot.py
@ -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:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user