"""Билет входа в чат (Python 3, без зависимостей).

Ваш сайт сам подписывает билет общим секретом (APP_TICKET_SECRET из secrets.php чата) и отправляет
пользователя по ссылке https://chat.вашсайт.ru/ticket_login.php?ticket=...
Секрет хранится только на сервере сайта.
"""
import base64
import hashlib
import hmac
import json
import time
from urllib.parse import quote


def _b64(raw: bytes) -> str:
    return base64.urlsafe_b64encode(raw).rstrip(b"=").decode()


def make_ticket(secret: str, user_id: int, name: str, login: str = "", email: str = "",
                avatar_url: str = "", ttl: int = 120) -> str:
    claims = {
        "v": 1,                      # версия формата, всегда 1
        "aud": "chat",               # для кого билет, всегда "chat"
        "sub": int(user_id),         # ЦЕЛОЕ число > 0: постоянный id пользователя на вашем сайте
        "exp": int(time.time()) + ttl,  # срок жизни; не больше пары минут
        "name": name,                # имя в чате
        "login": login,
        "email": email or None,
        "avatar_url": avatar_url or None,
    }
    payload = _b64(json.dumps(claims, ensure_ascii=False, separators=(",", ":")).encode())
    sig = _b64(hmac.new(secret.encode(), payload.encode(), hashlib.sha256).digest())
    return f"{payload}.{sig}"


def chat_link(chat_host: str, secret: str, user_id: int, name: str, room: str = "/") -> str:
    """Готовая ссылка «Открыть чат» для залогиненного на сайте пользователя."""
    ticket = make_ticket(secret, user_id, name)
    return f"https://{chat_host}/ticket_login.php?ticket={quote(ticket)}&to={quote(room)}"


if __name__ == "__main__":
    print(chat_link("chat.example.ru", "СЕКРЕТ_ИЗ_secrets.php", 42, "Иван Петров"))
