Keyboard.cs 21 KB

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