Source code for spotted.handlers.job_handlers

"""Scheduled jobs of the bot"""

from base64 import b64decode
from binascii import Error as BinasciiError
from datetime import datetime, timedelta, timezone

from cryptography.fernet import Fernet
from telegram.error import BadRequest, Forbidden
from telegram.ext import CallbackContext

from spotted.data import Config, PendingPost
from spotted.debug import logger
from spotted.utils import EventInfo


[docs] async def clean_pending_job(context: CallbackContext): """Job called each day at 05:00 utc. Automatically rejects all pending posts that are older than the chosen amount of hours Args: context: context passed by the jobqueue """ info = EventInfo.from_job(context) admin_group_id = Config.post_get("admin_group_id") before_time = datetime.now(tz=timezone.utc) - timedelta(hours=Config.post_get("remove_after_h")) pending_posts = PendingPost.get_all(admin_group_id=admin_group_id, before=before_time) # For each pending post older than before_time removed = 0 for pending_post in pending_posts: message_id = pending_post.g_message_id try: # deleting the message associated with the pending post to remote await info.bot.delete_message(chat_id=admin_group_id, message_id=message_id) removed += 1 try: # sending a notification to the user await info.bot.send_message( chat_id=pending_post.user_id, text="Gli admin erano sicuramente molto impegnati e non sono riusciti a valutare lo spot in tempo", ) except (BadRequest, Forbidden) as ex: logger.warning("Notifying the user on /clean_pending: %s", ex) except BadRequest as ex: logger.error("Deleting old pending message: %s", ex) finally: # delete the data associated with the pending post pending_post.delete_post() await info.bot.send_message( chat_id=admin_group_id, text=f"Sono stati eliminati {removed} messaggi rimasti in sospeso" )
[docs] async def db_backup_job(context: CallbackContext): """Job called each day at 05:00 utc. Automatically upload and send last version of db for backup Args: context: context passed by the jobqueue """ path = Config.debug_get("db_file") admin_group_id = Config.post_get("admin_group_id") with open(path, "rb") as database_file: try: if Config.debug_get("crypto_key"): key = b64decode(Config.debug_get("crypto_key")) cipher = Fernet(key) db_backup = cipher.encrypt(database_file.read()) else: db_backup = database_file.read() await context.bot.send_document( chat_id=admin_group_id, document=db_backup, filename="spotted.backup.sqlite3", caption="✅ Backup effettuato con successo", ) except BinasciiError as ex: await context.bot.send_message(chat_id=admin_group_id, text=f"✖️ Impossibile effettuare il backup\n\n{ex}")