GameRoom.Role.cs 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using MafiaTelegramBot.Game.GameRoles;
  7. using MafiaTelegramBot.Models;
  8. using MafiaTelegramBot.Resources;
  9. using Telegram.Bot.Types;
  10. using Timer = System.Timers.Timer;
  11. namespace MafiaTelegramBot.Game.GameRooms
  12. {
  13. public partial class GameRoom
  14. {
  15. public abstract class Role
  16. {
  17. protected readonly GameRoom Room;
  18. protected readonly Player Player;
  19. public readonly List<Player> KnownRoles = new();
  20. protected long NightTargetId = -1;
  21. public readonly ManualResetEvent DayActionComplete = new(false);
  22. protected int MessageId = -1;
  23. public abstract Task NightAction();
  24. public abstract Task ApplyNightActionResult();
  25. public abstract Task<Message> SetNightTarget(long userId);
  26. public abstract Roles RoleKey { get; }
  27. protected Role(GameRoom room, Player player)
  28. {
  29. Room = room;
  30. Player = player;
  31. }
  32. public async Task DayAction()
  33. {
  34. await Room.PlayersCh.SendExcept(Player.Id, $"{strings.now_turn} {Player.NickName}");
  35. await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn);
  36. Player.IsSpeaker = true;
  37. var timer = new Timer(60 * 1000);
  38. var voteTimer = new Timer(10 * 1000);
  39. Message message = null;
  40. timer.Elapsed += async (_, _) =>
  41. {
  42. Player.IsSpeaker = false;
  43. await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn_ended);
  44. if (!Room.IsFirstCycle)
  45. {
  46. var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
  47. message = await Bot.SendWithMarkdown2(Player.ChatId, strings.put_up_vote, Keyboards.VoteKeyboard(alivePlayers, Player.Id, !Player.IsFirst));
  48. voteTimer.Elapsed += async (_, _) =>
  49. {
  50. await Bot.Get().EditMessageReplyMarkupAsync(Player.ChatId, message.MessageId);
  51. if (Player.IsFirst)
  52. await Room.PutUpVote(Player.Id, Player.Id);
  53. else
  54. await Room.PlayersCh.SendExcept(Player.Id, $"{Player.NickName} {strings.didnt_put_anyone}");
  55. DayActionComplete.Set();
  56. };
  57. await Bot.SendWithMarkdown2(Player.Id, strings.you_have_one_minute);
  58. if(Player.IsFirst) await Bot.SendWithMarkdown2(Player.Id, strings.user_not_choose);
  59. voteTimer.Start();
  60. }
  61. if(!voteTimer.Enabled) DayActionComplete.Set();
  62. };
  63. timer.AutoReset = false;
  64. timer.Start();
  65. DayActionComplete.WaitOne();
  66. DayActionComplete.Reset();
  67. timer.Stop();
  68. voteTimer.Stop();
  69. if(message!=null) await Bot.Get().DeleteMessageAsync(Player.ChatId, message.MessageId);
  70. }
  71. public static Role GetNewRoleInstance(Roles roleKey, GameRoom room, Player player)
  72. {
  73. return roleKey switch
  74. {
  75. Roles.All => new NoneRole(),
  76. Roles.Doctor => new DoctorRole(room, player),
  77. Roles.Mafia => new MafiaRole(room, player),
  78. Roles.Don => new DonRole(room, player),
  79. Roles.Cop => new CopRole(room, player),
  80. Roles.Villager => new VillagerRole(room, player),
  81. Roles.Hooker => new HookerRole(room, player),
  82. Roles.None => new NoneRole(room, player),
  83. _ => throw new ArgumentOutOfRangeException(nameof(roleKey), roleKey, null)
  84. };
  85. }
  86. }
  87. }
  88. }