mirror of
https://github.com/GaMeNu/HFCNotificator.git
synced 2024-11-16 15:24:51 +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
|
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):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user