fix(userbot): a deletion that arrives before its message is applied once the message is stored
This commit is contained in:
1 parent
516b8e307f
commit
f32b772ddc
5 files changed
+56
No files matched your search
@@ -0,0 +1,36 @@
|
||||
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()
|
||||
Reference in new issue
Block a user