from psycopg2.errors import UniqueViolation from sqlalchemy.exc import IntegrityError from gatovid.exts import db from gatovid.models import ( InvalidModelException, PurchasableType, Purchase, Stats, TokenBlacklist, User, ) from gatovid.util import get_logger, msg_err, msg_ok, route_get_or_post mod = Blueprint("api_data", __name__, url_prefix="/data") logger = get_logger("api.data.__init__") def _revoke_token() -> bool: """ Revoca un token, devolviendo verdadero en caso de que haya sido una operación exitosa, o falso en caso contrario. """ jti = get_jwt()["jti"] blacklist_token = TokenBlacklist(token=jti) try: # Insertar el token baneado para el futuro db.session.add(blacklist_token) db.session.commit() return True
Desconexión por error o botón de reanudar más tarde pulsado: - Pública: no se puede volver a jugar. - Privada: se puede volver a la partida y no habrá pasado nada porque en partidas privadas no se eliminan jugadores AFK. """ import time from typing import Dict, Optional from gatovid.create_db import GENERIC_USERS_NAME from gatovid.models import BOT_PICTURE_ID from gatovid.util import get_logger from .base import WsTestClient logger = get_logger(__name__) class ConnTest(WsTestClient): def active_wait_turns( self, clients, total_skips: int, turn_timeout: float, starting_turn: Optional[int] = None, receiver: Optional[object] = None, ) -> (int, Dict): """ Espera activa de un turno para evitar problemas de sincronización con `time.sleep(X)`.
from flask_jwt_extended import get_jwt_identity, verify_jwt_in_request from flask_socketio import emit, join_room, leave_room from gatovid.api.game.match import ( MAX_MATCH_USERS, MM, GameLogicException, PrivateMatch, PublicMatch, ) from gatovid.exts import db, socket from gatovid.game.actions import Discard, Pass, PlayCard from gatovid.models import User from gatovid.util import get_logger logger = get_logger("api.game.__init__") MAX_CHAT_MSG_LEN = 240 def _requires_game(started=False): """ Decorador para comprobar si el usuario está en una partida. Si started es True, se comprueba también que la partida ha empezado. """ def deco(f): @functools.wraps(f) def wrapper(*args, **kwargs): game = session.get("game") if not game: return {"error": "No estás en una partida"}