database.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import json
  2. import uuid
  3. from typing import Dict, List, Optional, Any
  4. from game_logic import SetGame
  5. users_db = {}
  6. games_db = {}
  7. active_connections = {}
  8. def get_next_game_id() -> int:
  9. if not games_db:
  10. return 0
  11. return max(games_db.keys()) + 1
  12. def get_user_by_nickname(nickname: str) -> Optional[Dict]:
  13. for user in users_db.values():
  14. if user["nickname"] == nickname:
  15. return user
  16. return None
  17. def get_user_by_token(token: str) -> Optional[Dict]:
  18. return users_db.get(token)
  19. def create_user(nickname: str, password: str, token: str) -> Dict:
  20. from auth import get_password_hash
  21. user_data = {
  22. "nickname": nickname,
  23. "password_hash": get_password_hash(password),
  24. "token": token,
  25. "created_at": "2024-01-01",
  26. "score": 0
  27. }
  28. users_db[token] = user_data
  29. return user_data
  30. def create_game(creator_token: str) -> int:
  31. game_id = get_next_game_id()
  32. game_data = {
  33. "id": game_id,
  34. "game": SetGame(),
  35. "players": {
  36. creator_token: {
  37. "nickname": users_db[creator_token]["nickname"],
  38. "score": 0,
  39. "joined_at": "2024-01-01"
  40. }
  41. },
  42. "created_at": "2024-01-01",
  43. "status": "waiting",
  44. "max_players": 4
  45. }
  46. games_db[game_id] = game_data
  47. return game_id
  48. def get_game(game_id: int) -> Optional[Dict]:
  49. return games_db.get(game_id)
  50. def get_all_games() -> Dict[int, Dict]:
  51. return games_db
  52. def update_game(game_id: int, game_data: Dict):
  53. if game_id in games_db:
  54. games_db[game_id] = game_data
  55. def add_player_to_game(game_id: int, token: str, nickname: str) -> bool:
  56. if game_id not in games_db:
  57. return False
  58. game = games_db[game_id]
  59. if len(game["players"]) >= game["max_players"]:
  60. return False
  61. if token in game["players"]:
  62. return False
  63. game["players"][token] = {
  64. "nickname": nickname,
  65. "score": 0,
  66. "joined_at": "2024-01-01"
  67. }
  68. if len(game["players"]) >= 2:
  69. game["status"] = "ongoing"
  70. return True
  71. def remove_player_from_game(game_id: int, token: str):
  72. if game_id in games_db and token in games_db[game_id]["players"]:
  73. del games_db[game_id]["players"][token]
  74. if not games_db[game_id]["players"]:
  75. del games_db[game_id]
  76. else:
  77. if len(games_db[game_id]["players"]) == 1:
  78. games_db[game_id]["status"] = "finished"
  79. async def broadcast_game_state(game_id: int):
  80. from main import manager
  81. if game_id not in games_db:
  82. return
  83. game = games_db[game_id]
  84. for token, player_data in game["players"].items():
  85. field_cards = game["game"].get_field()
  86. status = "ongoing" if not game["game"].is_game_over() else "ended"
  87. score = player_data.get("score", 0)
  88. message = {
  89. "type": "game_update",
  90. "gameId": game_id,
  91. "cards": field_cards,
  92. "status": status,
  93. "score": score,
  94. "players": [
  95. {"name": p["nickname"], "score": p.get("score", 0)}
  96. for p in game["players"].values()
  97. ]
  98. }
  99. await manager.send_personal_message(token, message)
  100. await manager.broadcast_to_game(game_id, {
  101. "type": "game_notification",
  102. "gameId": game_id,
  103. "players_count": len(game["players"]),
  104. "status": status
  105. })
  106. def get_game_by_player_token(token: str) -> Optional[Dict]:
  107. for game in games_db.values():
  108. if token in game["players"]:
  109. return game
  110. return None