Tigran 4 lat temu
rodzic
commit
5096399a58

+ 2 - 2
MafiaTelegramBot/Controllers/RoomController.cs

@@ -35,9 +35,9 @@ namespace MafiaTelegramBot.Controllers
             {
                 if (!OpenedGames.ContainsKey(roomKey)) return ResultCode.RoomDoesNotExist;
                 var roomName = RoomEncrypter.GetName(roomKey);
-                if (!player.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
                 if (OpenedGames[roomKey].IsRunning) return ResultCode.GameAlreadyRunning;
                 if (OpenedGames[roomKey].IsFilled()) return ResultCode.RoomIsFilled;
+                if (!player.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
                 OpenedGames[roomKey].Players.Add(player.Id, player);
                 await OpenedGames[roomKey].PlayersCh.SendExcept(player.Id, $"{player.NickName} {strings.connected_to_game}");
                 return ResultCode.CodeOk;
@@ -93,7 +93,7 @@ namespace MafiaTelegramBot.Controllers
             {
                 var rooms = OpenedGames.Values.ToList();
                 foreach (var room in OpenedGames.Values.ToList().
-                    Where(room => room.IsPrivate || room.IsFilled())) rooms.Remove(room);
+                    Where(room => room.IsPrivate || room.IsFilled() || room.IsRunning)) rooms.Remove(room);
                 return rooms;
             });
         }

+ 3 - 2
MafiaTelegramBot/Game/GameRoles/MafiaRole.cs

@@ -14,9 +14,10 @@ namespace MafiaTelegramBot.Game.GameRoles
         public override async Task NightAction()
         {
             NightTargetId = -1;
+            Player.IsSpeaker = true;
             var targets = Room.Players.Values.Where(p => p.IsAlive).ToList();
-            var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_check_role, 
-                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
+            var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_kill, 
+                Keyboard.NightChooseTargetKeyboard(targets, Player.Id, true));
             MessageId = message.MessageId;
         }
 

+ 6 - 2
MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs

@@ -45,7 +45,6 @@ namespace MafiaTelegramBot.Game.GameRooms
                 }
                 _turnOrder.Enqueue(firstPlayer);
             });
-            await PlayersCh.Send(strings.city_falls_asleep);
         }
 
         private async Task FirstNight()
@@ -150,7 +149,6 @@ namespace MafiaTelegramBot.Game.GameRooms
                 Player killedPlayer = null;
                 foreach (var (role, players) in PlayersRole)
                 {
-                    Console.WriteLine(role.ToString());
                     if (players.Count == 1)
                     {
                         var player = players[0];
@@ -159,10 +157,16 @@ namespace MafiaTelegramBot.Game.GameRooms
                     }
                     else if (role is Roles.Mafia)
                     {
+                        foreach (var mafia in players) mafia.IsSpeaker = false;
                         var votes = players
                             .GroupBy(player => player.CurrentRole.GetNightTarget())
                             .Select(item => new {id = item.Key, count = item.Count()})
                             .ToList();
+                        foreach (var vote in votes)
+                        {
+                            Console.WriteLine(vote.id);
+                            Console.WriteLine(vote.count);
+                        }
                         if (votes.Count == players.Count) continue;
                         var max = votes.Max(item => item.count);
                         var maxCount = votes.Count(item => item.count == max);

+ 2 - 1
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageHandler.cs

@@ -69,7 +69,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                 foreach (var item in players)
                 {
                     var role = "";
-                    if (knownRoles.Contains(item) && item.GetRole() != Roles.None)
+                    if (item.Id == player.Id) role = player.GetRoleName();
+                    else if (knownRoles.Contains(item) && item.GetRole() != Roles.None)
                     {
                         role = player.GetRole() switch
                         {

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

@@ -18,7 +18,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 _room = room;
             }
             
-            public async Task<Message> Handle(Update update)
+            public async Task Handle(Update update)
             {
                 var data = update.CallbackQuery.Data.Split('|');
                 var userId = long.Parse(data[1]);
@@ -32,13 +32,13 @@ namespace MafiaTelegramBot.Game.GameRooms
                     Callback.Target => await player.CurrentRole.SetNightTarget(long.Parse(data[2])),
                     _ => await Bot.SendWithMarkdown2(chatId, strings.not_supported_in_game)
                 };
-                return message;
             }
 
             private async Task<Message> VoteAsync(Player player, long targetId)
             {
-                player.CurrentRole.DayActionComplete.Set();
-                return await _room.PutUpVote(player.Id, targetId);
+                var message = await _room.PutUpVote(player.Id, targetId);
+                player.CurrentRole.VoteEvent.Set();
+                return message;
             }
 
             private async Task<Message> SkipAsync(Player player)

+ 27 - 26
MafiaTelegramBot/Game/GameRooms/GameRoom.Role.cs

@@ -20,6 +20,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             public readonly List<Player> KnownRoles = new();
             protected long NightTargetId = -1;
             public readonly ManualResetEvent DayActionComplete = new(false);
+            public ManualResetEvent VoteEvent = new(false);
             protected int MessageId = -1;
             public abstract Roles RoleKey { get; }
             public abstract Task NightAction();
@@ -41,39 +42,39 @@ namespace MafiaTelegramBot.Game.GameRooms
             public async Task DayAction()
             {
                 await Room.PlayersCh.SendExcept(Player.Id, $"{strings.now_turn} {Player.NickName}");
-                await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn + "\n" + strings.you_turn_say);
+                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 voteTimer = new Timer(10 * 1000);
-                Message message = null;
-                timer.Elapsed += async (_, _) =>
-                {
-                    Player.IsSpeaker = false;
-                    await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn_ended);
-                    if (!Room.IsFirstCycle)
-                    {
-                        var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
-                        message = await Bot.SendWithMarkdown2(Player.ChatId, strings.put_up_vote, Keyboard.VoteKeyboard(alivePlayers, Player.Id, !Player.IsFirst));
-                        voteTimer.Elapsed += async (_, _) =>
-                        {
-                            await Bot.Get().EditMessageReplyMarkupAsync(Player.ChatId, message.MessageId);
-                            if (Player.IsFirst)
-                                await Room.PutUpVote(Player.Id, Player.Id);
-                            else
-                                await Room.PlayersCh.SendExcept(Player.Id, $"{Player.NickName} {strings.didnt_put_anyone}");
-                            DayActionComplete.Set();
-                        };
-                        await Bot.SendWithMarkdown2(Player.Id, strings.you_have_one_minute);
-                        if(Player.IsFirst) await Bot.SendWithMarkdown2(Player.Id, strings.user_not_choose);
-                        voteTimer.Start();
-                    }
-                    if(!voteTimer.Enabled) DayActionComplete.Set();
-                };
+                timer.Elapsed += (_, _) => DayActionComplete.Set();
                 timer.AutoReset = false;
                 timer.Start();
                 DayActionComplete.WaitOne();
                 DayActionComplete.Reset();
                 timer.Stop();
+                await Bot.SendWithMarkdown2(Player.ChatId, strings.your_turn_ended, Keyboard.InGamePlayerMenu);
+                Player.IsSpeaker = false;
+                if (!Room.IsFirstCycle) await VotingAction();
+            }
+
+            private async Task VotingAction()
+            {
+                var voteTimer = new Timer(10 * 1000);
+                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));
+                voteTimer.Elapsed += async (_, _) =>
+                {
+                    await Bot.Get().EditMessageReplyMarkupAsync(Player.ChatId, message.MessageId);
+                    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();
+                };
+                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();
                 voteTimer.Stop();
                 if(message!=null) await Bot.Get().DeleteMessageAsync(Player.ChatId, message.MessageId);
             }

