from datetime import datetime
from typing import Dict, Optional
from aiogram import html
from app.models.admin import Admin
from app.models.notification import Notification, UserNotification
from app.models.user import UserResponse
from app.utils.system import readable_size
def create_text(notif: Notification) -> str:
data = prepare_data(notif)
A = UserNotification.Action
texts: Dict[UserNotification.Action, str] = {
A.user_created: "š #Created\nāāāāāāāāā\nUsername : {username}\nTraffic Limit : {data_limit}\nExpire Date : {expire_date}\nServices : {services}\nāāāāāāāāā\nBelongs To : {owner_username}\nBy : #{by}",
A.user_updated: "āļø #Modified\nāāāāāāāāā\nUsername : {username}\nTraffic Limit : {data_limit}\nExpire Date : {expire_date}\nServices : {services}\nāāāāāāāāā\nBelongs To : {owner_username}\nBy : #{by}",
A.user_activated: "ā
#Activated\nāāāāāāāāā\nUsername : {username}\nBelongs To : {owner_username}",
A.user_deactivated: "ā #Deactivated\nāāāāāāāāā\nUsername : {username}\nBelongs To : {owner_username}",
A.user_deleted: "š #Deleted\nāāāāāāāāā\nUsername : {username}\nāāāāāāāāā\nBelongs To : {owner_username}\nBy : #{by}",
A.user_enabled: "āļø #Enabled\nāāāāāāāāā\nUsername : {username}\nāāāāāāāāā\nBelongs To : {owner_username}\nBy : #{by}",
A.user_disabled: "š #Disabled\nāāāāāāāāā\nUsername : {username}\nāāāāāāāāā\nBelongs To : {owner_username}\nBy : #{by}",
A.data_usage_reset: "š #Reset\nāāāāāāāāā\nUsername : {username}\nāāāāāāāāā\nBy : #{by}",
A.subscription_revoked: "š #Revoked\nāāāāāāāāā\nUsername : {username}\nāāāāāāāāā\nBy : #{by}",
A.reached_usage_percent: "ā ļø#DataLimitWarning\nāāāāāāāāā\nUsername : {username}\nUsed Percent : {usage_percent}\nRemaining Traffic : {remaining_traffic}\nāāāāāāāāā\nBelongs To : {owner_username}",
A.reached_days_left: "ā ļø#ExpirationWarning\nāāāāāāāāā\nUsername : {username}\nRemaining Days : {remaining_days}\nāāāāāāāāā\nBelongs To : {owner_username}",
}
if notif.action == A.user_deactivated and not notif.by:
if notif.user.expired:
texts[A.user_deactivated] = (
"š #Expired\nāāāāāāāāā\nUsername : {username}\nBelongs To : {owner_username}"
)
elif notif.user.data_limit_reached:
texts[A.user_deactivated] = (
"šŖ« #Limited\nāāāāāāāāā\nUsername : {username}\nBelongs To : {owner_username}"
)
text = texts.get(notif.action)
formatted_message = text.format_map(data)
return formatted_message
def prepare_data(notif: Notification) -> dict:
user = UserResponse.model_validate(notif.user)
by: Optional[Admin] = (
Admin.model_validate(notif.by)
if hasattr(notif, "by") and notif.by
else None
)
data = {
"username": html.quote(user.username),
"data_limit": (
readable_size(user.data_limit) if user.data_limit else "Unlimited"
),
"remaining_traffic": (
readable_size(max(user.data_limit - user.used_traffic, 0))
if user.data_limit
else "Unlimited"
),
"usage_percent": (
f"{round(min((user.used_traffic / user.data_limit) * 100, 100),2)}%"
if isinstance(user.data_limit, int) and user.data_limit > 0
else "0%"
),
"expire_date": (
user.expire_date.strftime("%H:%M:%S %Y-%m-%d")
if user.expire_date
else "Never"
),
"remaining_days": (
(user.expire_date - datetime.now()).days
if user.expire_date
else "Never"
),
"services": user.service_ids if user.service_ids else "",
"owner_username": user.owner_username,
"by": html.quote(by.username) if by else None,
}
return data