MessageHandler.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using MafiaTelegramBot.DataBase.EntityDao;
  6. using MafiaTelegramBot.Game;
  7. using Telegram.Bot.Types;
  8. namespace MafiaTelegramBot.Commands.Messages
  9. {
  10. public class MessageHandler : UpdateHandler
  11. {
  12. private static IEnumerable<UpdateHandler> List => new List<UpdateHandler>
  13. {
  14. // Переносим обработку сообщений в другой класс, если игрок находится в комнате
  15. new UserInGameMessageHandler(null),
  16. // Эти обработчики впереди, так как они зависят от наличия игрока в очереди, т.е. игрок должен написать какое-то сообщение
  17. new GiveRoleToPlayerHandler(null),
  18. new ChangeNicknameHandler(null),
  19. new CreateRoomHandler(null),
  20. new EnterCodeHandler(null),
  21. new UnblockUserMessageHandler(null),
  22. // Остальные обработчики
  23. new AdminPanelMessageHandler(null),
  24. new ConnectGameMessageHandler(null),
  25. new CreateGameMessageHandler(null),
  26. new DissolveRoomMessageHandler(null),
  27. new FastGameMessageHandler(null),
  28. new KickPlayerMessageHandler(null),
  29. new LeaveMessageHandler(null),
  30. new LookPlayersListMessageHandler(null),
  31. new RoomSettingsMessageHandler(null),
  32. new ShowProfileMessageHandler(null),
  33. new StartMessageHandler(null),
  34. new StartGameMessageHandler(null),
  35. };
  36. public static async Task<UpdateHandler> Factory(User user, string message)
  37. {
  38. Logs.LogOut(typeof(MessageHandler), "Factory");
  39. // Объект пользователя
  40. var player = await UserDao.GetPlayerById(user.Id) ?? await UserDao.AddNew(user);
  41. // Если игрок заблокирован, то нафиг его
  42. if (player.Info.IsBlocked) return new MessageHandler(player);
  43. // Устанавливаем игроку время активности на текущее
  44. player.SetActive();
  45. // Возвращаем объект, если есть подходящая команда
  46. foreach (var item in List.Where(item => item.IsMatches(message)))
  47. if (Activator.CreateInstance(item.GetType(), player) is MessageHandler handler)
  48. if(handler.IsMatches(message)) return handler;
  49. // Возвращаем команда не найдена, если код дошел до сюда
  50. return new CommandNotFound(player, message);
  51. }
  52. protected MessageHandler(Player player) : base(player) { }
  53. }
  54. }