CallbackQueryCommand.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using CardCollector.Commands.CallbackQuery;
  6. using CardCollector.DataBase.Entity;
  7. using CardCollector.DataBase.EntityDao;
  8. using Telegram.Bot.Types;
  9. namespace CardCollector.Commands
  10. {
  11. /* Родительский класс для входящих обновлений типа CallbackQuery (нажатие пользователем инлайн кнопки)
  12. при наследовании укажите ключевое слово, содержащееся в запросе
  13. для поля Command и определите логику действий в Execute
  14. Также необходимо определить констуктор с параметрами UserEntity
  15. и Update, наслеуемый от base(user, update)
  16. И После реализации добавить команду в список List в этом классе
  17. Для обработки команды определены следующие поля
  18. User - пользователь, вызвавший команду
  19. Update - обновление, полученное от сервера Телеграм */
  20. public abstract class CallbackQueryCommand : UpdateModel
  21. {
  22. private static readonly List<CallbackQueryCommand> List = new()
  23. {
  24. new AuthorsMenu(),
  25. new BuyAuthorPackMenu(),
  26. new Back(),
  27. new BuyShopItem(),
  28. new BuyCoins(),
  29. new BuyGems(),
  30. new BuyPack(),
  31. new BuySticker(),
  32. new CollectIncome(),
  33. new Combine(),
  34. new CombineStickers(),
  35. new ConfirmSelling(),
  36. new ConfirmBuying(),
  37. new ConfirmExchange(),
  38. new Count(),
  39. new CallbackQuery.DailyTasks(),
  40. new DeleteCombine(),
  41. new EndUploadStickers(),
  42. new SelectEmoji(),
  43. new MyPacks(),
  44. new OpenPack(),
  45. new OpenAuthorPackMenu(),
  46. new PackInfo(),
  47. new SelectPrice(),
  48. new PutForAuction(),
  49. new SelectOffer(),
  50. new SetFilter(),
  51. new SelectSort(),
  52. new ShowInfo(),
  53. new SpecialOffers(),
  54. new SelectTier(),
  55. new SelectShopPack(),
  56. new Alerts(),
  57. new Settings(),
  58. new SetExchangeSum(),
  59. new SetGemsSum(),
  60. new ReturnFromAuction(),
  61. new ControlPanel(),
  62. new LogsMenu(),
  63. new ShowSample(),
  64. new StopBot(),
  65. new AddForSaleSticker(),
  66. new SelectForSalePack(),
  67. new UploadStickerPack(),
  68. };
  69. /* Данные, поступившие после нажатия на кнокпку */
  70. protected string CallbackData;
  71. /* Id запроса */
  72. protected string CallbackQueryId;
  73. /* Список команд, распознаваемых ботом */
  74. /* Метод, создающий объекты команд исходя из полученного обновления */
  75. public static async Task<UpdateModel> Factory(Update update)
  76. {
  77. // Объект пользователя
  78. var user = await UserDao.GetUser(update.CallbackQuery!.From);
  79. // Если пользователь заблокирован игонрируем
  80. if (user.IsBlocked) return new IgnoreUpdate();
  81. // Возвращаем объект, если команда совпала
  82. return List.FirstOrDefault(item => item.IsMatches(user, update)) is { } executor
  83. ? (UpdateModel) Activator.CreateInstance(executor.GetType(), user, update)
  84. : new CommandNotFound(user, update, update.CallbackQuery!.Data);
  85. }
  86. protected internal override bool IsMatches(UserEntity user, Update update)
  87. {
  88. var query = update.CallbackQuery!.Data!.Split('=')[0];
  89. return query == CommandText;
  90. }
  91. protected CallbackQueryCommand() { }
  92. protected CallbackQueryCommand(UserEntity user, Update update) : base(user, update)
  93. {
  94. CallbackData = update.CallbackQuery!.Data;
  95. CallbackQueryId = update.CallbackQuery!.Id;
  96. }
  97. }
  98. }