from random import randint from .socket import Socket from .game import game_router async def create_room_router(server: Socket, socket: Socket): async def check_nickname(nickname: str) -> str | None: nickname = nickname.strip() if len(nickname) < 4: await socket.emit("room-error", "Никнейм должен быть больше 4 букв!") return return nickname async def check_width(width: str) -> int | None: width = width.strip() if not width.isnumeric(): await socket.emit("room-error", "Ширина должна быть числом!") return width_i = int(width) if width_i < 5 or width_i > 25: await socket.emit("room-error", "Ширина может быть числом от 5 до 25!") return return width_i async def check_height(height: str) -> int | None: height = height.strip() if not height.isnumeric(): await socket.emit("room-error", "Высота должна быть числом!") return height_i = int(height) if height_i < 5 or height_i > 15: await socket.emit("room-error", "Высота может быть числом от 5 до 15!") return return height_i async def check_bombs(bombs: str, width: int, height: int) -> int | None: bombs = bombs.strip() if not bombs.isnumeric(): await socket.emit("room-error", "Кол-во бомб должно быть числом!") return bombs_i = int(bombs) bombs_max = (width * height * 2) // 5 if bombs_i < 5 or bombs_i > bombs_max: await socket.emit( "room-error", f"Кол-во бомб может быть от 5 до {bombs_max}!" ) return return bombs_i async def check_room(room_id: str) -> str | None: room_id = room_id.strip() if not room_id.isnumeric() or len(room_id) != 6: await socket.emit("room-error", "Код должен быть из 6 цифр!") return if not server.room_exists(room_id): await socket.emit("room-error", "Такой комнаты не существует!") return return room_id @socket.on("create-room") async def create_room(_nickname: str, _width: str, _height: str, _bombs: str): nickname = await check_nickname(_nickname) if nickname is None: return width = await check_width(_width) if width is None: return height = await check_height(_height) if height is None: return bombs = await check_bombs(_bombs, width, height) if bombs is None: return room_id = str(randint(100000, 999999)) room = await socket.join(room_id) await game_router(server, socket, room, nickname, width, height, bombs) @socket.on("join-room") async def join_room(_nickname: str, _room_id: str): nickname = await check_nickname(_nickname) if nickname is None: return room_id = await check_room(_room_id) if room_id is None: return room = await socket.join(room_id) await game_router(server, socket, room, nickname)