27 lines
662 B
Python
27 lines
662 B
Python
|
|
import time
|
||
|
|
|
||
|
|
DEDUP_TTL = 30.0
|
||
|
|
MAX_DEDUP_ENTRIES = 200
|
||
|
|
|
||
|
|
_dedup_cache: dict[int, float] = {}
|
||
|
|
|
||
|
|
|
||
|
|
def is_duplicate(message_index: int) -> bool:
|
||
|
|
now = time.monotonic()
|
||
|
|
if message_index in _dedup_cache:
|
||
|
|
if now - _dedup_cache[message_index] < DEDUP_TTL:
|
||
|
|
return True
|
||
|
|
_dedup_cache[message_index] = now
|
||
|
|
if len(_dedup_cache) > MAX_DEDUP_ENTRIES:
|
||
|
|
stale = [k for k, v in _dedup_cache.items() if now - v > DEDUP_TTL]
|
||
|
|
for k in stale:
|
||
|
|
del _dedup_cache[k]
|
||
|
|
return False
|
||
|
|
|
||
|
|
|
||
|
|
def mark_seen(message_index: int) -> None:
|
||
|
|
_dedup_cache[message_index] = time.monotonic()
|
||
|
|
|
||
|
|
|
||
|
|
def reset() -> None:
|
||
|
|
_dedup_cache.clear()
|