37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
import time
|
|
|
|
from userbot.modules.capture.repository import CHANNEL_ID_THRESHOLD
|
|
|
|
PENDING_DELETE_SECONDS = 120.0
|
|
PENDING_DELETE_LIMIT = 10_000
|
|
|
|
DeleteKey = tuple[int | None, int]
|
|
|
|
|
|
def _key(chat_id: int | None, message_id: int) -> DeleteKey:
|
|
if chat_id is None or chat_id > CHANNEL_ID_THRESHOLD:
|
|
return None, message_id
|
|
return chat_id, message_id
|
|
|
|
|
|
class PendingDeletes:
|
|
def __init__(self) -> None:
|
|
self._expires: dict[DeleteKey, float] = {}
|
|
|
|
def remember(self, chat_id: int | None, message_ids: list[int]) -> None:
|
|
now = time.monotonic()
|
|
while self._expires:
|
|
oldest = next(iter(self._expires))
|
|
fresh = self._expires[oldest] > now
|
|
if fresh and len(self._expires) < PENDING_DELETE_LIMIT:
|
|
break
|
|
del self._expires[oldest]
|
|
for message_id in message_ids:
|
|
key = _key(chat_id, message_id)
|
|
self._expires.pop(key, None)
|
|
self._expires[key] = now + PENDING_DELETE_SECONDS
|
|
|
|
def take(self, chat_id: int, message_id: int) -> bool:
|
|
expires = self._expires.pop(_key(chat_id, message_id), None)
|
|
return expires is not None and expires > time.monotonic()
|