RoomController.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using MafiaTelegramBot.DataBase.EntityDao;
  5. using MafiaTelegramBot.Game;
  6. using MafiaTelegramBot.Game.GameRoles;
  7. using MafiaTelegramBot.Game.GameRooms;
  8. using MafiaTelegramBot.Models;
  9. using MafiaTelegramBot.Resources;
  10. namespace MafiaTelegramBot.Controllers
  11. {
  12. public static class RoomController
  13. {
  14. private static readonly Dictionary<string, GameRoom> OpenedGames = new();
  15. public static async Task<ResultCode> CreateNewGame(Player creator, string roomName, bool isExtended, bool isPrivate)
  16. {
  17. return await Task.Run( () =>
  18. {
  19. var roomKey = RoomEncrypter.GetCode(roomName);
  20. if (OpenedGames.ContainsKey(roomKey)) return ResultCode.GameAlreadyExists;
  21. if (!creator.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
  22. GameRoom room = isExtended
  23. ? new ExtendedGameRoom {Owner = creator, RoomName = roomName, IsPrivate = isPrivate}
  24. : new NormalGameRoom {Owner = creator, RoomName = roomName, IsPrivate = isPrivate};
  25. OpenedGames.Add(roomKey, room);
  26. room.Players.Add(creator.Id, creator);
  27. room.SetTimer();
  28. UserDao.GetPlayerById(creator.Id).Result.StopTimer();
  29. return ResultCode.CodeOk;
  30. });
  31. }
  32. public static async Task<ResultCode> ConnectToGame(Player player, string roomKey)
  33. {
  34. return await Task.Run(async () =>
  35. {
  36. if (!OpenedGames.ContainsKey(roomKey)) return ResultCode.RoomDoesNotExist;
  37. var roomName = RoomEncrypter.GetName(roomKey);
  38. if (OpenedGames[roomKey].IsRunning) return ResultCode.GameAlreadyRunning;
  39. if (OpenedGames[roomKey].IsFilled()) return ResultCode.RoomIsFilled;
  40. if (!player.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
  41. OpenedGames[roomKey].Players.Add(player.Id, player);
  42. if (OpenedGames[roomKey].Players.Count > Constants.PLAYER_DISABLE_TIMER)
  43. OpenedGames[roomKey].StopTimer();
  44. UserDao.GetPlayerById(player.Id).Result.StopTimer();
  45. await OpenedGames[roomKey].PlayersCh.SendExcept(player.Id, $"{player.NickName} {strings.connected_to_game}");
  46. return ResultCode.CodeOk;
  47. });
  48. }
  49. public static List<Player> GetPlayers(string roomKey)
  50. {
  51. return OpenedGames[roomKey].Players.Values.ToList();
  52. }
  53. public static async Task<ResultCode> LeaveFromGame(Player player)
  54. {
  55. return await Task.Run(async () =>
  56. {
  57. var roomName = player.GetRoomName();
  58. var roomKey = RoomEncrypter.GetCode(roomName);
  59. if (!await player.RemoveGame()) return ResultCode.UserNotInGame;
  60. await OpenedGames[roomKey].Leave(player);
  61. if (!OpenedGames[roomKey].IsRunning &&
  62. OpenedGames[roomKey].Players.Count <= Constants.PLAYER_DISABLE_TIMER)
  63. await OpenedGames[roomKey].StartTimer();
  64. await UserDao.GetPlayerById(player.Id).Result.StartTimer();
  65. if (OpenedGames[roomKey].Players.Count >= 0) return ResultCode.CodeOk;
  66. RoomEncrypter.RemoveCode(roomName);
  67. OpenedGames.Remove(roomKey);
  68. return ResultCode.CodeOk;
  69. });
  70. }
  71. public static async Task DissolveRoom(string roomKey)
  72. {
  73. await Task.Run(async () =>
  74. {
  75. if (OpenedGames.ContainsKey(roomKey))
  76. {
  77. await OpenedGames[roomKey].PlayersCh.Send(strings.room_dissolved, Keyboard.MainMenu);
  78. foreach (var player in OpenedGames[roomKey].Players.Values) await player.RemoveGame();
  79. RoomEncrypter.RemoveCode(OpenedGames[roomKey].RoomName);
  80. OpenedGames[roomKey].DeleteTimer();
  81. OpenedGames.Remove(roomKey);
  82. }
  83. });
  84. }
  85. public static async Task<List<GameRoom>> GetPublicRooms()
  86. {
  87. return await Task.Run(() =>
  88. {
  89. var rooms = OpenedGames.Values.ToList();
  90. foreach (var room in OpenedGames.Values.ToList().
  91. Where(room => room.IsPrivate || room.IsFilled() || room.IsRunning)) rooms.Remove(room);
  92. return rooms;
  93. });
  94. }
  95. public static GameRoom GetRoom(string roomKey)
  96. {
  97. return OpenedGames[roomKey];
  98. }
  99. }
  100. }