BuyByGems.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Threading.Tasks;
  3. using CardCollector.Controllers;
  4. using CardCollector.DataBase.Entity;
  5. using CardCollector.DataBase.EntityDao;
  6. using CardCollector.Resources;
  7. using CardCollector.Session.Modules;
  8. using Telegram.Bot.Types;
  9. namespace CardCollector.Commands.CallbackQuery
  10. {
  11. public class BuyByGems : CallbackQuery
  12. {
  13. protected override string CommandText => Command.buy_by_gems;
  14. public override async Task Execute()
  15. {
  16. var offerInfo = User.Session.GetModule<ShopModule>().SelectedPosition;
  17. if (User.Cash.Gems < offerInfo.ResultPriceGems)
  18. await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.not_enougth_gems);
  19. else if (offerInfo.Expired)
  20. await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.offer_expired);
  21. else if (offerInfo.IsSpecial && !offerInfo.IsInfinite && await SpecialOfferUsersDao.NowUsed(User.Id, offerInfo.Id))
  22. await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.you_already_use_this_offer);
  23. else
  24. {
  25. User.Cash.Gems -= offerInfo.ResultPriceGems;
  26. if (offerInfo.IsSpecial && !offerInfo.IsInfinite)
  27. await SpecialOfferUsersDao.AddNew(User.Id, offerInfo.Id);
  28. var userPacks = await UsersPacksDao.GetUserPacks(User.Id);
  29. switch (offerInfo.PackId)
  30. {
  31. case 1:
  32. userPacks.RandomCount += offerInfo.Count;
  33. break;
  34. case 2:
  35. userPacks.AuthorCount += offerInfo.Count;
  36. break;
  37. default:
  38. var info = await SpecificPackDao.GetInfo(User.Id, offerInfo.PackId);
  39. info.Count += offerInfo.Count;
  40. break;
  41. }
  42. await MessageController.EditMessage(User, CallbackMessageId, Messages.thanks_for_buying);
  43. if (offerInfo.AdditionalPrize != "") await GivePrize(offerInfo.AdditionalPrize);
  44. }
  45. }
  46. private async Task GivePrize(string prizeInfo)
  47. {
  48. var data = prizeInfo.Split('=');
  49. StickerEntity sticker = null;
  50. switch (data[0])
  51. {
  52. case "tier":
  53. var tier = int.Parse(data[1]);
  54. var stickers = await StickerDao.GetListWhere(item => item.Tier == tier);
  55. var rnd = new Random();
  56. sticker = stickers[rnd.Next(stickers.Count)];
  57. break;
  58. case "sticker":
  59. sticker = await StickerDao.GetStickerByHash(data[1]);
  60. break;
  61. }
  62. if (sticker != null)
  63. {
  64. if (!User.Stickers.ContainsKey(sticker.Md5Hash))
  65. await UserStickerRelationDao.AddNew(User, sticker, 1);
  66. else
  67. {
  68. await MessageController.AnswerCallbackQuery(User, CallbackQueryId,
  69. $"{Messages.you_collected} {await User.Cash.Payout(User.Stickers)}{Text.coin}");
  70. User.Stickers[sticker.Md5Hash].Count ++;
  71. }
  72. var stickerMessage = await MessageController.SendSticker(User, sticker.Id);
  73. var message = await MessageController.SendMessage(User, $"{Messages.congratulation}\n{sticker}");
  74. User.Session.Messages.Add(stickerMessage.MessageId);
  75. User.Session.Messages.Add(message.MessageId);
  76. }
  77. }
  78. public BuyByGems() { }
  79. public BuyByGems(UserEntity user, Update update) : base(user, update) { }
  80. }
  81. }