Message.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Threading.Tasks;
  3. using CardCollector.Controllers;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using CardCollector.Commands.Message.DocumentMessage;
  7. using CardCollector.Commands.Message.TextMessage;
  8. using CardCollector.DataBase.Entity;
  9. using CardCollector.DataBase.EntityDao;
  10. using CardCollector.Resources;
  11. using Telegram.Bot;
  12. using Telegram.Bot.Types;
  13. using Telegram.Bot.Types.Enums;
  14. namespace CardCollector.Commands.Message
  15. {
  16. /* Родительский класс для входящих обновлений типа Message (обычное сообщение)
  17. при наследовании укажите ключевое слово, содержащееся в тексте
  18. для поля Command и определите логику действий в Execute
  19. Также необходимо определить констуктор с параметрами UserEntity и
  20. Update, наслеуемый от base(user, update)
  21. И После реализации добавить команду в список List в этом классе
  22. Для обработки команды определены следующие поля
  23. User - пользователь, вызвавший команду
  24. Update - обновление, полученное от сервера Телеграм */
  25. public abstract class Message : UpdateModel
  26. {
  27. /* Список команд */
  28. private static readonly List<Message>
  29. TextCommandsList = new() {
  30. // Команда "Профиль"
  31. new ProfileMessage(),
  32. // Команда "/start"
  33. new StartMessage(),
  34. // Команда "Коллекция"
  35. new CollectionMessage(),
  36. // Команда "Магазин"
  37. new ShopMessage(),
  38. // Команда "Аукцион"
  39. new AuctionMessage(),
  40. // Ожидание ввода эмоджи
  41. new EnterEmojiMessage(),
  42. // Загрузка стикерпака
  43. new DownloadStickerPackMessage(),
  44. // Команда "Показать пример"
  45. new ShowSampleMessage()
  46. },
  47. FileCommandsList = new() {
  48. /* Выгрузка файлов к боту */
  49. new UploadFileMessage(),
  50. };
  51. /* Метод, создающий объекты команд исходя из полученного обновления */
  52. public static async Task<UpdateModel> Factory(Update update)
  53. {
  54. // Если сообщение от нашего бота
  55. if (update.Message!.From!.Username == AppSettings.NAME)
  56. {
  57. await Bot.Client.DeleteMessageAsync(update.Message.Chat.Id, update.Message.MessageId);
  58. return new IgnoreUpdate();
  59. }
  60. /* Список команд определяем исходя из типа сообщения */
  61. var list = update.Message.Type switch
  62. {
  63. MessageType.Text => TextCommandsList,
  64. MessageType.Document => FileCommandsList,
  65. _ => new List<Message>()
  66. };
  67. /* Данные определяем исходя из типа сообщения */
  68. var data = update.Message.Type switch
  69. {
  70. MessageType.Text => update.Message.Text,
  71. MessageType.Document => update.Message.Document!.FileId,
  72. _ => ""
  73. };
  74. // Объект пользователя
  75. var user = await UserDao.GetUser(update.Message!.From);
  76. // Если пользователь заблокирован или пользователь - бот, или сообщение где-то в другом канале - игонрируем
  77. if (user.IsBlocked || update.Message!.From!.IsBot || update.Message.Chat.Id != user.ChatId) return new IgnoreUpdate();
  78. // Удаляем сообщение пользователя, оно нам больше не нужно
  79. await MessageController.DeleteMessage(user, update.Message.MessageId);
  80. // Возвращаем объект, если команда совпала
  81. foreach (var item in list.Where(item => item.IsMatches(data)))
  82. if(Activator.CreateInstance(item.GetType(), user, update) is Message executor)
  83. if (executor.IsMatches(data)) return executor;
  84. // Возвращаем команда не найдена, если код дошел до сюда
  85. return new CommandNotFound(user, update, data);
  86. }
  87. protected Message(UserEntity user, Update update) : base(user, update) { }
  88. protected Message() { }
  89. }
  90. }