evolve aocrr-bot
This commit is contained in:
parent
e3e7eb7184
commit
1ee8f42c4b
71
aocrr_bot.py
71
aocrr_bot.py
@ -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()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user