GiveAway.cs 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using MafiaTelegramBot.Controllers;
  4. using MafiaTelegramBot.DataBase.Entity;
  5. using MafiaTelegramBot.DataBase.EntityDao;
  6. using MafiaTelegramBot.Game;
  7. using MafiaTelegramBot.Resources;
  8. using Telegram.Bot.Types;
  9. using Telegram.Bot.Types.InputFiles;
  10. using Telegram.Bot.Types.ReplyMarkups;
  11. namespace MafiaTelegramBot.Other
  12. {
  13. public class GiveAway
  14. {
  15. public static readonly Dictionary<int, GiveAway> OpenedGiveaways = new ();
  16. private readonly int _id;
  17. private readonly string _url;
  18. private int _count;
  19. private UserEntity _chatInfo;
  20. private readonly List<long> _awardedIdList = new ();
  21. private readonly Roles _prize;
  22. private int _messageId;
  23. private string _buttonText = "";
  24. public GiveAway(int count, Roles prize)
  25. {
  26. _id = Utilities.Rnd.Next();
  27. _count = count;
  28. _prize = prize;
  29. _url = $"https://t.me/{AppSettings.Name}?start=giveaway_id={_id}";
  30. OpenedGiveaways.Add(_id, this);
  31. }
  32. public async Task<Message> PostGiveAway(UserEntity info, string buttonText, string message = null, string imageUrl = null, string userName = null)
  33. {
  34. _buttonText = buttonText;
  35. _chatInfo = info;
  36. var keyboard = new InlineKeyboardMarkup(InlineKeyboardButton.WithUrl(_buttonText + $" ({_count})", _url));
  37. var result = imageUrl == null
  38. ? await MessageController.SendText(info, message, keyboard)
  39. : await MessageController.SendImage(info, new InputOnlineFile(imageUrl), message, replyMarkup: keyboard);
  40. _messageId = result.MessageId;
  41. if (userName == null) return result;
  42. var adminId = await UserDao.GetIdByUsername(userName);
  43. var admin = await UserDao.GetPlayerById(adminId);
  44. await MessageController.SendTextWithHtml(admin.Info, $"<a href='{_url}'>{strings.giveaway_link}</a>");
  45. return result;
  46. }
  47. private async Task<bool> TryDecreaseCount(long id)
  48. {
  49. if (_awardedIdList.Contains(id)) return false;
  50. _count--;
  51. await UpdateGiveAwayMessageOrDelete();
  52. _awardedIdList.Add(id);
  53. return true;
  54. }
  55. public async Task<ResultCode> GivePrizeTo(Player player)
  56. {
  57. if (!await TryDecreaseCount(player.Info.Id)) return ResultCode.NowYouGetPrizeFromThisGiveaway;
  58. if (_prize is Roles.All) return await GivePackToUser(player);
  59. var firstPrize = _prize;
  60. if (player.OpenedRoles.TryOpenRole(firstPrize))
  61. {
  62. await MessageController.SendText(player.Info, Stickers.Sticker[firstPrize.ToString()]);
  63. await MessageController.SendText(player.Info,$"{strings.congratulations_you_open_role} {roles.ResourceManager.GetString(firstPrize.ToString())}");
  64. }
  65. else await MessageController.SendText(player.Info,$"{strings.you_got_role} {roles.ResourceManager.GetString(firstPrize.ToString())} ({strings.now_opened})");
  66. return ResultCode.CodeOk;
  67. }
  68. private static async Task<ResultCode> GivePackToUser(Player player)
  69. {
  70. player.Info.PackCount++;
  71. await MessageController.SendSticker(player.Info, Stickers.Sticker["Pool"]);
  72. await MessageController.SendText(player.Info, $"{strings.your_packs} {player.Info.PackCount}", Keyboard.PackKeyboard());
  73. return ResultCode.CodeOk;
  74. }
  75. private async Task UpdateGiveAwayMessageOrDelete()
  76. {
  77. if (_count == 0)
  78. {
  79. await MessageController.EditMessage(_chatInfo, _messageId, strings.giveaway_ended);
  80. OpenedGiveaways.Remove(_id);
  81. _awardedIdList.Clear();
  82. }
  83. else
  84. {
  85. var keyboard = new InlineKeyboardMarkup(InlineKeyboardButton.WithUrl(_buttonText + $" ({_count})", _url));
  86. await MessageController.EditReplyMarkup(_chatInfo, _messageId, keyboard);
  87. }
  88. }
  89. }
  90. }