From 73cae5b32b3348d00d2459d99aed9d3b2df54d42 Mon Sep 17 00:00:00 2001 From: GaMeNu <98153342+GaMeNu@users.noreply.github.com> Date: Wed, 11 Oct 2023 12:45:28 +0300 Subject: [PATCH] v2.0.1 Fixed bugs (ranked by severity): Anyone can register channels Incorrect time on embeds Missing alert type for non-missile alerts --- cog_notificator.py | 67 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/cog_notificator.py b/cog_notificator.py index 6042467..9a82023 100644 --- a/cog_notificator.py +++ b/cog_notificator.py @@ -42,9 +42,23 @@ class AlertReqs: content = req.text + print(req.text) + return json.loads(content) +class Alert: + def __init__(self, id: int, cat: int, title: str, districts: list[str], desc: str): + self.id = id + self.category = cat + self.title = title + self.districts = districts + self.description = desc + + @staticmethod + def from_dict(data: dict): + return Alert(int(data.get('id', '0')), int(data.get('cat', '0')), data.get('title'), data.get('data'), data.get('desc')) + class Notificator(commands.Cog): districts: list[dict] = json.loads(requests.get('https://www.oref.org.il//Shared/Ajax/GetDistricts.aspx').text) @@ -100,12 +114,15 @@ class Notificator(commands.Cog): self.active_districts = data @staticmethod - def generate_alert_embed(alert_id: int, district: str, arrival_time: int, time: str, lang: str) -> discord.Embed: + def generate_alert_embed(alert_object: Alert, district: str, arrival_time: int, time: str, lang: str) -> discord.Embed: e = discord.Embed(color=discord.Color.from_str('#FF0000')) e.title = f'התראה ב{district}' - if alert_id == 1: - e.add_field(name=district, value='יריית רקטות וטילים', inline=False) - e.add_field(name='זמן מיגון', value=f'{arrival_time} שניות', inline=False) + match alert_object.category: + case 1: + e.add_field(name=district, value=alert_object.title, inline=False) + e.add_field(name='זמן מיגון', value=f'{arrival_time} שניות', inline=False) + case _: + e.add_field(name=district, value=alert_object.title) e.add_field(name='נכון ל', value=time, inline=False) return e @@ -120,22 +137,34 @@ class Notificator(commands.Cog): view.add_item(button) return view - async def send_new_alert(self, alert_data: dict, districts: list[str]): + async def send_new_alert(self, alert_data: dict, new_districts: list[str]): alert_history = AlertReqs.request_history_json()[0:100] embed_ls: list[discord.Embed] = [] embed_ls_ls: list[list[discord.Embed]] = [] - for district in districts: + new_alert = Alert.from_dict(alert_data) + + for district in new_districts: district_data = self.db.get_district_by_name(district) - alert_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + alert_time = datetime.datetime.now() # .strftime() for alert in alert_history: if alert["data"] == district: - alert_time = alert["alertDate"] - break + new_time = datetime.datetime.strptime(alert["alertDate"], "%Y-%m-%d %H:%M:%S") + time_diff = abs(alert_time - new_time) + # Check if new time is withing 5 minutes + if time_diff <= datetime.timedelta(minutes=5): + # We have a match. Assign and stop looking + alert_time = new_time + break - embed_ls.append(Notificator.generate_alert_embed(int(alert_data["cat"]), district, district_data.migun_time, - alert_time.__str__(), 'he')) + # it's not within 5 minutes, keep looking. + # DF Code ruined me, and now I overuse break and continue. + + alert_time_str = alert_time.strftime("%Y-%m-%d %H:%M:%S") + + embed_ls.append(Notificator.generate_alert_embed(new_alert, district, district_data.migun_time, + alert_time_str, 'he')) if len(embed_ls) == 10: embed_ls_ls.append(embed_ls) embed_ls = [] @@ -153,7 +182,8 @@ class Notificator(commands.Cog): continue await dc_ch.send(embeds=embed_list, view=self.hfc_button_view()) - @app_commands.command(name='register', description='Register a channel to receive HFC alerts') + @app_commands.command(name='register', description='Register a channel to receive HFC alerts (Requires Manage Channels)') + @app_commands.checks.has_permissions(manage_channels=True) async def register_channel(self, intr: discord.Interaction): channel_id = intr.channel_id if intr.channel.guild is not None: @@ -178,7 +208,13 @@ class Notificator(commands.Cog): except AttributeError: await intr.response.send_message(f'This channel will now receive HFC alerts.') - @app_commands.command(name='unregister', description='Stop a channel from receiving HFC alerts') + @register_channel.error + async def register_channel_error(self, intr: discord.Interaction, error): + if isinstance(error, app_commands.MissingPermissions): + await intr.response.send_message('Error: You are missing the Manage Channels permission.') + + @app_commands.command(name='unregister', description='Stop a channel from receiving HFC alerts (Requires Manage Channels)') + @app_commands.checks.has_permissions(manage_channels=True) async def unregister_channel(self, intr: discord.Interaction): channel_id = intr.channel_id @@ -204,6 +240,11 @@ class Notificator(commands.Cog): except AttributeError: await intr.response.send_message(f'This channel will no longer receive HFC alerts') + @unregister_channel.error + async def register_channel_error(self, intr: discord.Interaction, error): + if isinstance(error, app_commands.MissingPermissions): + await intr.response.send_message('Error: You are missing the Manage Channels permission.') + @app_commands.command(name='about', description='Info about the bot') async def about_bot(self, intr: discord.Interaction): e = discord.Embed(color=discord.Color.orange())