import secrets import time class TencentIMPairing: def __init__(self, code_ttl: int = 600): self._codes: dict[str, tuple[str, float]] = {} self._generated: dict[str, float] = {} self._ttl = code_ttl self._rate_limit = 300 def generate(self, user_id: str) -> str | None: now = time.time() last_gen = self._generated.get(user_id, 0) if now - last_gen < self._rate_limit: return None code = secrets.token_hex(3).upper() self._codes[code] = (user_id, now) self._generated[user_id] = now self._cleanup() return code def verify(self, user_id: str, code: str) -> bool: entry = self._codes.get(code) if entry is None: return False stored_user_id, created_at = entry if time.time() - created_at > self._ttl: del self._codes[code] return False if stored_user_id == user_id: del self._codes[code] return True return False def _cleanup(self): now = time.time() expired = [k for k, (_, t) in self._codes.items() if now - t > self._ttl] for k in expired: del self._codes[k]