import json from typing import Literal import asyncpg BG_EVENTS_CHANNEL = "bg_events" MESSAGE_IDS_PER_EVENT = 500 EventKind = Literal["message", "edit", "delete", "reaction", "presence", "receipt"] async def notify_bg_event( # noqa: PLR0913 pool: asyncpg.Pool, kind: EventKind, account_id: int, *, chat_id: int | None = None, message_id: int | None = None, message_ids: list[int] | None = None, ) -> None: payload: dict[str, object] = {"kind": kind, "account_id": account_id} if chat_id is not None: payload["chat_id"] = chat_id if message_id is not None: payload["message_id"] = message_id if message_ids is None: await _notify(pool, payload) return for start in range(0, len(message_ids), MESSAGE_IDS_PER_EVENT): chunk = message_ids[start : start + MESSAGE_IDS_PER_EVENT] await _notify(pool, {**payload, "message_ids": chunk}) async def _notify(pool: asyncpg.Pool, payload: dict[str, object]) -> None: await pool.execute( "SELECT pg_notify($1, $2)", BG_EVENTS_CHANNEL, json.dumps(payload) )