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