2023-10-30 11:43:37 +02:00
|
|
|
import datetime
|
|
|
|
import discord
|
|
|
|
|
|
|
|
import db_access
|
|
|
|
|
|
|
|
from db_access import AreaDistrict
|
|
|
|
|
2023-10-30 11:40:05 +02:00
|
|
|
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'))
|
2023-10-30 11:43:37 +02:00
|
|
|
|
2023-10-30 15:58:20 +02:00
|
|
|
|
2023-10-30 11:43:37 +02:00
|
|
|
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='')
|
|
|
|
|
2024-11-06 19:20:26 +02:00
|
|
|
self.embed.add_field(name='זמן התראה', value=datetime.datetime.now().strftime("%H:%M:%S\n%d/%m/%Y"), inline=False)
|
2023-10-30 11:43:37 +02:00
|
|
|
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)
|
|
|
|
|