28 lines
808 B
Python
28 lines
808 B
Python
"""Telegram ↔ VoIdea account linking."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import secrets
|
|
from typing import Any
|
|
|
|
# In-memory store for link tokens (in production: Redis with TTL)
|
|
_link_tokens: dict[str, int] = {} # token → user_id
|
|
|
|
|
|
def create_link_token(user_id: int) -> str:
|
|
"""Generate a one-time token for linking Telegram to VoIdea account."""
|
|
token = secrets.token_urlsafe(32)
|
|
_link_tokens[token] = user_id
|
|
return token
|
|
|
|
|
|
def consume_link_token(token: str) -> int | None:
|
|
"""Validate and consume a link token. Returns user_id or None."""
|
|
user_id = _link_tokens.pop(token, None)
|
|
return user_id
|
|
|
|
|
|
def get_bot_link_url(base_url: str, token: str) -> str:
|
|
"""Return the URL for the user to confirm account linking."""
|
|
return f"{base_url}/bot/link?token={token}"
|