ChosenInlineResultCommand.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using CardCollector.Commands.ChosenInlineResult;
  6. using CardCollector.DataBase.Entity;
  7. using CardCollector.DataBase.EntityDao;
  8. using Telegram.Bot.Types;
  9. namespace CardCollector.Commands
  10. {
  11. /* Родительский класс для входящих обновлений типа ChosenInlineResult
  12. (выбор пользователем инлайн команды)
  13. при наследовании укажите ключевое слово, содержащееся в запросе
  14. для поля Command и определите логику действий в Execute
  15. Также необходимо определить констуктор с параметрами UserEntity,
  16. Update и InlineResult, наслеуемый от base(user, update, inlineResult)
  17. И После реализации добавить команду в список List в этом классе
  18. Для обработки команды определены следующие поля
  19. User - пользователь, вызвавший команду
  20. Update - обновление, полученное от сервера Телеграм
  21. InlineResult - результат входящего запроса */
  22. public abstract class ChosenInlineResultCommand : UpdateModel
  23. {
  24. /* Результат запроса (id выбранного пользователем элемента) */
  25. protected readonly string InlineResult;
  26. /* Команда запроса */
  27. protected readonly string InlineQuery;
  28. /* Список команд */
  29. protected static readonly List<ChosenInlineResultCommand> List = new()
  30. {
  31. /* Этот объект должен быть всегда в начале списка, так как он должен быть вызван
  32. вперед других, если в коде включен режим бесконечных стикеров */
  33. new GetUnlimitedStickerAndExecuteCommand(),
  34. // Обработка результата при отправке стикера
  35. new SendSticker(),
  36. new SendPrivateSticker(),
  37. // Обработка результата при выборе продавца
  38. new SelectTrader(),
  39. new SelectStickerInline(),
  40. };
  41. /* Метод, создающий объекты команд исходя из полученного обновления */
  42. public static async Task<UpdateModel> Factory(Update update)
  43. {
  44. // Объект пользователя
  45. var user = await UserDao.GetUser(update.ChosenInlineResult!.From);
  46. // Если пользователь заблокирован игонрируем
  47. if (user.IsBlocked) return new IgnoreUpdate();
  48. // Возвращаем объект, если команда совпала
  49. return List.FirstOrDefault(item => item.IsMatches(user, update)) is { } executor
  50. ? (UpdateModel) Activator.CreateInstance(executor.GetType(), user, update)
  51. : new CommandNotFound(user, update, update.ChosenInlineResult.ResultId);
  52. }
  53. protected internal override bool IsMatches(UserEntity user, Update update)
  54. {
  55. var query = update.ChosenInlineResult!.ResultId.Split("=")[0];
  56. return CommandText == query;
  57. }
  58. protected ChosenInlineResultCommand() { }
  59. protected ChosenInlineResultCommand(UserEntity user, Update update) : base(user, update)
  60. {
  61. InlineResult = update.ChosenInlineResult!.ResultId;
  62. InlineQuery = update.ChosenInlineResult.Query;
  63. }
  64. }
  65. }