Tigran 4 anni fa
parent
commit
1aeadf1c2f

+ 0 - 1
MafiaTelegramBot/DataBase/MafiaDataBase.cs

@@ -1,7 +1,6 @@
 using MafiaTelegramBot.DataBase.Entity;
 using MafiaTelegramBot.Resources;
 using Microsoft.EntityFrameworkCore;
-using Telegram.Bot.Types;
 
 namespace MafiaTelegramBot.DataBase
 {

+ 11 - 9
MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs

@@ -27,7 +27,7 @@ namespace MafiaTelegramBot.Game.GameRooms
 
         private async Task FirstDay()
         {
-            IsDay = true;
+            _isDay = true;
             await PlayersCh.SendSticker(Stickers.Sticker["Day"]);
             await PlayersCh.Send(strings.first_day_message);
             await Task.Run(async() =>
@@ -48,7 +48,7 @@ namespace MafiaTelegramBot.Game.GameRooms
 
         private async Task FirstNight()
         {
-            IsDay = false;
+            _isDay = false;
             await Task.Run(async() =>
             {
                 await PlayersCh.SendSticker(Stickers.Sticker["Night"]);
@@ -105,7 +105,7 @@ namespace MafiaTelegramBot.Game.GameRooms
 
         private async Task DayPhase()
         {
-            IsDay = true;
+            _isDay = true;
             var turnsCount = _turnOrder.Count;
             Player firstPlayer = null;
             for (var i = 0; i < turnsCount; ++i)
@@ -113,6 +113,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 var player = _turnOrder.Dequeue();
                 if(!player.IsPlaying || !player.IsAlive) continue;
                 if (firstPlayer == null) player.IsFirst = true;
+                await PlayersCh.Send($"{strings.now_turn} {player.NickName}");
                 await player.CurrentRole.OneMinuteSpeak();
                 await player.CurrentRole.VotingAction();
                 if (player.IsFirst) firstPlayer = player;
@@ -124,7 +125,7 @@ namespace MafiaTelegramBot.Game.GameRooms
 
         private async Task NightPhase()
         {
-            IsDay = false;
+            _isDay = false;
             await PlayersCh.SendSticker(Stickers.Sticker["Night"]);
             await PlayersCh.Send(strings.city_falls_asleep);
             await Task.Run(async () =>
@@ -200,7 +201,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 votingTimer.Elapsed += (_, _) => resetEvent.Set();
                 List<Message> messagesToDelete = new();
                 foreach (var player in votersPlayers)
-                    messagesToDelete.Add(await player.CurrentRole.VotingUpDefenders(contendersForDispatch));
+                    messagesToDelete.Add(await player.CurrentRole.SendVotingList(contendersForDispatch));
                 votingTimer.Start();
                 resetEvent.WaitOne();
                 votingTimer.Stop();
@@ -217,6 +218,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 var contenders = await DefencePhase();
                 if (contenders.Count > 1) contenders = await DefencePhase();
                 if (contenders.Count > 1) await PlayersCh.Send(strings.villagers_could_not_decide);
+                if (contenders.Count == 0) await PlayersCh.Send(strings.villagers_could_not_decide);
                 else await contenders[0].CurrentRole.Dispatch();
             });
         }
@@ -245,12 +247,12 @@ namespace MafiaTelegramBot.Game.GameRooms
                 if (aliveMafia.Count == 0)
                 {
                     await PlayersCh.Send(strings.villagers_won, exceptDied: false);
-                    await PlayersCh.SendSticker(Stickers.Sticker["VillagerWins"], false);
+                    await PlayersCh.SendSticker(Stickers.Sticker["VillagerWins"]);
                 }
                 else
                 {
                     await PlayersCh.Send(strings.mafia_won, exceptDied: false);
-                    await PlayersCh.SendSticker(Stickers.Sticker["MafiaWins"], false);
+                    await PlayersCh.SendSticker(Stickers.Sticker["MafiaWins"]);
                 }
                 var rolesMessage = strings.in_this_game_roles;
                 var sortedPLayers = Players.Values.ToList();
@@ -262,7 +264,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 }
                 await PlayersCh.Send(rolesMessage);
                 IsRunning = false;
-                IsDay = false;
+                _isDay = false;
                 _turnOrder.Clear();
                 Settings.Clear();
                 foreach (var (_, list) in PlayersRole) list.Clear();
@@ -271,7 +273,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 else
                 {
                     await Bot.SendWithMarkdown2(Owner.ChatId, strings.thanks_for_game, Keyboard.OwnerGameMenu);
-                    await PlayersCh.SendExcept(Owner.Id, strings.thanks_for_game, Keyboard.PlayerGameMenu, false);
+                    await PlayersCh.SendExcept(Owner.Id, strings.thanks_for_game, Keyboard.PlayerGameMenu);
                 }
             });
         }

+ 7 - 7
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageChannels.cs

@@ -18,16 +18,16 @@ namespace MafiaTelegramBot.Game.GameRooms
             }
 
             public abstract Task Send(string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = true);
+                bool exceptDied = false);
 
             public abstract Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = true);
