RoomController.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using MafiaTelegramBot.Game;
  5. using MafiaTelegramBot.Game.GameRooms;
  6. using MafiaTelegramBot.Resources;
  7. namespace MafiaTelegramBot.Controllers
  8. {
  9. public static class RoomController
  10. {
  11. private static readonly Dictionary<string, GameRoom> OpenedGames = new();
  12. public static async Task<ResultCode> CreateNewGame(Player creator, string roomName, bool isExtended, bool isPrivate, bool isRanking)
  13. {
  14. return await Task.Run(() =>
  15. {
  16. var roomKey = RoomEncrypter.GetCode(roomName);
  17. if (OpenedGames.ContainsKey(roomKey)) return ResultCode.GameAlreadyExists;
  18. if (!creator.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
  19. GameRoom room = isExtended
  20. ? new ExtendedGameRoom {Owner = creator, RoomName = roomName, IsPrivate = isPrivate, IsRanking = isRanking}
  21. : new NormalGameRoom {Owner = creator, RoomName = roomName, IsPrivate = isPrivate, IsRanking = isRanking};
  22. OpenedGames.Add(roomKey, room);
  23. room.Players.Add(creator.Id, creator);
  24. room.SetTimer();
  25. return ResultCode.CodeOk;
  26. });
  27. }
  28. public static async Task<ResultCode> ConnectToGame(Player player, string roomKey)
  29. {
  30. return await Task.Run(async () =>
  31. {
  32. if (!OpenedGames.ContainsKey(roomKey)) return ResultCode.RoomDoesNotExist;
  33. var roomName = RoomEncrypter.GetName(roomKey);
  34. if (OpenedGames[roomKey].IsRunning) return ResultCode.GameAlreadyRunning;
  35. if (OpenedGames[roomKey].IsFilled()) return ResultCode.RoomIsFilled;
  36. if (!player.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
  37. OpenedGames[roomKey].Players.Add(player.Id, player);
  38. if (OpenedGames[roomKey].Players.Count > Constants.MEMORY_CLEANER_PLAYERS_COUNT) OpenedGames[roomKey].StopTimer();
  39. await OpenedGames[roomKey].PlayersMessageChannel.SendExcept(player.Id, $"{player.NickName} {strings.connected_to_game}");
  40. OpenedGames[roomKey].PlayersMessageChannel.AddPerson(player.ChatId);
  41. return ResultCode.CodeOk;
  42. });
  43. }
  44. public static List<Player> GetPlayers(string roomKey)
  45. {
  46. return OpenedGames[roomKey].Players.Values.ToList();
  47. }
  48. public static async Task<ResultCode> LeaveFromGame(Player player)
  49. {
  50. return await Task.Run(async () =>
  51. {
  52. var roomName = player.GetRoomName();
  53. var roomKey = RoomEncrypter.GetCode(roomName);
  54. if (!player.RemoveGame()) return ResultCode.UserNotInGame;
  55. await OpenedGames[roomKey].Leave(player);
  56. if (!OpenedGames[roomKey].IsRunning &&
  57. OpenedGames[roomKey].Players.Count <= Constants.MEMORY_CLEANER_INTERVAL)
  58. OpenedGames[roomKey].StartTimer();
  59. if (OpenedGames[roomKey].Players.Count >= 0) return ResultCode.CodeOk;
  60. RoomEncrypter.RemoveCode(roomName);
  61. OpenedGames.Remove(roomKey);
  62. return ResultCode.CodeOk;
  63. });
  64. }
  65. public static async Task DissolveRoom(string roomKey)
  66. {
  67. await Task.Run(async () =>
  68. {
  69. if (OpenedGames.ContainsKey(roomKey))
  70. {
  71. foreach (var player in OpenedGames[roomKey].Players.Values)
  72. {
  73. await OpenedGames[roomKey].PlayersMessageChannel.SendTo(player.Id, strings.room_dissolved,
  74. player.IsAdmin ? Keyboard.AdminMainMenu : Keyboard.MainMenu);
  75. player.RemoveGame();
  76. player.ResetState();
  77. }
  78. RoomEncrypter.RemoveCode(OpenedGames[roomKey].RoomName);
  79. OpenedGames[roomKey].DeleteTimer();
  80. OpenedGames.Remove(roomKey);
  81. }
  82. });
  83. }
  84. public static async Task<List<GameRoom>> GetPublicNotRankedRooms()
  85. {
  86. return await Task.Run(() =>
  87. {
  88. async Task<int> Comparison(GameRoom room, GameRoom room2)
  89. {
  90. var first = await room.GetCapacity() / (double) await room.GetMaximum();
  91. var second = await room2.GetCapacity() / (double) await room2.GetMaximum();
  92. return second > first ? 1 : 0;
  93. }
  94. var rooms = OpenedGames.Values
  95. .Where(room => !room.IsPrivate && !room.IsFilled() && !room.IsRunning && !room.IsRanking).
  96. ToList();
  97. rooms.Sort((room, room2) => Comparison(room, room2).Result);
  98. return rooms;
  99. });
  100. }
  101. public static async Task<List<GameRoom>> GetPublicRankedRooms(char rank)
  102. {
  103. return await Task.Run(() =>
  104. {
  105. async Task<int> Comparison(GameRoom room, GameRoom room2)
  106. {
  107. var first = await room.GetCapacity() / (double) await room.GetMaximum();
  108. var second = await room2.GetCapacity() / (double) await room2.GetMaximum();
  109. return second > first ? 1 : 0;
  110. }
  111. bool IsNeighborRank(char roomRank, char playerRank)
  112. {
  113. return roomRank - playerRank > -2 && roomRank - playerRank < 2;
  114. }
  115. var rooms = OpenedGames.Values
  116. .Where(room => !room.IsPrivate && !room.IsFilled() && !room.IsRunning
  117. && room.IsRanking && IsNeighborRank(room.GetRoomRank().Result, rank)).
  118. ToList();
  119. rooms.Sort((room, room2) => Comparison(room, room2).Result);
  120. return rooms;
  121. });
  122. }
  123. public static GameRoom GetRoom(string roomKey)
  124. {
  125. return OpenedGames[roomKey];
  126. }
  127. }
  128. }