Merge remote-tracking branch 'origin/master'

This commit is contained in:
GaMeNu 2023-10-30 13:30:47 +02:00
commit d57469eb11
2 changed files with 146 additions and 141 deletions

145
alert_maker.py Normal file
View File

@ -0,0 +1,145 @@
import datetime
import discord
import db_access
from db_access import AreaDistrict
class Alert:
"""
Represents an HFC Alert
"""
def __init__(self, id: int, cat: int, title: str, districts: list[str], desc: str):
"""
Init an Alert instance
:param id: Alert ID
:param cat: Alert category
:param title: Alert title
:param districts: districts the alert is running for
:param desc: Alert description/extra info
"""
self.id = id
self.category = cat
self.title = title
self.districts = districts
self.description = desc
@classmethod
def from_dict(cls, data: dict):
"""
Return a new Alert instance from an Alert-formatted dict (matching HFC alert requests)
Dict format:
{
"id": int,
"cat": int,
"title": str,
"data": list[str],
"desc": str
}
:param data: A dict of matching format
:return: The new Alert instance
"""
return cls(int(data.get('id', '0')),
int(data.get('cat', '0')),
data.get('title'),
data.get('data'),
data.get('desc'))
class AlertEmbed:
"""
A class representing an AlertEmbed
:var embed: discord.Embed ready for sending
:var alert: Alert containing alert data
:var district: db_access.AreaDistrict | str containing district data
"""
def __init__(self, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Initiating the AlertEmbed class directly is equivalent to AlertEmbed.generic_alert, but is not recommended.
Please use AlertEmbed.generic_alert instead.
:var embed: discord.Embed ready for sending
:var alert: Alert containing alert data
:var district: db_access.AreaDistrict | str containing district data
"""
self.embed = discord.Embed(color=discord.Color.from_str('#FF0000'))
self.district = district
if isinstance(alert, dict):
self.alert = Alert.from_dict(alert)
else:
self.alert = alert
if isinstance(self.district, AreaDistrict):
self.embed.title = f'התראה ב{self.district.name}'
self.embed.add_field(name=self.alert.title, value=f'איזור {self.district.area.name}')
else:
self.embed.title = f'התראה ב{self.district}'
self.embed.add_field(name=self.alert.title, value='')
self.embed.add_field(name='נכון ל', value=datetime.datetime.now().strftime("%H:%M:%S\n%d/%m/%Y"), inline=False)
self.embed.add_field(name='מידע נוסף', value=self.alert.description)
@classmethod
def generic_alert(cls, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Returns a new Generic AlertEmbed
:param alert: Alert object
:param district: AreaDistrict object (District containing Area, check db_access.AreaDistrict)
:return: New AlertEmbed instance
"""
ret_alem = cls(alert, district)
return ret_alem
@classmethod
def missile_alert(cls, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Returns a new Missile AlertEmbed
Similar to Generic AlertEmbed, but contains Migun Time
:param alert: Alert object
:param district: AreaDistrict object (District containing Area, check db_access.AreaDistrict)
:return: New AlertEmbed instance
"""
ret_alem = cls.generic_alert(alert, district)
if (not isinstance(district, str)) and (district.migun_time is not None):
ret_alem.embed.insert_field_at(index=1, name='זמן מיגון', value=f'{district.migun_time} שניות', inline=False)
return ret_alem
ret_alem.embed.insert_field_at(index=1, name='זמן מיגון', value='שגיאה באחזרת המידע', inline=False)
return ret_alem
@classmethod
def auto_alert(cls, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Tired of having to CHOOSE an alert type all the time? Well this is JUST for you!
Introducing... auto_alert! Just init it like any other alert, and it will return the fitting alert right then and there*!
*"then and there" does not include any computer, end-user, developer, or any other type of tomfoolery.
(Hopefully now I'll never have to write documentation again >:) )
:param alert: Alert object or alert dict.
:param district: District object (from db_access)
:return: AlertEmbed object
"""
if isinstance(alert, dict):
alert_obj = Alert.from_dict(alert)
else:
alert_obj = alert
match alert_obj.category:
case 1:
return cls.missile_alert(alert_obj, district)
case _:
return cls.generic_alert(alert_obj, district)

View File

@ -13,6 +13,7 @@ import db_access
import errlogging import errlogging
from db_access import * from db_access import *
from markdown import md from markdown import md
from alert_maker import AlertEmbed
load_dotenv() load_dotenv()
AUTHOR_ID = int(os.getenv('AUTHOR_ID')) AUTHOR_ID = int(os.getenv('AUTHOR_ID'))
@ -71,147 +72,6 @@ class AlertReqs:
ret_dict = None ret_dict = None
return ret_dict return ret_dict
class Alert:
"""
Represents an HFC Alert
"""
def __init__(self, id: int, cat: int, title: str, districts: list[str], desc: str):
"""
Init an Alert instance
:param id: Alert ID
:param cat: Alert category
:param title: Alert title
:param districts: districts the alert is running for
:param desc: Alert description/extra info
"""
self.id = id
self.category = cat
self.title = title
self.districts = districts
self.description = desc
@classmethod
def from_dict(cls, data: dict):
"""
Return a new Alert instance from an Alert-formatted dict (matching HFC alert requests)
Dict format:
{
"id": int,
"cat": int,
"title": str,
"data": list[str],
"desc": str
}
:param data: A dict of matching format
:return: The new Alert instance
"""
return cls(int(data.get('id', '0')),
int(data.get('cat', '0')),
data.get('title'),
data.get('data'),
data.get('desc'))
class AlertEmbed:
"""
A class representing an AlertEmbed
:var embed: discord.Embed ready for sending
:var alert: Alert containing alert data
:var district: db_access.AreaDistrict | str containing district data
"""
def __init__(self, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Initiating the AlertEmbed class directly is equivalent to AlertEmbed.generic_alert, but is not recommended.
Please use AlertEmbed.generic_alert instead.
:var embed: discord.Embed ready for sending
:var alert: Alert containing alert data
:var district: db_access.AreaDistrict | str containing district data
"""
self.embed = discord.Embed(color=discord.Color.from_str('#FF0000'))
self.district = district
if isinstance(alert, dict):
self.alert = Alert.from_dict(alert)
else:
self.alert = alert
if isinstance(self.district, AreaDistrict):
self.embed.title = f'התראה ב{self.district.name}'
self.embed.add_field(name=self.alert.title, value=f'איזור {self.district.area.name}')
else:
self.embed.title = f'התראה ב{self.district}'
self.embed.add_field(name=self.alert.title, value='')
self.embed.add_field(name='נכון ל', value=datetime.datetime.now().strftime("%H:%M:%S\n%d/%m/%Y"), inline=False)
self.embed.add_field(name='מידע נוסף', value=self.alert.description)
@classmethod
def generic_alert(cls, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Returns a new Generic AlertEmbed
:param alert: Alert object
:param district: AreaDistrict object (District containing Area, check db_access.AreaDistrict)
:return: New AlertEmbed instance
"""
ret_alem = cls(alert, district)
return ret_alem
@classmethod
def missile_alert(cls, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Returns a new Missile AlertEmbed
Similar to Generic AlertEmbed, but contains Migun Time
:param alert: Alert object
:param district: AreaDistrict object (District containing Area, check db_access.AreaDistrict)
:return: New AlertEmbed instance
"""
ret_alem = cls.generic_alert(alert, district)
if (not isinstance(district, str)) and (district.migun_time is not None):
ret_alem.embed.insert_field_at(index=1, name='זמן מיגון', value=f'{district.migun_time} שניות', inline=False)
return ret_alem
ret_alem.embed.insert_field_at(index=1, name='זמן מיגון', value='שגיאה באחזרת המידע', inline=False)
return ret_alem
@classmethod
def auto_alert(cls, alert: Alert | dict, district: db_access.AreaDistrict | str):
"""
Tired of having to CHOOSE an alert type all the time? Well this is JUST for you!
Introducing... auto_alert! Just init it like any other alert, and it will return the fitting alert right then and there*!
*"then and there" does not include any computer, end-user, developer, or any other type of tomfoolery.
(Hopefully now I'll never have to write documentation again >:) )
:param alert: Alert object or alert dict.
:param district: District object (from db_access)
:return: AlertEmbed object
"""
if isinstance(alert, dict):
alert_obj = Alert.from_dict(alert)
else:
alert_obj = alert
match alert_obj.category:
case 1:
return cls.missile_alert(alert_obj, district)
case _:
return cls.generic_alert(alert_obj, district)
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
class Notificator(commands.Cog): class Notificator(commands.Cog):
""" """