+ 4 - 4
MafiaTelegramBot/Models/Bot.cs

@@ -89,18 +89,18 @@ namespace MafiaTelegramBot.Models
 
         public static async Task SendStickerWithoutPackAsync(long chatId, string fileId)
         {
-            await Get().SendStickerAsync(chatId, fileId);
+            await Get().SendStickerAsync(chatId, fileId, disableNotification: true);
         }
 
-        public static async Task<Message> SendHyperLink(long chatId, string message)
+        public static async Task SendHyperLink(long chatId, string message)
         {
-            return await Get().SendTextMessageAsync(chatId, message, ParseMode.Html);
+            await Get().SendTextMessageAsync(chatId, message, ParseMode.Html, disableNotification: true);
         }
         
         public static async Task<Message> SendWithMarkdown2(long chatId, string message, IReplyMarkup replyMarkup = null)
         {
             return await Get().SendTextMessageAsync(chatId, await Utilities.ToMarkdownString(message),
-                ParseMode.MarkdownV2, replyMarkup: replyMarkup);
+                ParseMode.MarkdownV2, replyMarkup: replyMarkup, disableNotification: true);
         }
     }
 }

+ 13 - 3
MafiaTelegramBot/Resources/Keyboard.cs

@@ -30,6 +30,12 @@ namespace MafiaTelegramBot.Resources
         );
         
         public static readonly ReplyKeyboardMarkup InGamePlayerMenu = new(new[]
+            {
+                new KeyboardButton[] {keyboard.look_players_list, keyboard.leave}
+            }, true
+        );
+        
+        public static readonly ReplyKeyboardMarkup InGamePlayerMenuWithEndTurn = new(new[]
             {
                 new KeyboardButton[] {keyboard.look_players_list, keyboard.leave},
                 new KeyboardButton[] {keyboard.end_turn}
@@ -133,12 +139,13 @@ namespace MafiaTelegramBot.Resources
 
         public static InlineKeyboardMarkup VoteKeyboard(List<Player> players, long userId, bool withSkipButton)
         {
+            players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
             var inlineButtons = new InlineKeyboardButton[withSkipButton ?players.Count+1 :players.Count][];
             for (var i = 0; i<players.Count; ++i)
             {
                 inlineButtons[i] = new[]
                 {
-                    InlineKeyboardButton.WithCallbackData($"\\({players[i].TurnOrder}\\) {players[i].NickName}", $"{Callback.Vote}|{userId}|{players[i].Id}")
+                    InlineKeyboardButton.WithCallbackData($"({players[i].TurnOrder}) {players[i].NickName}", $"{Callback.Vote}|{userId}|{players[i].Id}")
                 };
             }
             if (withSkipButton) inlineButtons[players.Count] = new[]
@@ -146,14 +153,17 @@ namespace MafiaTelegramBot.Resources
             return inlineButtons;
         }
 
-        public static InlineKeyboardMarkup NightChooseTargetKeyboard(List<Player> players, long userId)
+        public static InlineKeyboardMarkup NightChooseTargetKeyboard(List<Player> players, long userId, bool showMafia = false)
         {
+            players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
             var inlineButtons = new InlineKeyboardButton[players.Count][];
             for (var i = 0; i<players.Count; ++i)
             {
                 inlineButtons[i] = new[]
                 {
-                    InlineKeyboardButton.WithCallbackData($"\\({players[i].TurnOrder}\\) {players[i].NickName}", $"{Callback.Target}|{userId}|{players[i].Id}")
+                    InlineKeyboardButton.WithCallbackData($"({players[i].TurnOrder}) " +
+                        $"{players[i].NickName}{(showMafia && players[i].GetRole() is Roles.Mafia or Roles.Don ? " - " + players[i].GetRoleName() : "")}", 
+                        $"{Callback.Target}|{userId}|{players[i].Id}")
                 };
             }
             return inlineButtons;

+ 12 - 18
MafiaTelegramBot/Resources/strings.Designer.cs

@@ -525,12 +525,6 @@ namespace MafiaTelegramBot {
             }
         }
         
-        internal static string you_have_one_minute {
-            get {
-                return ResourceManager.GetString("you_have_one_minute", resourceCulture);
-            }
-        }
-        
         internal static string user_not_choose {
             get {
                 return ResourceManager.GetString("user_not_choose", resourceCulture);
@@ -573,12 +567,6 @@ namespace MafiaTelegramBot {
             }
         }
         
-        internal static string choose_target_to_known_role {
-            get {
-                return ResourceManager.GetString("choose_target_to_known_role", resourceCulture);
-            }
-        }
-        
         internal static string choose_player_to_check_role {
             get {
                 return ResourceManager.GetString("choose_player_to_check_role", resourceCulture);
@@ -609,12 +597,6 @@ namespace MafiaTelegramBot {
             }
         }
         
-        internal static string you_cant_heal_this_target {
-            get {
-                return ResourceManager.GetString("you_cant_heal_this_target", resourceCulture);
-            }
-        }
-        
         internal static string you_turn_say {
             get {
                 return ResourceManager.GetString("you_turn_say", resourceCulture);
@@ -674,5 +656,17 @@ namespace MafiaTelegramBot {
                 return ResourceManager.GetString("everyone_survived", resourceCulture);
             }
         }
+        
+        internal static string you_have_ten_seconds {
+            get {
+                return ResourceManager.GetString("you_have_ten_seconds", resourceCulture);
+            }
+        }
+        
+        internal static string choose_player_to_kill {
+            get {
+                return ResourceManager.GetString("choose_player_to_kill", resourceCulture);
+            }
+        }
     }
 }

+ 6 - 9
MafiaTelegramBot/Resources/strings.resx

@@ -258,9 +258,6 @@
     <data name="skip" xml:space="preserve">
         <value>Пропустить</value>
     </data>
-    <data name="you_have_one_minute" xml:space="preserve">
-        <value>У вас есть десять секунд, чтобы выставить игрока на голосование</value>
-    </data>
     <data name="user_not_choose" xml:space="preserve">
         <value>Иначе вы будете выставлены на голосование</value>
     </data>
@@ -282,9 +279,6 @@
     <data name="you_vote_to_self" xml:space="preserve">
         <value>Вы выставили самого себя</value>
     </data>
-    <data name="choose_target_to_known_role" xml:space="preserve">
-        <value>Выберите цель, роль которой хотите узнать</value>
-    </data>
     <data name="choose_player_to_check_role" xml:space="preserve">
         <value>Выберите игрока для проверки роли</value>
     </data>
@@ -300,9 +294,6 @@
     <data name="choose_player_to_heal" xml:space="preserve">
         <value>Выберите игрока для лечения</value>
     </data>
-    <data name="you_cant_heal_this_target" xml:space="preserve">
-        <value>Вы не можете вылечить данную цель</value>
-    </data>
     <data name="you_turn_say" xml:space="preserve">
         <value>У Вас есть минута, чтобы что-то сказать</value>
     </data>
@@ -333,4 +324,10 @@
     <data name="everyone_survived" xml:space="preserve">
         <value>все игроки остались в живых!</value>
     </data>
+    <data name="you_have_ten_seconds" xml:space="preserve">
+        <value>У вас есть десять секунд, чтобы выставить игрока на голосование</value>
+    </data>
+    <data name="choose_player_to_kill" xml:space="preserve">
+        <value>Выберите свою жертву</value>
+    </data>
 </root>