Keyboard.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using CardCollector.DataBase.Entity;
  4. using CardCollector.Session;
  5. using CardCollector.Session.Modules;
  6. using Telegram.Bot.Types.ReplyMarkups;
  7. namespace CardCollector.Resources
  8. {
  9. /* В данном классе содержатся все клавиатуры, используемые в проекте */
  10. public static class Keyboard
  11. {
  12. /* Клавиатура, отображаемая с первым сообщением пользователя */
  13. public static readonly ReplyKeyboardMarkup Menu = new(new[]
  14. {
  15. new KeyboardButton[] {Text.profile, Text.collection},
  16. new KeyboardButton[] {Text.shop, Text.auction},
  17. }) {ResizeKeyboard = true};
  18. public static readonly InlineKeyboardMarkup PackMenu = new(new[]
  19. {
  20. new[] {InlineKeyboardButton.WithCallbackData(Text.open_random, $"{Command.open_pack}=0")},
  21. new[] {InlineKeyboardButton.WithCallbackData(Text.open_author, $"{Command.author_menu}=1")}
  22. });
  23. public static InlineKeyboardMarkup BackToFilters(string stickerTitle)
  24. {
  25. return new InlineKeyboardMarkup(new[]
  26. {
  27. new[] {InlineKeyboardButton.WithSwitchInlineQuery(Text.send_sticker, stickerTitle)},
  28. new[] {InlineKeyboardButton.WithCallbackData(Text.back, $"{Command.back}={Command.clear_chat}")}
  29. });
  30. }
  31. public static InlineKeyboardMarkup GetSortingMenu(UserState state)
  32. {
  33. var keyboard = new List<InlineKeyboardButton[]>
  34. {
  35. new[] {InlineKeyboardButton.WithCallbackData(Text.author, $"{Command.author}=1")},
  36. new[] {InlineKeyboardButton.WithCallbackData(Text.tier, Command.tier)},
  37. new[] {InlineKeyboardButton.WithCallbackData(Text.emoji, Command.emoji)}
  38. };
  39. if (state != UserState.CollectionMenu) keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData(Text.price, Command.price)});
  40. keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData(Text.sort, Command.sort)});
  41. keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.cancel)});
  42. keyboard.Add(new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(Text.show_stickers)});
  43. return new InlineKeyboardMarkup(keyboard);
  44. }
  45. /* Клавиатура меню сортировки */
  46. public static readonly InlineKeyboardMarkup SortOptions = new(new[]
  47. {
  48. new[] {InlineKeyboardButton.WithCallbackData(Text.no, $"{Command.set}={Command.sort}={SortingTypes.None}")},
  49. new[] {InlineKeyboardButton.WithCallbackData(SortingTypes.ByTierIncrease, $"{Command.set}={Command.sort}={SortingTypes.ByTierIncrease}")},
  50. new[] {InlineKeyboardButton.WithCallbackData(SortingTypes.ByTierDecrease, $"{Command.set}={Command.sort}={SortingTypes.ByTierDecrease}")},
  51. new[] {InlineKeyboardButton.WithCallbackData(SortingTypes.ByAuthor, $"{Command.set}={Command.sort}={SortingTypes.ByAuthor}")},
  52. new[] {InlineKeyboardButton.WithCallbackData(SortingTypes.ByTitle, $"{Command.set}={Command.sort}={SortingTypes.ByTitle}")},
  53. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)},
  54. });
  55. /* Клавиатура меню выбора тира */
  56. public static readonly InlineKeyboardMarkup TierOptions = new (new[]
  57. {
  58. new[] {InlineKeyboardButton.WithCallbackData(Text.all, $"{Command.set}={Command.tier}=-1")},
  59. new[] {InlineKeyboardButton.WithCallbackData("1", $"{Command.set}={Command.tier}=1")},
  60. new[] {InlineKeyboardButton.WithCallbackData("2", $"{Command.set}={Command.tier}=2")},
  61. new[] {InlineKeyboardButton.WithCallbackData("3", $"{Command.set}={Command.tier}=3")},
  62. new[] {InlineKeyboardButton.WithCallbackData("4", $"{Command.set}={Command.tier}=4")},
  63. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)},
  64. });
  65. /* Клавиатура меню ввода эмоджи */
  66. public static readonly InlineKeyboardMarkup EmojiOptions = new (new[]
  67. {
  68. new[] {InlineKeyboardButton.WithCallbackData(Text.all, $"{Command.set}={Command.emoji}=")},
  69. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)},
  70. });
  71. /* Клавиатура с одной кнопкой отмены */
  72. public static readonly InlineKeyboardMarkup CancelKeyboard = new (new[]
  73. {
  74. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.cancel)},
  75. });
  76. /* Клавиатура с отменой и выставлением */
  77. public static readonly InlineKeyboardMarkup AuctionPutCancelKeyboard = new (new[]
  78. {
  79. new[] {InlineKeyboardButton.WithCallbackData(Text.sell_on_auction, Command.confirm_selling)},
  80. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.cancel)},
  81. });
  82. /* Клавиатура меню выбора цен */
  83. public static readonly InlineKeyboardMarkup CoinsPriceOptions = new (new[]
  84. {
  85. new[] {
  86. InlineKeyboardButton.WithCallbackData($"💰 {Text.from} 0", $"{Command.set}={Command.price_coins_from}=0"),
  87. InlineKeyboardButton.WithCallbackData($"💰 {Text.to} 100", $"{Command.set}={Command.price_coins_to}=100"),
  88. },
  89. new[] {
  90. InlineKeyboardButton.WithCallbackData($"💰 {Text.from} 100", $"{Command.set}={Command.price_coins_from}=100"),
  91. InlineKeyboardButton.WithCallbackData($"💰 {Text.to} 500", $"{Command.set}={Command.price_coins_to}=500"),
  92. },
  93. new[] {
  94. InlineKeyboardButton.WithCallbackData($"💰 {Text.from} 500", $"{Command.set}={Command.price_coins_from}=500"),
  95. InlineKeyboardButton.WithCallbackData($"💰 {Text.to} 1000", $"{Command.set}={Command.price_coins_to}=1000"),
  96. },
  97. new[] {
  98. InlineKeyboardButton.WithCallbackData($"💰 {Text.from} 1000", $"{Command.set}={Command.price_coins_from}=1000"),
  99. InlineKeyboardButton.WithCallbackData($"💰 {Text.to} ∞", $"{Command.set}={Command.price_coins_to}=0"),
  100. },
  101. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)},
  102. });
  103. /* Клавиатура меню выбора цен */
  104. public static readonly InlineKeyboardMarkup GemsPriceOptions = new (new[]
  105. {
  106. new[] {
  107. InlineKeyboardButton.WithCallbackData($"💎 {Text.from} 0", $"{Command.set}={Command.price_gems_from}=0"),
  108. InlineKeyboardButton.WithCallbackData($"💎 {Text.to} 10", $"{Command.set}={Command.price_gems_to}=10"),
  109. },
  110. new[] {
  111. InlineKeyboardButton.WithCallbackData($"💎 {Text.from} 10", $"{Command.set}={Command.price_gems_from}=10"),
  112. InlineKeyboardButton.WithCallbackData($"💎 {Text.to} 50", $"{Command.set}={Command.price_gems_to}=50"),
  113. },
  114. new[] {
  115. InlineKeyboardButton.WithCallbackData($"💎 {Text.from} 50", $"{Command.set}={Command.price_gems_from}=50"),
  116. InlineKeyboardButton.WithCallbackData($"💎 {Text.to} 100", $"{Command.set}={Command.price_gems_to}=100"),
  117. },
  118. new[] {
  119. InlineKeyboardButton.WithCallbackData($"💎 {Text.from} 100", $"{Command.set}={Command.price_gems_from}=100"),
  120. InlineKeyboardButton.WithCallbackData($"💎 {Text.to} ∞", $"{Command.set}={Command.price_gems_to}=0"),
  121. },
  122. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)},
  123. });
  124. /* Возвращает клавиатуру со списоком авторов */
  125. public static InlineKeyboardMarkup GetAuthorsKeyboard(List<string> list, int page = 1)
  126. {
  127. /* Список авторов, отображаемый на текущей странице */
  128. var sublist = list.GetRange((page - 1) * 10,
  129. list.Count >= page * 10 ? 10 : list.Count % 10);
  130. /* Список кнопок на клавиатуре */
  131. var keyboardList = new List<InlineKeyboardButton[]>
  132. {
  133. new[]
  134. {
  135. /* Добавляем в список кнопку "Все" */
  136. InlineKeyboardButton.WithCallbackData(Text.all,
  137. $"{Command.set}={Command.author}=")
  138. }
  139. };
  140. /* Копируем список */
  141. var copyList = sublist.ToList();
  142. while (copyList.Count > 0)
  143. {
  144. /* Берем первый элемент и запихиваем его в строку */
  145. var author = copyList[0];
  146. copyList.RemoveAt(0);
  147. var keyRow = new List<InlineKeyboardButton>
  148. {
  149. InlineKeyboardButton.WithCallbackData(author,
  150. $"{Command.set}={Command.author}={author}")
  151. };
  152. /* Если есть еще элементы, то добавляем в строку вторую кнопку */
  153. if (copyList.Count > 0)
  154. {
  155. author = copyList[0];
  156. copyList.RemoveAt(0);
  157. keyRow.Add(InlineKeyboardButton.WithCallbackData(author,
  158. $"{Command.set}={Command.author}={author}"));
  159. }
  160. /* Добавляем строку кнопок в клавиатуру */
  161. keyboardList.Add(keyRow.ToArray());
  162. }
  163. /* Если всего авторов больше 10, то добавляем стрелочки */
  164. if (list.Count > 10)
  165. keyboardList.Add(
  166. sublist.Count switch
  167. {
  168. <10 => new[]
  169. {
  170. InlineKeyboardButton.WithCallbackData(Text.previous, $"{Command.author}={page - 1}")
  171. },
  172. >=10 when page == 1 => new[]
  173. {
  174. InlineKeyboardButton.WithCallbackData(Text.next, $"{Command.author}={page + 1}")
  175. },
  176. _ => new[]
  177. {
  178. InlineKeyboardButton.WithCallbackData(Text.previous, $"{Command.author}={page - 1}"),
  179. InlineKeyboardButton.WithCallbackData(Text.next, $"{Command.author}={page + 1}")
  180. }
  181. }
  182. );
  183. /* Добавляем кнопку отмены */
  184. keyboardList.Add(new[] {
  185. InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)
  186. });
  187. /* Вовзращаем клавиатуру */
  188. return new InlineKeyboardMarkup(keyboardList);
  189. }
  190. /* Возвращает клавиатуру со списоком авторов */
  191. public static InlineKeyboardMarkup GetAuthorsKeyboard(
  192. List<UsersPacksEntity> list,
  193. List<PackEntity> infoList,
  194. int page)
  195. {
  196. /* Список кнопок на клавиатуре */
  197. var keyboardList = new List<InlineKeyboardButton[]>();
  198. /* Копируем список */
  199. foreach (var (item, i) in list.WithIndex())
  200. {
  201. if (i % 2 == 0) keyboardList.Add(new [] {
  202. InlineKeyboardButton.WithCallbackData($"{infoList[i].Author} {item.Count}{Text.items}",
  203. $"{Command.open_pack}={item.PackId}")
  204. });
  205. else keyboardList[keyboardList.Count - 1] = new [] {
  206. keyboardList[keyboardList.Count - 1][0],
  207. InlineKeyboardButton.WithCallbackData($"{infoList[i].Author} {item.Count}{Text.items}",
  208. $"{Command.open_pack}={item.PackId}")
  209. };
  210. }
  211. keyboardList.Add(new[] {
  212. InlineKeyboardButton.WithCallbackData(Text.previous, $"{Command.author_menu}={page - 1}"),
  213. InlineKeyboardButton.WithCallbackData(Text.next, $"{Command.author_menu}={page + 1}")
  214. });
  215. keyboardList.Add(new[] {
  216. InlineKeyboardButton.WithCallbackData(Text.cancel, Command.cancel)
  217. });
  218. /* Вовзращаем клавиатуру */
  219. return new InlineKeyboardMarkup(keyboardList);
  220. }
  221. public static InlineKeyboardMarkup GetCollectionStickerKeyboard(CollectionModule module)
  222. {
  223. var sticker = module.SelectedSticker;
  224. var count = module.Count;
  225. var keyboard = new List<InlineKeyboardButton[]>
  226. {
  227. new[] {InlineKeyboardButton.WithSwitchInlineQuery(Text.send_sticker, sticker.Title)},
  228. new[] {InlineKeyboardButton.WithCallbackData($"{Text.sell_on_auction} ({count})", Command.sell_on_auction)},
  229. new[]
  230. {
  231. InlineKeyboardButton.WithCallbackData(Text.minus, $"{Command.count}-"),
  232. InlineKeyboardButton.WithCallbackData(Text.plus, $"{Command.count}+"),
  233. }
  234. };
  235. if (sticker.Tier != 5) keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData($"{Text.combine} ({count})", Command.combine)});
  236. keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData(Text.back, $"{Command.back}={Command.clear_chat}")});
  237. return new InlineKeyboardMarkup(keyboard);
  238. }
  239. public static InlineKeyboardMarkup GetAuctionStickerKeyboard()
  240. {
  241. return new InlineKeyboardMarkup(new[] {
  242. new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(Text.show_traders)},
  243. new[] {InlineKeyboardButton.WithCallbackData(Text.back, $"{Command.back}={Command.clear_chat}")},
  244. });
  245. }
  246. public static InlineKeyboardMarkup GetAuctionProductKeyboard(AuctionModule module)
  247. {
  248. return new InlineKeyboardMarkup(new[] {
  249. new[] {InlineKeyboardButton.WithCallbackData($"{Text.buy} ({module.Count}) {module.Price * module.Count}{Text.gem}", Command.confirm_buying)},
  250. new[]
  251. {
  252. InlineKeyboardButton.WithCallbackData(Text.minus, $"{Command.count}-"),
  253. InlineKeyboardButton.WithCallbackData(Text.plus, $"{Command.count}+"),
  254. },
  255. new[] {InlineKeyboardButton.WithCallbackData(Text.back, $"{Command.back}={Command.clear_chat}")},
  256. });
  257. }
  258. public static InlineKeyboardMarkup GetStickerKeyboard(StickerEntity stickerInfo)
  259. {
  260. return new InlineKeyboardMarkup(new[] {
  261. new[] {InlineKeyboardButton.WithSwitchInlineQuery(Text.send_sticker, stickerInfo.Title)},
  262. new[] {InlineKeyboardButton.WithCallbackData(Text.back, Command.clear_chat)},
  263. });
  264. }
  265. public static InlineKeyboardMarkup GetConfirmationKeyboard(string command)
  266. {
  267. return new InlineKeyboardMarkup(new[] {
  268. new[]
  269. {
  270. InlineKeyboardButton.WithCallbackData(Text.no, Command.back_to_sticker),
  271. InlineKeyboardButton.WithCallbackData(Text.yes, command)
  272. }
  273. });
  274. }
  275. public static InlineKeyboardMarkup GetStickerKeyboard(UserSession session)
  276. {
  277. return session.State switch
  278. {
  279. UserState.ProductMenu => GetAuctionProductKeyboard(session.GetModule<AuctionModule>()),
  280. UserState.AuctionMenu => GetAuctionStickerKeyboard(),
  281. UserState.CombineMenu => GetCombineStickerKeyboard(session.GetModule<CombineModule>()),
  282. UserState.CollectionMenu => GetCollectionStickerKeyboard(session.GetModule<CollectionModule>()),
  283. _ => GetStickerKeyboard(session.GetModule<DefaultModule>().SelectedSticker)
  284. };
  285. }
  286. public static InlineKeyboardMarkup GetCombineStickerKeyboard(CombineModule module)
  287. {
  288. return new InlineKeyboardMarkup(new[] {
  289. new[] {InlineKeyboardButton.WithCallbackData($"{Text.add} ({module.Count})", Command.combine)},
  290. new[]
  291. {
  292. InlineKeyboardButton.WithCallbackData(Text.minus, $"{Command.count}-"),
  293. InlineKeyboardButton.WithCallbackData(Text.plus, $"{Command.count}+"),
  294. },
  295. new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back_to_combine)},
  296. new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(Text.select_another)},
  297. });
  298. }
  299. public static InlineKeyboardMarkup GetCombineKeyboard(CombineModule module)
  300. {
  301. var keyboard = new List<InlineKeyboardButton[]>();
  302. foreach (var (sticker, _) in module.CombineList)
  303. {
  304. keyboard.Add(new []{InlineKeyboardButton.WithCallbackData($"{Text.delete} {Text.sticker} {keyboard.Count + 1}",
  305. $"{Command.delete_combine}={sticker.Md5Hash}")});
  306. }
  307. keyboard.Add(new []{InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)});
  308. if (module.GetCombineCount() == Constants.COMBINE_COUNT)
  309. keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData(
  310. $"{Text.combine} {module.CalculateCombinePrice()}{Text.coin}",
  311. Command.combine_stickers)});
  312. else keyboard.Add(new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(Text.add_sticker)});
  313. return new InlineKeyboardMarkup(keyboard);
  314. }
  315. /* Клавиатура, отображаемая вместе с сообщением профиля */
  316. public static InlineKeyboardMarkup GetProfileKeyboard(int income, int privilegeLevel)
  317. {
  318. var keyboard = new List<InlineKeyboardButton[]> {
  319. new[] {InlineKeyboardButton.WithCallbackData($"{Text.collect} {income}{Text.coin}", Command.collect_income)},
  320. new[] {InlineKeyboardButton.WithCallbackData(Text.daily_tasks, Command.daily_tasks)},
  321. new[] {InlineKeyboardButton.WithCallbackData(Text.my_packs, Command.my_packs)},
  322. };
  323. if (privilegeLevel > 2) keyboard.Add(
  324. new[] {InlineKeyboardButton.WithCallbackData(Text.control_panel, Command.control_panel)});
  325. return new InlineKeyboardMarkup(keyboard);
  326. }
  327. public static InlineKeyboardMarkup ShopKeyboard(IEnumerable<ShopEntity> specialOffers)
  328. {
  329. var keyboard = new List<InlineKeyboardButton[]>();
  330. foreach (var offer in specialOffers)
  331. keyboard.Add(new []{InlineKeyboardButton.WithCallbackData(offer.Title,
  332. $"{Command.select_offer}={offer.Id}")
  333. });
  334. keyboard.Add(new []{InlineKeyboardButton.WithCallbackData(Text.buy_pack, Command.buy_pack)});
  335. keyboard.Add(new []{InlineKeyboardButton.WithCallbackData(Text.buy_gems, Command.buy_gems)});
  336. keyboard.Add(new []{InlineKeyboardButton.WithCallbackData(Text.cancel, Command.cancel)});
  337. return new InlineKeyboardMarkup(keyboard);
  338. }
  339. public static InlineKeyboardMarkup OfferKeyboard(ShopEntity offerInfo)
  340. {
  341. var keyboard = new List<InlineKeyboardButton[]>();
  342. if (offerInfo.PriceCoins >= 0)
  343. keyboard.Add(new [] {
  344. InlineKeyboardButton.WithCallbackData($"{Text.buy} {offerInfo.ResultPriceCoins}{Text.coin}",
  345. Command.buy_by_coins)
  346. });
  347. if (offerInfo.PriceGems >= 0)
  348. keyboard.Add(new [] {
  349. InlineKeyboardButton.WithCallbackData($"{Text.buy} {offerInfo.ResultPriceGems}{Text.gem}",
  350. Command.buy_by_gems)
  351. });
  352. keyboard.Add(new []{InlineKeyboardButton.WithCallbackData(Text.cancel, Command.cancel)});
  353. return new InlineKeyboardMarkup(keyboard);
  354. }
  355. }
  356. }