ChosenInlineResultCommand.cs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 GiveExp(),
  36. new SendPrivateSticker(),
  37. // Обработка результата при выборе продавца
  38. new SelectTrader(),
  39. new StickerInfo(),
  40. new SelectStickerInline(),
  41. };
  42. /* Метод, создающий объекты команд исходя из полученного обновления */
  43. public static async Task<UpdateModel> Factory(Update update)
  44. {
  45. // Объект пользователя
  46. var user = await UserDao.GetUser(update.ChosenInlineResult!.From);
  47. // Если пользователь заблокирован игонрируем
  48. if (user.IsBlocked) return new IgnoreUpdate();
  49. // Возвращаем объект, если команда совпала
  50. return List.FirstOrDefault(item => item.IsMatches(user, update)) is { } executor
  51. ? (UpdateModel) Activator.CreateInstance(executor.GetType(), user, update)
  52. : new CommandNotFound(user, update, update.ChosenInlineResult.ResultId);
  53. }
  54. protected internal override bool IsMatches(UserEntity user, Update update)
  55. {
  56. var query = update.ChosenInlineResult!.ResultId.Split("=")[0];
  57. return CommandText == query;
  58. }
  59. protected ChosenInlineResultCommand() { }
  60. protected ChosenInlineResultCommand(UserEntity user, Update update) : base(user, update)
  61. {
  62. InlineResult = update.ChosenInlineResult!.ResultId;
  63. InlineQuery = update.ChosenInlineResult.Query;
  64. }
  65. }
  66. }