RoomController.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using MafiaTelegramBot.DataBase;
  5. using MafiaTelegramBot.Game;
  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(User owner, string roomName, bool extended, string secretPhrase = null)
  13. {
  14. var gameExists = await Task.Run(() => OpenedGames.ContainsKey(roomName));
  15. return await Task.Run(async () =>
  16. {
  17. if (gameExists) return ResultCode.GameAlreadyExists;
  18. if (!await owner.SetRoomKey(secretPhrase ?? roomName)) return ResultCode.UserAlreadyInGame;
  19. var room = secretPhrase == null
  20. ? new GameRoom {Creator = owner, RoomName = roomName, IsExtended = extended}
  21. : new PrivateGameRoom {Creator = owner, RoomName = roomName, IsExtended = extended};
  22. OpenedGames.Add(secretPhrase ?? roomName, room);
  23. room.Players.Add(owner.Id, owner);
  24. return ResultCode.CodeOk;
  25. });
  26. }
  27. public static async Task<ResultCode> ConnectToGame(User player, string roomKey)
  28. {
  29. return await Task.Run(async () =>
  30. {
  31. if (!OpenedGames.ContainsKey(roomKey)) return ResultCode.RoomDoesNotExist;
  32. if (OpenedGames[roomKey].IsFilled()) return ResultCode.RoomIsFilled;
  33. if (!await player.SetRoomKey(roomKey)) return ResultCode.UserAlreadyInGame;
  34. OpenedGames[roomKey].Players.Add(player.Id, player);
  35. return ResultCode.CodeOk;
  36. });
  37. }
  38. public static async Task<List<User>> GetPlayers(string roomKey)
  39. {
  40. return await Task.Run( ()=>
  41. {
  42. var room = OpenedGames[roomKey];
  43. var users = room.Players.Values.ToList();
  44. return users;
  45. });
  46. }
  47. public static async Task<ResultCode> LeaveFromGame(User player)
  48. {
  49. return await Task.Run(async () =>
  50. {
  51. var roomKey = player.GetRoomKey();
  52. if (!await player.RemoveGame()) return ResultCode.UserNotInGame;
  53. OpenedGames[roomKey].Players.Remove(player.Id);
  54. if (OpenedGames[roomKey].Players.Count == 0) OpenedGames.Remove(roomKey);
  55. return ResultCode.CodeOk;
  56. });
  57. }
  58. public static async Task<List<GameRoom>> GetPublicRooms()
  59. {
  60. return await Task.Run(() =>
  61. {
  62. var rooms = OpenedGames.Values.ToList();
  63. List<GameRoom> publicRooms = new List<GameRoom>();
  64. int countRooms = 0;
  65. foreach (var room in rooms)
  66. {
  67. if (room.IsPrivate) continue;
  68. if (room.IsFilled()) continue;
  69. publicRooms.Add(room);
  70. countRooms++;
  71. if (countRooms == 10) break;
  72. }
  73. return publicRooms;
  74. });
  75. }
  76. public static async Task<GameRoom> GetRoom(string roomKey)
  77. {
  78. return await Task.Run( ()=>
  79. {
  80. var room = OpenedGames[roomKey];
  81. return room;
  82. });
  83. }
  84. }
  85. }