mirror of
https://github.com/GaMeNu/HFCNotificator.git
synced 2024-11-16 07:14:52 +02:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
d57469eb11
145
alert_maker.py
Normal file
145
alert_maker.py
Normal 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)
|
||||
|
@ -13,6 +13,7 @@ import db_access
|
||||
import errlogging
|
||||
from db_access import *
|
||||
from markdown import md
|
||||
from alert_maker import AlertEmbed
|
||||
|
||||
load_dotenv()
|
||||
AUTHOR_ID = int(os.getenv('AUTHOR_ID'))
|
||||
@ -71,147 +72,6 @@ class AlertReqs:
|
||||
ret_dict = None
|
||||
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
|
||||
class Notificator(commands.Cog):
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user