CallbackQuery.cs 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using CardCollector.DataBase.Entity;
  6. using CardCollector.DataBase.EntityDao;
  7. using Telegram.Bot.Types;
  8. namespace CardCollector.Commands.CallbackQuery
  9. {
  10. /* Родительский класс для входящих обновлений типа CallbackQuery (нажатие пользователем инлайн кнопки)
  11. при наследовании укажите ключевое слово, содержащееся в запросе
  12. для поля Command и определите логику действий в Execute
  13. Также необходимо определить констуктор с параметрами UserEntity
  14. и Update, наслеуемый от base(user, update)
  15. И После реализации добавить команду в список List в этом классе
  16. Для обработки команды определены следующие поля
  17. User - пользователь, вызвавший команду
  18. Update - обновление, полученное от сервера Телеграм */
  19. public abstract class CallbackQuery : UpdateModel
  20. {
  21. /* Данные, поступившие после нажатия на кнокпку */
  22. protected string CallbackData;
  23. /* Id сообщения, под которым нажали на кнопку */
  24. protected int CallbackMessageId;
  25. /* Id запроса */
  26. protected string CallbackQueryId;
  27. /* Список команд, распознаваемых ботом */
  28. private static readonly List<CallbackQuery> List = new()
  29. {
  30. new AuthorCallback(),
  31. new AuthorMenuQuery(),
  32. new BackToCombine(),
  33. new BackToFiltersMenu(),
  34. new BuyByCoins(),
  35. new BuyByGems(),
  36. new BuyGemsQuery(),
  37. new BuyPackQuery(),
  38. new BuyStickerQuery(),
  39. new CancelCallback(),
  40. new ClearChat(),
  41. new CollectIncomeQuery(),
  42. new CombineCallback(),
  43. new CombineStickers(),
  44. new ConfirmationSellingQuery(),
  45. new ConfirmBuyingQuery(),
  46. new CountQuery(),
  47. new DailyTasksQuery(),
  48. new DeleteCombine(),
  49. new EmojiCallback(),
  50. new MyPacksQuery(),
  51. new OpenPackCallback(),
  52. new OpenSpecificCallback(),
  53. new PackInfo(),
  54. new PriceCallback(),
  55. new PutForAuctionQuery(),
  56. new SelectOfferCallback(),
  57. new SetFilterCallback(),
  58. new SortCallback(),
  59. new TierCallback(),
  60. };
  61. /* Метод, создающий объекты команд исходя из полученного обновления */
  62. public static async Task<UpdateModel> Factory(Update update)
  63. {
  64. // Объект пользователя
  65. var user = await UserDao.GetUser(update.CallbackQuery!.From);
  66. // Если пользователь заблокирован игонрируем
  67. if (user.IsBlocked) return new IgnoreUpdate();
  68. // Возвращаем объект, если команда совпала
  69. return List.FirstOrDefault(item => item.IsMatches(user, update)) is { } executor
  70. ? (UpdateModel) Activator.CreateInstance(executor.GetType(), user, update)
  71. : new CommandNotFound(user, update, update.CallbackQuery!.Data);
  72. }
  73. protected internal override bool IsMatches(UserEntity user, Update update)
  74. {
  75. var query = update.CallbackQuery!.Data!.Split('=')[0];
  76. return query == CommandText;
  77. }
  78. protected CallbackQuery() { }
  79. protected CallbackQuery(UserEntity user, Update update) : base(user, update)
  80. {
  81. CallbackData = update.CallbackQuery!.Data;
  82. CallbackMessageId = update.CallbackQuery!.Message!.MessageId;
  83. CallbackQueryId = update.CallbackQuery!.Id;
  84. }
  85. }
  86. }