73 lines
2.1 KiB
Python
Executable File
73 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3.9
|
|
|
|
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
|
|
|
|
IRC_SERVER = "irc.tu-ilmenau.de"
|
|
IRC_PORT = 6667
|
|
IRC_CHANNEL = "#hinterzimmer"
|
|
IRC_NICK = "aocrr-bot"
|
|
IRC_USER = "aocrr-bot"
|
|
IRC_REALNAME = "#aocrr Leaderboard Announcer"
|
|
|
|
|
|
def fetch_leaderboard(session_id: str, year: int = datetime.now().year) -> dict:
|
|
return json.loads(
|
|
requests.get(
|
|
"https://adventofcode.com/%d/leaderboard/private/view/711147.json" % year,
|
|
cookies={'session': session_id}
|
|
).content
|
|
)
|
|
|
|
|
|
class IrcBot(Daemon):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.cache = JSONFile("aocrr_bot.cache", create=True)
|
|
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.scheduler = Scheduler()
|
|
self.scheduler.schedule('irc-receive', timedelta(seconds=10), self.irc_client.receive)
|
|
|
|
def on_privmsg(self, msg_from: str, msg_to: str, message: str):
|
|
if msg_to != IRC_CHANNEL:
|
|
return
|
|
|
|
if message.startswith("!today"):
|
|
pass
|
|
elif message.startswith("!test"):
|
|
self.irc_client.privmsg(IRC_CHANNEL, "What I've read: " + " ".join(message.split()[1:]))
|
|
elif message.startswith("!quit") and msg_from.startswith("stha!"):
|
|
self.irc_client.privmsg(IRC_CHANNEL, "Oh, ok ... bye :'(")
|
|
self.irc_client.quit()
|
|
self.stop()
|
|
|
|
def run(self):
|
|
while 1:
|
|
self.scheduler.run_pending()
|
|
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()
|