Files
minesweeper-py/back/create_room.py
Fasterino 4aaa436079 init
2025-10-20 21:08:52 +03:00

109 lines
3.3 KiB
Python

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)