+                bool exceptDied = false);
         }
 
         public class PlayersChannel : Channel
         {
             public override async Task Send(string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = true)
+                bool exceptDied = false)
             {
                 var receivers = exceptDied
                     ? Room.Players.Values.Where(p => p.IsAlive)
@@ -36,7 +36,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     await Bot.SendWithMarkdown2(player.ChatId, message, replyMarkup);
             }
 
-            public override async Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null, bool exceptDied = true)
+            public override async Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null, bool exceptDied = false)
             {
                 var receivers = exceptDied
                     ? Room.Players.Values.Where(p => p.Id != playerId && p.IsAlive)
@@ -45,7 +45,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     await Bot.SendWithMarkdown2(player.ChatId, message, replyMarkup);
             }
 
-            public async Task SendSticker(string fileId, bool exceptDied = true)
+            public async Task SendSticker(string fileId, bool exceptDied = false)
             {
                 var receivers = exceptDied
                     ? Room.Players.Values.Where(p => p.IsAlive)
@@ -61,7 +61,7 @@ namespace MafiaTelegramBot.Game.GameRooms
 
         public class MafiaChannel : Channel
         {
-            public override async Task Send(string message, IReplyMarkup replyMarkup = null, bool exceptDied = true)
+            public override async Task Send(string message, IReplyMarkup replyMarkup = null, bool exceptDied = false)
             {
                 var mafia = exceptDied
                     ? Room.Players.Values.Where(p => p.GetRole() is Roles.Don or Roles.Mafia && p.IsAlive)
@@ -72,7 +72,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             }
 
             public override async Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = true)
+                bool exceptDied = false)
             {
                 var except = exceptDied
                     ? Room.Players.Values.Where(p => p.Id != playerId && p.IsAlive)

+ 4 - 3
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageHandler.cs

@@ -27,7 +27,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 else if (text == keyboard.leave) await Leave(player);
                 else if (text == keyboard.end_turn)
                 {
-                    if (_room.IsDay && player.IsSpeaker) player.CurrentRole.TalkingActionComplete.Set();
+                    if (_room._isDay && player.IsSpeaker) player.CurrentRole.TalkingActionComplete.Set();
                     else await Bot.SendWithMarkdown2(player.ChatId, strings.now_is_not_your_turn);
                 }
                 else
@@ -40,7 +40,7 @@ namespace MafiaTelegramBot.Game.GameRooms
 
             private async Task ForwardMessage(Player player, string message)
             {
-                if (_room.IsDay)
+                if (_room._isDay)
                 {
                     if (player.IsSpeaker)
                         await _room.PlayersCh.SendExcept(player.Id, $"\\({player.TurnOrder}\\) {player.NickName}: {message}");
@@ -80,7 +80,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                             Roles.Don => item.GetRole() is Roles.Cop
                                 ? roles.Cop
                                 : item.GetRole() is Roles.Journalist
-                                    ? roles.Journalist : roles.Villager,
+                                    ? roles.Journalist
+                                    : item.GetRole() is Roles.Mafia ? roles.Mafia : roles.Villager,
                             _ => item.GetRoleName()
                         };
                     }

+ 1 - 1
MafiaTelegramBot/Game/GameRooms/GameRoom.QueryHandler.cs

@@ -45,7 +45,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             private async Task<Message> VoteAsync(Player player, long targetId)
             {
                 var message = await _room.PutUpVote(player.Id, targetId);
-                player.CurrentRole.VoteEvent.Set();
+                player.CurrentRole.VoteActionComplete.Set();
                 return message;
             }
 

+ 12 - 14
MafiaTelegramBot/Game/GameRooms/GameRoom.Role.cs

@@ -20,8 +20,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             public readonly List<Player> KnownRoles = new();
             protected long NightTargetId = -1;
             public readonly ManualResetEvent TalkingActionComplete = new(false);
-            public readonly ManualResetEvent DefenceActionComplete = new(false);
-            public readonly ManualResetEvent VoteEvent = new(false);
+            public readonly ManualResetEvent VoteActionComplete = new(false);
             protected int MessageId = -1;
             public abstract Roles RoleKey { get; }
             public virtual Task NightAction() { return Task.CompletedTask; }
@@ -56,14 +55,13 @@ namespace MafiaTelegramBot.Game.GameRooms
 
             public async Task OneMinuteSpeak()
             {
+                TalkingActionComplete.Reset();
                 await Bot.SendWithMarkdown2(Player.ChatId, $"{strings.your_turn}\n{strings.you_turn_say}", Keyboard.InGamePlayerMenuWithEndTurn);
                 Player.IsSpeaker = true;
-                var timer = new Timer(60 * 1000);
+                var timer = new Timer(60 * 1000) {AutoReset = false};
                 timer.Elapsed += (_, _) => TalkingActionComplete.Set();
-                timer.AutoReset = false;
                 timer.Start();
                 TalkingActionComplete.WaitOne();
-                TalkingActionComplete.Reset();
                 timer.Stop();
                 await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn_ended, Keyboard.InGamePlayerMenu);
                 Player.IsSpeaker = false;
@@ -71,32 +69,32 @@ namespace MafiaTelegramBot.Game.GameRooms
 
             public async Task VotingAction()
             {
-                var voteTimer = new Timer(10 * 1000);
+                var voteTimer = new Timer(10 * 1000) {AutoReset = false};
                 var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
-                var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.put_up_vote, Keyboard.VoteKeyboard(alivePlayers, Player.Id, !Player.IsFirst));
+                var message = await SendVotingList(alivePlayers, !Player.IsFirst);
                 voteTimer.Elapsed += async (_, _) =>
                 {
-                    await Bot.Get().EditMessageReplyMarkupAsync(Player.ChatId, message.MessageId);
+                    await Bot.EditMessageAsync(Player.ChatId, message.MessageId, strings.time_out);
                     if (Player.IsFirst)
                         await Room.PutUpVote(Player.Id, Player.Id);
                     else
                         await Room.PlayersCh.SendExcept(Player.Id, $"{Player.NickName} {strings.didnt_put_anyone}");
-                    VoteEvent.Set();
+                    VoteActionComplete.Set();
                 };
-                await Bot.SendWithMarkdown2(Player.Id, strings.you_have_ten_seconds);
                 if(Player.IsFirst) await Bot.SendWithMarkdown2(Player.Id, strings.user_not_choose);
                 voteTimer.Start();
-                VoteEvent.WaitOne();
-                VoteEvent.Reset();
+                VoteActionComplete.WaitOne();
                 voteTimer.Stop();
                 if(message!=null) await Bot.Get().DeleteMessageAsync(Player.ChatId, message.MessageId);
             }
 
