Message.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. // Команда "/menu"
  35. new MenuMessage(),
  36. // Команда "Коллекция"
  37. new CollectionMessage(),
  38. // Команда "Магазин"
  39. new ShopMessage(),
  40. // Команда "Аукцион"
  41. new AuctionMessage(),
  42. // Ожидание ввода эмоджи
  43. new EnterEmojiMessage(),
  44. // Загрузка стикерпака
  45. new DownloadStickerPackMessage(),
  46. //команда ввода цены
  47. new EnterGemsPriceMessage(),
  48. // Команда "Показать пример"
  49. new ShowSampleMessage(),
  50. // Команда "Остановить"
  51. new StopBot()
  52. },
  53. FileCommandsList = new() {
  54. /* Выгрузка файлов к боту */
  55. new UploadFileMessage(),
  56. };
  57. /* Метод, создающий объекты команд исходя из полученного обновления */
  58. public static async Task<UpdateModel> Factory(Update update)
  59. {
  60. // Если сообщение от бота - игнорируем, нам не нужны боты
  61. if (update.Message!.From!.IsBot || update.Message.SuccessfulPayment is not null)
  62. {
  63. // Если это вдруг написал наш бот (сообщенияуведомления о закрпеах и пр.), то удаляем
  64. if (update.Message!.From!.Username == AppSettings.NAME)
  65. await Bot.Client.DeleteMessageAsync(update.Message.Chat.Id, update.Message.MessageId);
  66. // Если это сообщение о платеже
  67. if (update.Message.SuccessfulPayment is not null)
  68. await Bot.Client.DeleteMessageAsync(update.Message.Chat.Id, update.Message.MessageId);
  69. return new IgnoreUpdate();
  70. }
  71. /* Список команд определяем исходя из типа сообщения */
  72. var list = update.Message.Type switch
  73. {
  74. MessageType.Text => TextCommandsList,
  75. MessageType.Document => FileCommandsList,
  76. _ => new List<Message>()
  77. };
  78. /* Данные определяем исходя из типа сообщения */
  79. var data = update.Message.Type switch
  80. {
  81. MessageType.Text => update.Message.Text,
  82. MessageType.Document => update.Message.Document!.FileId,
  83. _ => "Unknown"
  84. };
  85. // Объект пользователя
  86. var user = await UserDao.GetUser(update.Message!.From);
  87. // Если пользователь заблокирован или сообщение где-то в другом канале, привате - игонрируем
  88. if (user.IsBlocked || update.Message.Chat.Id != user.ChatId) return new IgnoreUpdate();
  89. // Удаляем сообщение пользователя в лс, оно нам больше не нужно
  90. await MessageController.DeleteMessage(user, update.Message.MessageId);
  91. // Если сообщение - это команда, полученная от бота, то мы игнорируем, так как получим ее через ChosenInlineResult
  92. if (update.Message.ViaBot is { }) return new IgnoreUpdate();
  93. // Возвращаем объект, если команда совпала
  94. foreach (var item in list.Where(item => item.IsMatches(data)))
  95. if(Activator.CreateInstance(item.GetType(), user, update) is Message executor)
  96. if (executor.IsMatches(data)) return executor;
  97. // Возвращаем команда не найдена, если код дошел до сюда
  98. return new CommandNotFound(user, update, data);
  99. }
  100. protected Message(UserEntity user, Update update) : base(user, update) { }
  101. protected Message() { }
  102. }
  103. }