"""Runs due "delete for everyone" jobs for the bot's own messages.""" from __future__ import annotations import asyncio import logging from collections.abc import Awaitable, Callable log = logging.getLogger("sweeper") async def run_deletes(db, delete_for_everyone: Callable[[str, str], Awaitable[None]], is_connected: Callable[[], bool], max_rows: int = 20) -> int: """Deletes due messages. Returns how many were deleted. Waits while offline.""" if not is_connected(): return 0 deleted = 0 for row in await db.due_deletes(max_rows): try: await delete_for_everyone(row["jid"], row["msg_id"]) await db.remove_delete(row["id"]) deleted += 1 except Exception as e: # keep going with the other rows log.error("Auto-delete failed for %s: %s", row["msg_id"], e) await db.fail_delete(row["id"], str(e)) return deleted async def run_forever(db, delete_for_everyone, is_connected, interval: float = 60.0) -> None: while True: try: await run_deletes(db, delete_for_everyone, is_connected) except Exception as e: log.error("Auto-delete pass failed: %s", e) await asyncio.sleep(interval)