TelegramBot/modules/reminder.py

69 lines
2.1 KiB
Python

import logging
from datetime import datetime, timedelta, timezone
from libbot.pyrogram.classes import PyroClient
from classes.enums import GarbageType
from classes.location import Location
from classes.pyrouser import PyroUser
from modules.database import col_entries, col_users
from modules.utils import from_utc
logger = logging.getLogger(__name__)
async def remind(app: PyroClient) -> None:
utcnow = datetime.utcnow()
users = await col_users.find(
{"time_hour": utcnow.hour, "time_minute": utcnow.minute}
).to_list()
for user_db in users:
user = await PyroUser.from_dict(**user_db)
if not user.enabled or user.location is None:
continue
try:
location: Location = await app.get_location(user.location.id) # type: ignore
except ValueError:
continue
user_date = from_utc(
datetime(1970, 1, 1, user.time_hour, user.time_minute),
user.location.timezone.zone,
)
entries = await col_entries.find(
{
"locations": location.id,
"date": user_date.replace(hour=0, minute=0),
}
).to_list()
logger.info("Entries of %s for %s: %s", user.id, user_date, entries)
for entry in entries:
try:
garbage_type = app._(
str(GarbageType(entry["garbage_type"]).value),
"garbage_types",
locale=user.locale,
)
garbage_date = datetime.strftime(
entry["date"], app._("date", "formats", locale=user.locale)
)
await app.send_message(
user.id,
app._("reminder", "messages", locale=user.locale).format(
type=garbage_type, date=garbage_date
),
)
except Exception as exc:
logger.warning(
"Could not send a notification to %s due to %s", user.id, exc
)
continue