diff --git a/bot.py b/bot.py index 06a7ea8..19a4774 100644 --- a/bot.py +++ b/bot.py @@ -11,8 +11,18 @@ import os import logging import sys +class Bot(commands.Bot): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + async def on_guild_remove(self, guild): + await cur.execute("DELETE from teamsubscriptions WHERE serverid = ?", (guild.id,)) + await cur.execute("DELETE from liveupdate WHERE serverid = ?", (guild.id,)) + await cur.execute("DELETE from spotlightsubscriptions WHERE serverid = ?", (guild.id,)) + await db.commit() + load_dotenv() -bot = commands.Bot() +bot = Bot() @@ -20,7 +30,7 @@ bot = commands.Bot() async def on_ready(): global db global cur - db = await sqlite3.connect("/data/mmolb.sqlite") + db = await sqlite3.connect(os.getenv("DB_PATH")) cur = await db.cursor() res = await cur.execute("SELECT name FROM sqlite_master WHERE name='liveupdate'") if await res.fetchone() is None: @@ -36,6 +46,17 @@ async def on_ready(): await db.commit() bot.db = db bot.cur = cur + guild_list = [] + async for guild in bot.fetch_guilds(): + guild_list.append(guild.id) + res = await cur.execute("SELECT serverid FROM liveupdate UNION SELECT serverid FROM spotlightsubscriptions UNION SELECT serverid FROM teamsubscriptions") + res = await res.fetchall() + for [serverid] in res: + if serverid not in guild_list: + await cur.execute("DELETE from teamsubscriptions WHERE serverid = ?", (serverid,)) + await cur.execute("DELETE from liveupdate WHERE serverid = ?", (serverid,)) + await cur.execute("DELETE from spotlightsubscriptions WHERE serverid = ?", (serverid,)) + await db.commit() bot.load_extension('cogs.team') #Must load first as it contains autofill code bot.load_extension('cogs.liveupdate') bot.load_extension('cogs.error') diff --git a/cogs/liveupdate.py b/cogs/liveupdate.py index 89bb9e6..f1d0041 100644 --- a/cogs/liveupdate.py +++ b/cogs/liveupdate.py @@ -223,52 +223,70 @@ class liveupdate(commands.Cog): await self.bot.db.commit() await interaction.edit_original_message(content="stopped updates for message") #TODO This will be a button - @tasks.loop(seconds=10.0) + @tasks.loop(seconds=20.0) async def updatelivegames(self): - await self.bot.wait_until_ready() - print("updating live games") - res = await self.bot.db.execute("SELECT serverid,userid,channelid,messageid,gameid,offset FROM liveupdate") - res = await res.fetchall() - print(res) - for [serverid,userid,channelid,messageid,gameid,offset] in res: - try: - channel = self.bot.get_channel(channelid) - message = await channel.fetch_message(messageid) - data = requests.get(f"https://mmolb.com/api/game/{gameid}/live?after={offset}").json() - if len(data["entries"]) > 0: - splitstr = message.content.split("\n") - if len(splitstr) > 0: - splitstr.pop(0) - try: - while len(splitstr)>(5-len(data["entries"])): + try: + await self.bot.wait_until_ready() + print("updating live games") + res = await self.bot.db.execute("SELECT serverid,userid,channelid,messageid,gameid,offset FROM liveupdate") + res = await res.fetchall() + print(res) + lastserverid = 0 + for [serverid,userid,channelid,messageid,gameid,offset] in res: + lastserverid = serverid + try: + channel = self.bot.get_channel(channelid) + message = await channel.fetch_message(messageid) + data = requests.get(f"https://mmolb.com/api/game/{gameid}/live?after={offset}").json() + if len(data["entries"]) > 0: + splitstr = message.content.split("\n") + if len(splitstr) > 0: splitstr.pop(0) - except IndexError: - print("Warning: index error, ignoring") #Not sure why this happens so far but ignorning the error doesn't break anything - print(splitstr) - basedata = requests.get(f"https://mmolb.com/api/game/{gameid}").json() - finalstr = f"{basedata["AwayTeamName"]} {basedata["AwayTeamEmoji"]} **{data["entries"][-1]["away_score"]}** vs {basedata["HomeTeamName"]} {basedata["HomeTeamEmoji"]} **{data["entries"][-1]["home_score"]}**" - offsetadd = 0 - for i in splitstr: - finalstr += f"\n{i}" - for i in data["entries"]: - finalstr += f"\n{i['message'].replace("", "**").replace("", "**")}" - offsetadd += 1 - await self.bot.db.execute(f""" - UPDATE liveupdate set offset = {offset+offsetadd} WHERE messageid = '{messageid}' - """) #Could do this for every meessage subscribed to the game but since the messages go one by one... maybe I should change that - await self.bot.db.commit() - if i["event"] == "Recordkeeping": + try: + while len(splitstr)>(5-len(data["entries"])): + splitstr.pop(0) + except IndexError: + print("Warning: index error, ignoring") #Not sure why this happens so far but ignorning the error doesn't break anything + print(splitstr) + basedata = requests.get(f"https://mmolb.com/api/game/{gameid}").json() + finalstr = f"{basedata["AwayTeamName"]} {basedata["AwayTeamEmoji"]} **{data["entries"][-1]["away_score"]}** vs {basedata["HomeTeamName"]} {basedata["HomeTeamEmoji"]} **{data["entries"][-1]["home_score"]}**" + offsetadd = 0 + for i in splitstr: + finalstr += f"\n{i}" + for i in data["entries"]: + finalstr += f"\n{i['message'].replace("", "**").replace("", "**")}" + offsetadd += 1 await self.bot.db.execute(f""" - DELETE from liveupdate WHERE messageid = {messageid} - """) + UPDATE liveupdate set offset = {offset+offsetadd} WHERE messageid = '{messageid}' + """) #Could do this for every meessage subscribed to the game but since the messages go one by one... maybe I should change that await self.bot.db.commit() - await message.edit(finalstr) - except Exception as e: - await self.bot.db.execute(f""" - DELETE from liveupdate WHERE messageid = {messageid} - """) - await self.bot.db.commit() - await message.edit(f"An error occoured in this live update\n{e}") + if i["event"] == "Recordkeeping": + await self.bot.db.execute(f""" + DELETE from liveupdate WHERE messageid = {messageid} + """) + await self.bot.db.commit() + await message.edit(finalstr) + except Exception as e: + await self.bot.db.execute(f""" + DELETE from liveupdate WHERE messageid = {messageid} + """) + await self.bot.db.commit() + await message.edit(f"An error occoured in this live update\n{e}") + warning = self.bot.get_channel(1365478368555827270) + await warning.send(e) + except nextcord.Forbidden: + warning = self.bot.get_channel(1365478368555827270) + await self.bot.db.execute("DELETE from teamsubscriptions WHERE serverid = ?", (lastserverid,)) + await self.bot.db.execute("DELETE from liveupdate WHERE serverid = ?", (lastserverid,)) + await self.bot.db.execute("DELETE from spotlightsubscriptions WHERE serverid = ?", (lastserverid,)) + await self.bot.db.commit() + await warning.send(f"Deleted {lastserverid} from the database due to 403 error") + except Exception as e: + warning = self.bot.get_channel(1365478368555827270) + await warning.send(e) + print(e) + + @tasks.loop(seconds=120.0)