-            public async Task<Message> VotingUpDefenders(List<Player> defenders)
+            public async Task<Message> SendVotingList(List<Player> targets, bool skipButton = true)
             {
+                VoteActionComplete.Reset();
                 return await Bot.SendWithMarkdown2(Player.ChatId, $"{strings.put_up_vote}\n{strings.you_have_ten_seconds}", 
-                    Keyboard.VoteKeyboard(defenders, Player.Id, !Player.IsFirst));
+                    Keyboard.VoteKeyboard(targets, Player.Id, skipButton));
             }
+            
             public async Task DefenceAction()
             {
                 await Room.PlayersCh.SendExcept(Player.Id, $"{strings.now_defence} {Player.NickName}");

+ 3 - 3
MafiaTelegramBot/Game/GameRooms/GameRoom.Structure.cs

@@ -8,7 +8,7 @@ namespace MafiaTelegramBot.Game.GameRooms
     public abstract partial class GameRoom
     {
         public bool IsRunning;
-        public bool IsDay = false;
+        private bool _isDay;
         public int MaxPlayers = 10;
         private int _minPlayers = Constants.PLAYER_LIMITS_MIN;
         public bool IsPrivate { get; init; }
@@ -17,10 +17,9 @@ namespace MafiaTelegramBot.Game.GameRooms
         public string RoomName { get; init; } = "NoNameRoom";
         public Player Owner { get; init; } = new();
 
-        private int _largeVote = 0; //большее из количеств голосов за игроков 
+        private int _largeVote; //большее из количеств голосов за игроков 
 
         private readonly List<Player> _voteUpList = new();
-        protected Player PlayerToDispatch = null;
 
         public readonly MessageHandler MHandler;
         public readonly QueryHandler QHandler;
@@ -37,6 +36,7 @@ namespace MafiaTelegramBot.Game.GameRooms
         
         protected GameRoom()
         {
+            _isDay = false;
             MHandler = new MessageHandler(this);
             QHandler = new QueryHandler(this);
             _mafiaCh = new MafiaChannel(this);