async def connect(sid, environ): log(f'connect {sid}') clients[sid] = "anon " + randomString() while clients[sid] in names: clients[sid] = "anon " + randomString() names.add(clients[sid]) players_games[sid] = None
async def my_name_is(sid, data): if data["name"] in names: await sio.emit("failure", { "nature": "name refused", "reason": "name already taken" }, room=sid) # TODO return names.add(data["name"]) names.remove(clients[sid]) clients[sid] = data["name"] log(f'{sid} is {data["name"]}')
async def board_chosen(sid, data): game_name = players_games[sid] if masters[game_name] != sid: return category = data["cat"] element = data["el"] boards[game_name] = Zc.boards[category][element] cardsets[game_name] = CARDSET joinable[game_name] = True join_game(sid, game_name) await sio.emit("game created", {"game_name": game_name}, room=game_name) log(f'game \"{game_name}\" successfuly configured by {clients[sid]}')
async def abort_game(sid, game_name): if not in_dict(masters, game_name): return log(f'game \"{game_name}\" ended by {clients[sid]}') await sio.emit("game ended", data=game_name, room=game_name) # TODO for client in players_games: if players_games[client] == game_name and masters[game_name] != client: await leave_game(client) if in_dict(gamestates, game_name): del gamestates[game_name] if in_dict(cardsets, game_name): del cardsets[game_name] if in_dict(rules, game_name): del rules[game_name] if in_dict(boards, game_name): del boards[game_name] if in_dict(rules, game_name): del rules[game_name] if in_dict(masters, game_name): del masters[game_name] if in_dict(joinable, game_name): del joinable[game_name] games_names.remove(game_name)
async def leave_game(sid): if players_games[sid] == None: return game_name = players_games[sid] if not in_dict(joinable, game_name): return if in_dict(players, game_name): for i in range(0, len(players[game_name])): p_sid = players[game_name][i] if p_sid == sid: players[game_name][i] = None sio.leave_room(sid, game_name) log(f'game \"{game_name}\" left by {clients[sid]}') await sio.emit("player left", data=clients[sid], room=game_name) # TODO if masters[players_games[sid]] == sid: await abort_game(sid, players_games[sid]) players_games[sid] = None
async def join_game(sid, data): game_name = data if not in_dict(joinable, game_name): await sio.emit("failure", { "nature": "can't join game \"" + game_name + "\"", "reason": "game doesn't exist" }, room=sid) # TODO return if not joinable[game_name]: await sio.emit("failure", { "nature": "can't join game \"" + game_name + "\"", "reason": "game is not ready yet" }, room=sid) # TODO return joined = False for i in range(0, players[game_name]): if players[game_name][i] == None: players[game_name][i] = sid joined = True if joined == False: await sio.emit("failure", { "nature": "can't join game \"" + game_name + "\"", "reason": "game is full" }, room=sid) # TODO return await leave_game(sid) players_games[sid] = game_name sio.enter_room(sid, game_name) await sio.emit("player joined", {"name": clients[sid]}, room=game_name) # TODO log(f'game \"{game_name}\" joined by {clients[sid]}')
async def disconnect(sid): await leave_game(sid) names.remove(clients[sid]) log(f'{clients[sid]} just disconnected ') del clients[sid] del players_games[sid]