Browse Source

Parasite role night forwarding messages

Tigran 4 years ago
parent
commit
80081302b8

+ 2 - 2
MafiaTelegramBot/Controllers/RoomController.cs

@@ -44,7 +44,7 @@ namespace MafiaTelegramBot.Controllers
                 if (OpenedGames[roomKey].Players.Count > Constants.MEMORY_CLEANER_INTERVAL)
                     OpenedGames[roomKey].StopTimer();
                 
-                await OpenedGames[roomKey].PlayersCh.SendExcept(player.Id, $"{player.NickName} {strings.connected_to_game}");
+                await OpenedGames[roomKey].PlayersMessageChannel.SendExcept(player.Id, $"{player.NickName} {strings.connected_to_game}");
                 return ResultCode.CodeOk;
             });
         }
@@ -78,7 +78,7 @@ namespace MafiaTelegramBot.Controllers
             {
                 if (OpenedGames.ContainsKey(roomKey))
                 {
-                    await OpenedGames[roomKey].PlayersCh.Send(strings.room_dissolved, Keyboard.MainMenu);
+                    await OpenedGames[roomKey].PlayersMessageChannel.Send(strings.room_dissolved, Keyboard.MainMenu);
                     foreach (var player in OpenedGames[roomKey].Players.Values) await player.RemoveGame();
                     RoomEncrypter.RemoveCode(OpenedGames[roomKey].RoomName);
                     OpenedGames[roomKey].DeleteTimer();

+ 2 - 2
MafiaTelegramBot/Game/GameRoles/BodyguardRole.cs

@@ -48,11 +48,11 @@ namespace MafiaTelegramBot.Game.GameRoles
         }
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");  
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");  
             }
         }
         public BodyguardRole(GameRoom room, Player player) : base(room, player) { }

+ 5 - 5
MafiaTelegramBot/Game/GameRoles/CopRole.cs

@@ -27,7 +27,7 @@ namespace MafiaTelegramBot.Game.GameRoles
             {
                 NightTargetList = Room.Players.Values
                     .Where(p => p.IsAlive && (!KnownRoles.ContainsKey(p.Id) || Room.IsExtended) && p.Id != Player.Id).ToList();
-                var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_check_role,
+                var message = await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.choose_player_to_check_role,
                     Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
                 MessageId = message.MessageId;
             }
@@ -50,20 +50,20 @@ namespace MafiaTelegramBot.Game.GameRoles
                     if (Room.Players[NightTargetId].CurrentRole.ColorRole == 2) CountBlack++;
                     if (KnownRoles.ContainsKey(NightTargetId)) KnownRoles[NightTargetId] = role;
                     else KnownRoles.Add(Room.Players[NightTargetId].Id, role);
-                    await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,
                         $"{strings.role_of_your_target} {Room.Players[NightTargetId].NickName} - {role}");
                 }
-                else await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
+                else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
             }
         }
 

+ 8 - 8
MafiaTelegramBot/Game/GameRoles/DameRole.cs

@@ -44,15 +44,15 @@ namespace MafiaTelegramBot.Game.GameRoles
             Player.IsSpeaker = false;
             if (NightTargetId != -2 && MafiaTargetId != -2 && NightTargetId != -3)
             {
-                if (MafiaTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+                if (MafiaTargetId == -1) await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
                 else MafiaTargetId = -1;
                 if (NightTargetId == -1) await SetRandomNightTarget();
                 if(Room.Players.ContainsKey(NightTargetId))
                 {
                     Room.Players[NightTargetId].IsBlocked = true;
                     Room.Players[NightTargetId].CanBeBlockedDay = false;
-                    await Room.PlayersCh.SendTo(NightTargetId, strings.dame_block_you);
-                    await Room.PlayersCh.SendExcept(NightTargetId, $"{strings.dame_block_player} " +
+                    await Room.PlayersMessageChannel.SendTo(NightTargetId, strings.dame_block_you);
+                    await Room.PlayersMessageChannel.SendExcept(NightTargetId, $"{strings.dame_block_player} " +
                                                                    $"({Room.Players[NightTargetId].TurnOrder}) " +
                                                                    $"{Room.Players[NightTargetId].NickName}. " +
                                                                    $"{strings.player_cant_talk_and_vote}");
@@ -62,20 +62,20 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
             }
         }
 
         public override async Task SetMafiaTarget(long userId)
         {
             MafiaTargetId = userId;
-            if (userId == -4) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
-            else if(!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
-            else await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            if (userId == -4) await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
+            else if(!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
+            else await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
         }
         
         public DameRole(GameRoom room, Player player) : base(room, player) { }

+ 7 - 7
MafiaTelegramBot/Game/GameRoles/DetectiveRole.cs

@@ -24,7 +24,7 @@ namespace MafiaTelegramBot.Game.GameRoles
             {
                 _action = "";
                 NightTargetList = Room.Players.Values.Where(p => p.IsAlive).ToList();
-                var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_check_or_kill,
+                var message = await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.choose_player_to_check_or_kill,
                     Keyboard.DetectiveTargetKeyboard(NightTargetList, Player.Id));
                 MessageId = message.MessageId;
             }
@@ -52,7 +52,7 @@ namespace MafiaTelegramBot.Game.GameRoles
                                 : roles.Villager;
                         if (KnownRoles.ContainsKey(NightTargetId)) KnownRoles[NightTargetId] = role;
                         else KnownRoles.Add(Room.Players[NightTargetId].Id, role);
-                        await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                        await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,
                             $"{strings.role_of_your_target} {Room.Players[NightTargetId].NickName} - {role}");
                     }
                     else
@@ -60,28 +60,28 @@ namespace MafiaTelegramBot.Game.GameRoles
                         await Room.Players[NightTargetId].CurrentRole.Kill();
                     }
                 }
-                else await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
+                else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
             }
         }
 
         public async Task SetNightTarget(long userId, string action)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 _action = action;
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
             }
         }
 

+ 4 - 4
MafiaTelegramBot/Game/GameRoles/DoctorRole.cs

@@ -22,7 +22,7 @@ namespace MafiaTelegramBot.Game.GameRoles
             if (Player.IsAlive)
             {
                 NightTargetList = Room.Players.Values.Where(p => p.IsAlive && p.CanBeHealed).ToList();
-                var message = await Room.PlayersCh.SendTo(Player.Id, strings.choose_player_to_heal,
+                var message = await Room.PlayersMessageChannel.SendTo(Player.Id, strings.choose_player_to_heal,
                     Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
                 MessageId = message.MessageId;
             }
@@ -49,12 +49,12 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                if(userId == Player.Id) await Room.PlayersCh.EditTo(Player.Id, MessageId,strings.you_heal_yourself);
-                else await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
+                if(userId == Player.Id) await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,strings.you_heal_yourself);
+                else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
             }
         }
 

+ 8 - 8
MafiaTelegramBot/Game/GameRoles/DonRole.cs

@@ -43,7 +43,7 @@ namespace MafiaTelegramBot.Game.GameRoles
             Player.IsSpeaker = false;
             if (NightTargetId != -2 && MafiaTargetId != -2 && NightTargetId != -3)
             {
-                if (MafiaTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+                if (MafiaTargetId == -1) await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
                 else MafiaTargetId = -1;
                 if (NightTargetId == -1) await SetRandomNightTarget();
                 if(Room.Players.ContainsKey(NightTargetId))
@@ -53,29 +53,29 @@ namespace MafiaTelegramBot.Game.GameRoles
                         : roles.Villager;
                     if (KnownRoles.ContainsKey(NightTargetId)) KnownRoles[NightTargetId] = role;
                     else KnownRoles.Add(Room.Players[NightTargetId].Id, role);
-                    await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,
                         $"{strings.role_of_your_target} {Room.Players[NightTargetId].NickName} - {role}");
                 }
-                else await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
+                else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
             }
         }
 
         public override async Task SetMafiaTarget(long userId)
         {
             MafiaTargetId = userId;
-            if (userId == -4) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
-            else if(!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
-            else await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            if (userId == -4) await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
+            else if(!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
+            else await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
         }
         
         public DonRole(GameRoom room, Player player) : base(room, player) { }

+ 1 - 1
MafiaTelegramBot/Game/GameRoles/ElderRole.cs

@@ -16,7 +16,7 @@ namespace MafiaTelegramBot.Game.GameRoles
         }
         public override async Task Dispatch()
         {
-            await Room.PlayersCh.Send( $"{strings.villagers_want_dispatch} {Player.NickName}, {strings.but_he_is_elder}");
+            await Room.PlayersMessageChannel.Send( $"{strings.villagers_want_dispatch} {Player.NickName}, {strings.but_he_is_elder}");
         }
 
         public ElderRole(GameRoom room, Player player) : base(room, player) { }

+ 2 - 2
MafiaTelegramBot/Game/GameRoles/HookerRole.cs

@@ -57,9 +57,9 @@ namespace MafiaTelegramBot.Game.GameRoles
                 NightTargetId = userId;
                 Room.Players[NightTargetId].CanBeBlockedNight = false;
                 await Room.Players[NightTargetId].CurrentRole.CancelNightActionResult(strings.hooker_block_you);
-                await Room.PlayersCh.EditTo(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
             }
-            else await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            else await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
         }
 
         public override async Task Kill()

+ 8 - 8
MafiaTelegramBot/Game/GameRoles/JournalistRole.cs

@@ -45,13 +45,13 @@ namespace MafiaTelegramBot.Game.GameRoles
                     if (inGamePlayers.Length == 0)
                     {
                         NightTargetTwoId = -1;
-                        var message = await Room.PlayersCh.SendTo(Player.Id, strings.nothing_to_choose);
+                        var message = await Room.PlayersMessageChannel.SendTo(Player.Id, strings.nothing_to_choose);
                         MessageId = message.MessageId;
                     }
                     else
                     {
                         NightTargetTwoId = NightTargetList[Utilities.Rnd.Next(NightTargetList.Count)].Id;
-                        var message = await Room.PlayersCh.SendTo(Player.Id,
+                        var message = await Room.PlayersMessageChannel.SendTo(Player.Id,
                             $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
                         MessageId = message.MessageId;
                     }
@@ -60,32 +60,32 @@ namespace MafiaTelegramBot.Game.GameRoles
                     if (Room.Players.ContainsKey(NightTargetId) && Room.Players.ContainsKey(NightTargetTwoId))
                     {
                         if (Math.Abs(Room.Players[NightTargetTwoId].CurrentRole.ColorRole - Room.Players[NightTargetId].CurrentRole.ColorRole) < 1)
-                            await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                            await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,
                                     $"{Room.Players[NightTargetId].NickName} & {Room.Players[NightTargetTwoId].NickName} - {strings.color_is_same}");
-                        else await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                        else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,
                             $"{Room.Players[NightTargetId].NickName} & {Room.Players[NightTargetTwoId].NickName} - {strings.color_is_different}"); 
                     }
-                    else await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
+                    else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 if (NightTargetId == -1)
                 {
                     NightTargetId = userId;
                     var targets = NightTargetList.Where(p => p.Id != NightTargetId).ToList();
-                    await Room.PlayersCh.EditTo(Player.ChatId, MessageId, strings.choose_second,
+                    await Room.PlayersMessageChannel.EditTo(Player.ChatId, MessageId, strings.choose_second,
                         Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
                 } 
                 
                 else if (NightTargetTwoId == -1)
                 {
                     NightTargetTwoId = userId;
-                    await Room.PlayersCh.EditTo(Player.ChatId, MessageId, $"{strings.choosed_targets} {Room.Players[NightTargetId].NickName} - {Room.Players[NightTargetTwoId].NickName}");
+                    await Room.PlayersMessageChannel.EditTo(Player.ChatId, MessageId, $"{strings.choosed_targets} {Room.Players[NightTargetId].NickName} - {Room.Players[NightTargetTwoId].NickName}");
                 }
             }
         }

+ 5 - 5
MafiaTelegramBot/Game/GameRoles/LawyerRole.cs

@@ -22,7 +22,7 @@ namespace MafiaTelegramBot.Game.GameRoles
             if(Player.IsAlive)
             {
                 NightTargetList = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id).ToList();
-                var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_check_role,
+                var message = await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.choose_player_to_check_role,
                     Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
                 MessageId = message.MessageId;
             }
@@ -43,20 +43,20 @@ namespace MafiaTelegramBot.Game.GameRoles
                             : roles.Villager;
                     if (KnownRoles.ContainsKey(NightTargetId)) KnownRoles[NightTargetId] = role;
                     else KnownRoles.Add(Room.Players[NightTargetId].Id, role);
-                    await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,
                         $"{strings.role_of_your_target} {Room.Players[NightTargetId].NickName} - {role}");
                 }
-                else await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
+                else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.this_player_left_from_game);
             }
         }
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
             }
         }
         public LawyerRole(GameRoom room, Player player) : base(room, player) { }

+ 5 - 5
MafiaTelegramBot/Game/GameRoles/MafiaRole.cs

@@ -22,7 +22,7 @@ namespace MafiaTelegramBot.Game.GameRoles
             {
                 Player.IsSpeaker = true;
                 var targets = Room.Players.Values.Where(p => p.IsAlive).ToList();
-                var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_kill,
+                var message = await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.choose_player_to_kill,
                     Keyboard.NightMafiaTargetKeyboard(targets, Player.Id));
                 MafiaMessageId = message.MessageId;
             }
@@ -33,15 +33,15 @@ namespace MafiaTelegramBot.Game.GameRoles
         {
             Player.IsSpeaker = false;
             if (MafiaTargetId == -1)
-                await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
         }
 
         public override async Task SetMafiaTarget(long userId)
         {
             MafiaTargetId = userId;
-            if (userId == -4) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
-            else if(!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
-            else await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+            if (userId == -4) await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
+            else if(!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
+            else await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
         }
 
         public MafiaRole(GameRoom room, Player player) : base(room, player) { }

+ 8 - 8
MafiaTelegramBot/Game/GameRoles/NecromancerRole.cs

@@ -26,9 +26,9 @@ namespace MafiaTelegramBot.Game.GameRoles
                 {
                     NightTargetList = Room.Players.Values.Where(p => !p.IsAlive).ToList();
                     var message = NightTargetList.Count > 0
-                        ? await Room.PlayersCh.SendTo(Player.Id, strings.choose_player_to_ressurect,
+                        ? await Room.PlayersMessageChannel.SendTo(Player.Id, strings.choose_player_to_ressurect,
                             Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id, true))
-                        : await Room.PlayersCh.SendTo(Player.Id, strings.nothing_to_ressurect);
+                        : await Room.PlayersMessageChannel.SendTo(Player.Id, strings.nothing_to_ressurect);
                     MessageId = message.MessageId;
                 }
             }
@@ -38,7 +38,7 @@ namespace MafiaTelegramBot.Game.GameRoles
         public override async Task ApplyNightActionResult()
         {
             if (_actionApplied || NightTargetId == -2) { }
-            else if (NightTargetId == -1) await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.you_have_not_choosen_target);
+            else if (NightTargetId == -1) await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.you_have_not_choosen_target);
             else if (NightTargetId != -3)
             {
                 _actionApplied = true;
@@ -48,7 +48,7 @@ namespace MafiaTelegramBot.Game.GameRoles
                         var parasiteTarget = ((ParasiteRole) Room.PlayersRole[Roles.Parasite][0].CurrentRole).ParentId;
                         if (Room.Players[parasiteTarget].IsAlive) Room.Players[NightTargetId].IsAlive = true;
                         else
-                            await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.player_parasit_with_dead_owner);
+                            await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.player_parasit_with_dead_owner);
                     }
                     else Room.Players[NightTargetId].IsAlive = true;
             }
@@ -56,14 +56,14 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else if (userId != -1)
             {
                 NightTargetId = userId;
-                if(userId == Player.Id) await Room.PlayersCh.EditTo(Player.Id, MessageId,strings.you_heal_yourself);
-                else await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
+                if(userId == Player.Id) await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,strings.you_heal_yourself);
+                else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[NightTargetId].NickName}");
             }
-            else await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.you_skip_vote);
+            else await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.you_skip_vote);
         }
         public NecromancerRole(GameRoom room, Player player) : base(room, player) { }
     }

+ 12 - 4
MafiaTelegramBot/Game/GameRoles/ParasiteRole.cs

@@ -26,10 +26,15 @@ namespace MafiaTelegramBot.Game.GameRoles
                 if (!_actionApplied)
                 {
                     NightTargetList = Room.Players.Values.Where(p => p.IsAlive && p.Id != Player.Id).ToList();
-                    var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_your_container,
+                    var message = await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.choose_your_container,
                         Keyboard.NightChooseTargetKeyboard(NightTargetList, Player.Id));
                     MessageId = message.MessageId;
                 }
+                else
+                {
+                    Player.IsSpeaker = true;
+                    Room.Players[ParentId].IsSpeaker = true;
+                }
             }
             else NightTargetId = -3;
         }
@@ -41,6 +46,8 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task ApplyNightActionResult()
         {
+            Player.IsSpeaker = true;
+            Room.Players[ParentId].IsSpeaker = true;
             if (!_actionApplied && NightTargetId != -2 && NightTargetId != -3)
             {
                 _actionApplied = true;
@@ -48,9 +55,10 @@ namespace MafiaTelegramBot.Game.GameRoles
                 ParentId = NightTargetId;
                 if (NightTargetId != -1)
                 {
-                    await Room.PlayersCh.SendTo(NightTargetId, $"{strings.you_have_been_chosen_by_the_parasite} {Player.NickName}");
+                    await Room.PlayersMessageChannel.SendTo(NightTargetId, $"{strings.you_have_been_chosen_by_the_parasite} {Player.NickName}");
                     KnownRoles.Add(NightTargetId, strings.container);
                     Room.Players[NightTargetId].CurrentRole.KnownRoles.Add(Player.Id, roles.Parasite);
+                    if (Room.Players[NightTargetId].CurrentRole.ColorRole == 2) Room.MafiaMessageChannel.AddPerson(Player);
                 }
                 else Player.IsAlive = false;
             }
@@ -68,11 +76,11 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task SetNightTarget(long userId)
         {
-            if (!Room.Players.ContainsKey(userId)) await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+            if (!Room.Players.ContainsKey(userId)) await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
             else
             {
                 NightTargetId = userId;
-                await Room.PlayersCh.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
+                await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
             }
         }
         public ParasiteRole(GameRoom room, Player player) : base(room, player) { }

+ 11 - 10
MafiaTelegramBot/Game/GameRoles/WerewolfRole.cs

@@ -26,7 +26,7 @@ namespace MafiaTelegramBot.Game.GameRoles
                 {
                     Player.IsSpeaker = true;
                     var targets = Room.Players.Values.Where(p => p.IsAlive).ToList();
-                    var message = await Room.PlayersCh.SendTo(Player.ChatId, strings.choose_player_to_kill,
+                    var message = await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.choose_player_to_kill,
                         Keyboard.NightMafiaTargetKeyboard(targets, Player.Id));
                     MafiaMessageId = message.MessageId;
                 }
@@ -40,7 +40,7 @@ namespace MafiaTelegramBot.Game.GameRoles
             {
                 Player.IsSpeaker = false;
                 if (MafiaTargetId == -1)
-                    await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_have_not_choosen_target);
             }
         }
 
@@ -49,11 +49,11 @@ namespace MafiaTelegramBot.Game.GameRoles
             if (IsMafia) return;
             ColorRole = 2;
             IsMafia = true;
-            var mafiaList = Room.Players.Values.Where(p => p.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame).ToDictionary(p=>p.Id, p => p.GetRoleName());
-            foreach (var player in mafiaList)
+            foreach (var (id, player) in Room.Players)
             {
-                Room.Players[player.Key].CurrentRole.KnownRoles.Add(Player.Id, Player.GetRoleName());
-                KnownRoles.Add(player.Key, player.Value);
+                if (player.GetRole() is not (Roles.Don or Roles.Mafia or Roles.Dame)) continue;
+                player.CurrentRole.KnownRoles.Add(Player.Id, Player.GetRoleName());
+                KnownRoles.Add(id, player.GetRoleName());
             }
             var mafia = Room.Players.Values.Where(player => player.GetRole() is Roles.Mafia).ToArray();
             var don = Room.Players.Values.FirstOrDefault(player => player.GetRole() is Roles.Don);
@@ -62,22 +62,23 @@ namespace MafiaTelegramBot.Game.GameRoles
             if (don != null) message += $"\n({don.TurnOrder}) {don.NickName} - {roles.Don}";
             if (dame != null) message += $"\n({dame.TurnOrder}) {dame.NickName} - {roles.Dame}";
             message = mafia.Aggregate(message, (current, player) => current + $"\n({player.TurnOrder}) {player.NickName}");
-            await Room.PlayersCh.SendTo(Player.Id, message);
+            Room.MafiaMessageChannel.AddPerson(Player);
+            await Room.PlayersMessageChannel.SendTo(Player.Id, message);
         }
 
         public override async Task SetMafiaTarget(long userId)
         {
             if (IsMafia)
             {
-                if (userId == -1) await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
+                if (userId == -1) await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.you_skip_vote);
                 else
                 {
                     if (!Room.Players.ContainsKey(userId))
-                        await Room.PlayersCh.SendTo(Player.Id, strings.this_player_left_from_game);
+                        await Room.PlayersMessageChannel.SendTo(Player.Id, strings.this_player_left_from_game);
                     else
                     {
                         MafiaTargetId = userId;
-                        await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId,
+                        await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId,
                             $"{strings.you_choose_target} {Room.Players[userId].NickName}");
                     }
                 }

+ 36 - 36
MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs

@@ -32,8 +32,8 @@ namespace MafiaTelegramBot.Game.GameRooms
         private async Task FirstDay()
         {
             IsDay = true;
-            await PlayersCh.SendSticker(Stickers.Sticker["Day"]);
-            await PlayersCh.Send(strings.first_day_message);
+            await PlayersMessageChannel.SendSticker(Stickers.Sticker["Day"]);
+            await PlayersMessageChannel.Send(strings.first_day_message);
             await Task.Run(async() =>
             {
                 var turnsCount = _turnOrder.Count;
@@ -42,7 +42,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 {
                     var player = _turnOrder.Dequeue();
                     if(!player.IsPlaying) continue;
-                    await PlayersCh.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
+                    await PlayersMessageChannel.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
                     if (TimerEnabled) await Bot.SendWithMarkdown2(player.ChatId, strings.you_turn_say);
                     await player.CurrentRole.SpeakAction();
                     if (firstPlayer != null && player.IsPlaying) _turnOrder.Enqueue(player);
@@ -90,8 +90,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                 }
                 //Stop updating games stats
                 
-                await PlayersCh.SendSticker(Stickers.Sticker["Night"]);
-                await PlayersCh.Send(strings.city_falls_asleep);
+                await PlayersMessageChannel.SendSticker(Stickers.Sticker["Night"]);
+                await PlayersMessageChannel.Send(strings.city_falls_asleep);
                 var mafia = Players.Values.Where(player => player.GetRole() is Roles.Mafia).ToArray();
                 var don = Players.Values.FirstOrDefault(player => player.GetRole() is Roles.Don);
                 var dame = Players.Values.FirstOrDefault(player => player.GetRole() is Roles.Dame);
@@ -99,7 +99,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 if (don != null) message += $"\n({don.TurnOrder}) {don.NickName} - {roles.Don}";
                 if (dame != null) message += $"\n({dame.TurnOrder}) {dame.NickName} - {roles.Dame}";
                 message = mafia.Aggregate(message, (current, player) => current + $"\n({player.TurnOrder}) {player.NickName}");
-                await _mafiaCh.Send(message);
+                await MafiaMessageChannel.Send(message);
                 var resetEvent = new ManualResetEvent(false);
                 var timer = new Timer
                 {
@@ -168,10 +168,10 @@ namespace MafiaTelegramBot.Game.GameRooms
             discussionTimer.Elapsed += async (_, _) =>
             {
                 foreach (var player in Players.Values) player.IsSpeaker = false;
-                await PlayersCh.Send(strings.day_discussion_ended);
+                await PlayersMessageChannel.Send(strings.day_discussion_ended);
                 discussionEnded.Set();
             };
-            await PlayersCh.Send(strings.disscution_time);
+            await PlayersMessageChannel.Send(strings.disscution_time);
             discussionTimer.Start();
             discussionEnded.WaitOne();
             
@@ -183,7 +183,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 if(!Players.ContainsKey(player.Id)) continue;
                 if (!player.IsBlocked && player.IsAlive)
                 {
-                    await PlayersCh.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
+                    await PlayersMessageChannel.Send($"{strings.now_turn} ({player.TurnOrder}) {player.NickName}");
                     if (TimerEnabled) await Bot.SendWithMarkdown2(player.ChatId, strings.you_turn_say);
                     await player.CurrentRole.SpeakAction();
                     if (Players.ContainsKey(player.Id)) await player.CurrentRole.VotingAction(VoteUpList.Count == 0);
@@ -197,8 +197,8 @@ namespace MafiaTelegramBot.Game.GameRooms
         private async Task NightPhase()
         {
             IsDay = false;
-            await PlayersCh.SendSticker(Stickers.Sticker["Night"]);
-            await PlayersCh.Send(strings.city_falls_asleep);
+            await PlayersMessageChannel.SendSticker(Stickers.Sticker["Night"]);
+            await PlayersMessageChannel.Send(strings.city_falls_asleep);
             await Task.Run(async () =>
             {
                 var resetEvent = new ManualResetEvent(false);
@@ -270,11 +270,11 @@ namespace MafiaTelegramBot.Game.GameRooms
                             if(!alive && Players[id].GetRole() is Roles.Don or Roles.Dame or Roles.Mafia
                                       && PlayersRole.ContainsKey(Roles.Werewolf) && PlayersRole[Roles.Werewolf].Count == 1)
                                 await ((WerewolfRole) PlayersRole[Roles.Werewolf][0].CurrentRole).TransformToMafia();
-                            await PlayersCh.SendTo(id, alive ? strings.you_will_be_ressurected : strings.you_will_be_killed);
+                            await PlayersMessageChannel.SendTo(id, alive ? strings.you_will_be_ressurected : strings.you_will_be_killed);
                         }
                 message += '\n' + mafiaNotAgree;
-                await PlayersCh.SendSticker(Stickers.Sticker["Day"]);
-                await PlayersCh.Send(message);
+                await PlayersMessageChannel.SendSticker(Stickers.Sticker["Day"]);
+                await PlayersMessageChannel.Send(message);
             });
         }
 
@@ -290,7 +290,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     await voter.CurrentRole.VotingAction(contendersCopy.Where(p => Players.ContainsKey(p.Id)).ToList());
                 var timer = new Timer {Interval = Constants.VOTE_KILL_INTERVAL, AutoReset = false};
                 var resetEvent = new ManualResetEvent(false);
-                timer.Elapsed += async(_, _) =>
+                timer.Elapsed += async (_, _) =>
                 {
                     foreach (var voter in votersPlayers.Where(p => !VoteKillList.ContainsKey(p.Id) && Players.ContainsKey(p.Id)))
                         await voter.CurrentRole.RandomVoting();
@@ -308,7 +308,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 switch (VoteUpList.Count)
                 {
                     case 0:
-                        await PlayersCh.Send(strings.nothing_up_to_vote);
+                        await PlayersMessageChannel.Send(strings.nothing_up_to_vote);
                         break;
                     case 1:
                     {
@@ -322,7 +322,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                         switch (VoteUpList.Count)
                         {
                             case 0:
-                                await PlayersCh.Send(strings.nothing_up_to_dispatch);
+                                await PlayersMessageChannel.Send(strings.nothing_up_to_dispatch);
                                 break;
                             case 1:
                                 await VoteUpList[0].CurrentRole.Dispatch();
@@ -338,13 +338,13 @@ namespace MafiaTelegramBot.Game.GameRooms
                                 switch (VoteUpList.Count)
                                 {
                                     case 0:
-                                        await PlayersCh.Send(strings.nothing_up_to_dispatch);
+                                        await PlayersMessageChannel.Send(strings.nothing_up_to_dispatch);
                                         break;
                                     case 1:
                                         await VoteUpList[0].CurrentRole.Dispatch();
                                         break;
                                     default:
-                                        await PlayersCh.Send(strings.villagers_could_not_decide);
+                                        await PlayersMessageChannel.Send(strings.villagers_could_not_decide);
                                         foreach (var alive in VoteUpList) 
                                             alive.ElderRoleAchievementEvent();
                                         break;
@@ -369,7 +369,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                            $"({Players[targetId].TurnOrder}) {Players[targetId].NickName}" : "";
             }
             if (message == strings.results_of_voting) message = strings.no_one_voted;
-            await PlayersCh.Send(message);
+            await PlayersMessageChannel.Send(message);
             
             var votes = VoteUpList.Where(p=>Players.ContainsKey(p.Id))
                 .GroupBy(p => p.Id)
@@ -391,8 +391,8 @@ namespace MafiaTelegramBot.Game.GameRooms
             {
                 if (targetId == 0)
                 {
-                    if (!toKill) await PlayersCh.SendExcept(playerId, $"{Players[playerId].NickName} {strings.skip_vote}");
-                    await PlayersCh.EditTo(playerId, messageId, strings.you_skip_vote);
+                    if (!toKill) await PlayersMessageChannel.SendExcept(playerId, $"{Players[playerId].NickName} {strings.skip_vote}");
+                    await PlayersMessageChannel.EditTo(playerId, messageId, strings.you_skip_vote);
                 }
                 else
                 {
@@ -404,13 +404,13 @@ namespace MafiaTelegramBot.Game.GameRooms
                             {
                                 if (playerId != targetId)
                                 {
-                                    await PlayersCh.SendExcept(playerId, $"{Players[playerId].NickName} {strings.put_up_vote_to} {Players[targetId].NickName}");
-                                    await PlayersCh.EditTo(playerId, messageId, $"{strings.you_vote_player} {Players[targetId].NickName}");
+                                    await PlayersMessageChannel.SendExcept(playerId, $"{Players[playerId].NickName} {strings.put_up_vote_to} {Players[targetId].NickName}");
+                                    await PlayersMessageChannel.EditTo(playerId, messageId, $"{strings.you_vote_player} {Players[targetId].NickName}");
                                 }
                                 else
                                 {
-                                    await PlayersCh.SendExcept(playerId, $"{Players[playerId].NickName} {strings.vote_to_self}");
-                                    await PlayersCh.EditTo(playerId, messageId, strings.you_vote_to_self);
+                                    await PlayersMessageChannel.SendExcept(playerId, $"{Players[playerId].NickName} {strings.vote_to_self}");
+                                    await PlayersMessageChannel.EditTo(playerId, messageId, strings.you_vote_to_self);
                                 }
                             }
                         } 
@@ -420,15 +420,15 @@ namespace MafiaTelegramBot.Game.GameRooms
                             if (messageId != -1)
                             {
                                 if (playerId != targetId)
-                                    await PlayersCh.EditTo(playerId, messageId, $"{strings.you_vote_to_kill} {Players[targetId].NickName}");
+                                    await PlayersMessageChannel.EditTo(playerId, messageId, $"{strings.you_vote_to_kill} {Players[targetId].NickName}");
                                 else
-                                    await PlayersCh.EditTo(playerId, messageId, strings.you_vote_to_kill_self);
+                                    await PlayersMessageChannel.EditTo(playerId, messageId, strings.you_vote_to_kill_self);
                             }
                         }
                     }
                 }   
             }
-            else await PlayersCh.SendTo(playerId, strings.this_player_left_from_game);
+            else await PlayersMessageChannel.SendTo(playerId, strings.this_player_left_from_game);
         }
 
         private async Task EndOfGame()
@@ -449,8 +449,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                 
                 if (aliveMafia == 0)
                 {
-                    await PlayersCh.Send(strings.villagers_won + additionalResult, exceptDied: false);
-                    await PlayersCh.SendSticker(Stickers.Sticker["VillagerWins"]);
+                    await PlayersMessageChannel.Send(strings.villagers_won + additionalResult);
+                    await PlayersMessageChannel.SendSticker(Stickers.Sticker["VillagerWins"]);
                 }
                 else
                 {
@@ -460,8 +460,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                                      PlayersRole[Roles.Werewolf][0];
                         player.LawyerRoleAchievementEvent();
                     }
-                    await PlayersCh.Send(strings.mafia_won + additionalResult, exceptDied: false);
-                    await PlayersCh.SendSticker(Stickers.Sticker["MafiaWins"]);
+                    await PlayersMessageChannel.Send(strings.mafia_won + additionalResult);
+                    await PlayersMessageChannel.SendSticker(Stickers.Sticker["MafiaWins"]);
                 }
                 if (PlayersRole.ContainsKey(Roles.Fool) && PlayersRole[Roles.Fool].Count == 1)
                     await PlayersRole[Roles.Fool][0].CurrentRole.IsWon();
@@ -478,9 +478,9 @@ namespace MafiaTelegramBot.Game.GameRooms
                     statsQueryOpenRoles += $" id = {player.Id} OR";
                 }
                 
-                await PlayersCh.Send(rolesMessage);
+                await PlayersMessageChannel.Send(rolesMessage);
                 
-                //var updatingNotifications = await PlayersCh.SendWithReturn("Update data! Wait until it disappears");
+                //var updatingNotifications = await Ch.SendWithReturn("Update data! Wait until it disappears");
                 
                 statsQueryStats = statsQueryStats.Substring(0, statsQueryStats.Length - 2);
                 statsQueryOpenRoles = statsQueryOpenRoles.Substring(0, statsQueryOpenRoles.Length - 2);
@@ -580,7 +580,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);
+                    await PlayersMessageChannel.SendExcept(Owner.Id, strings.thanks_for_game, Keyboard.PlayerGameMenu);
                 }
                 if (Players.Count <= Constants.MEMORY_CLEANER_INTERVAL) StartTimer();
             });

+ 25 - 54
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageChannels.cs

@@ -1,3 +1,4 @@
+using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Models;
@@ -9,24 +10,11 @@ namespace MafiaTelegramBot.Game.GameRooms
 {
     public partial class GameRoom
     {
-        public abstract class Channel
+        public class Channel
         {
             protected readonly GameRoom Room;
-
-            protected Channel(GameRoom room)
-            {
-                Room = room;
-            }
-
-            public abstract Task Send(string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = false);
-
-            public abstract Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = false);
-        }
-
-        public class PlayersChannel : Channel
-        {
+            protected IEnumerable<Player> Players;
+            
             public async Task<Message> SendTo(long userId, string message, IReplyMarkup replyMarkup = null)
             {
                 if(Room.Players.ContainsKey(userId)) return await Bot.SendWithMarkdown2(Room.Players[userId].ChatId, message, replyMarkup);
@@ -38,65 +26,48 @@ namespace MafiaTelegramBot.Game.GameRooms
                 if(Room.Players.ContainsKey(userId)) await Bot.EditMessageAsync(Room.Players[userId].ChatId, messageId, message, replyMarkup);
             }
             
-            public override async Task Send(string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = false)
+            public async Task Send(string message, IReplyMarkup replyMarkup = null)
             {
-                var receivers = exceptDied
-                    ? Room.Players.Values.Where(p => p.IsAlive)
-                    : Room.Players.Values;
-                foreach (var player in receivers)
+                foreach (var player in Players)
                     await Bot.SendWithMarkdown2(player.ChatId, message, replyMarkup);
             }
 
-            public override async Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null, bool exceptDied = false)
+            public async Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null)
             {
-                var receivers = exceptDied
-                    ? Room.Players.Values.Where(p => p.Id != playerId && p.IsAlive)
-                    : Room.Players.Values.Where(p => p.Id != playerId);
-                foreach (var player in receivers)
-                    await Bot.SendWithMarkdown2(player.ChatId, message, replyMarkup);
+                foreach (var player in Players)
+                    if (player.Id != playerId) await Bot.SendWithMarkdown2(player.ChatId, message, replyMarkup);
             }
 
-            public async Task SendSticker(string fileId, bool exceptDied = false)
+            public async Task SendSticker(string fileId)
             {
-                var receivers = exceptDied
-                    ? Room.Players.Values.Where(p => p.IsAlive)
-                    : Room.Players.Values;
-                foreach (var player in receivers)
+                foreach (var player in Players)
                     await Bot.SendStickerAsync(player.ChatId, fileId);
             }
 
-            public PlayersChannel(GameRoom room) : base(room)
+            public void Remove(long playerId)
             {
+                Players = Players.Where(p => p.Id != playerId);
             }
-        }
 
-        public class MafiaChannel : Channel
-        {
-            public override async Task Send(string message, IReplyMarkup replyMarkup = null, bool exceptDied = false)
+            public Channel(GameRoom room)
             {
-                var mafia = exceptDied
-                    ? Room.Players.Values.Where(p => p.GetRole() is Roles.Don or Roles.Mafia && p.IsAlive)
-                    : Room.Players.Values.Where(p => p.GetRole() is Roles.Don or Roles.Mafia);
-                var receivers = exceptDied ? mafia : mafia.Where(p => p.IsAlive);
-                foreach (var player in receivers)
-                    await Bot.SendWithMarkdown2(player.ChatId, message, replyMarkup);
+                Room = room;
+                Players = room.Players.Values;
             }
+        }
 
-            public override async Task SendExcept(long playerId, string message, IReplyMarkup replyMarkup = null,
-                bool exceptDied = false)
+        public class MafiaChannel : Channel
+        {
+            public MafiaChannel(GameRoom room) : base(room)
             {
-                var except = exceptDied
-                    ? Room.Players.Values.Where(p => p.Id != playerId && p.IsAlive)
-                    : Room.Players.Values.Where(p => p.Id != playerId);
-                var mafia = except.Where(p => p.GetRole() is Roles.Don or Roles.Mafia);
-                var receivers = exceptDied ? mafia : mafia.Where(p => p.IsAlive);
-                foreach (var player in receivers)
-                    await Bot.SendWithMarkdown2(player.ChatId, message, replyMarkup);
+                Players = room.Players.Values.Where(p => p.GetRole() is Roles.Don or Roles.Mafia or Roles.Dame);
             }
 
-            public MafiaChannel(GameRoom room) : base(room)
+            public void AddPerson(Player player)
             {
+                var list = Players.ToList();
+                list.Add(player);
+                Players = list;
             }
         }
     }

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

@@ -32,25 +32,12 @@ namespace MafiaTelegramBot.Game.GameRooms
                 else if (text == keyboard.end_turn)
                 {
                     if (_room.IsDay && _room.Players[userId].IsSpeaker) _room.Players[userId].CurrentRole.TalkingActionComplete.Set();
-                    else await _room.PlayersCh.SendTo(userId, strings.now_is_not_your_turn);
+                    else await _room.PlayersMessageChannel.SendTo(userId, strings.now_is_not_your_turn);
                 }
-                else await ForwardMessage(_room.Players[userId], text);
+                else await _room.ForwardMessage(_room.Players[userId], text);
                 return update.Message;
             }
 
-            private async Task ForwardMessage(Player player, string message)
-            {
-                if(!_room.IsRunning) await _room.PlayersCh.SendExcept(player.Id, $"{player.NickName}: {message}");
-                else
-                {
-                    if (!player.IsAlive) await _room.PlayersCh.SendTo(player.Id, strings.you_now_died);
-                    else if (player.IsBlocked) await _room.PlayersCh.SendTo(player.Id, strings.you_blocked);
-                    else if (!player.IsSpeaker) await _room.PlayersCh.SendTo(player.Id, strings.now_you_cant_speak);
-                    else if (_room.IsDay) await _room.PlayersCh.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
-                    else await _room._mafiaCh.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
-                }
-            }
-
             private async Task LookPlayers(Player player)
             {
                 var players = _room.Players.Values.ToArray();
@@ -73,7 +60,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                         $"({(players[i].IsAlive ? strings.alive : strings.died)}) " +
                         $"{role}";
                 }
-                await _room.PlayersCh.SendTo(player.Id, message);
+                await _room.PlayersMessageChannel.SendTo(player.Id, message);
             }
 
             private async Task Leave(Player player, string text = "")
@@ -94,7 +81,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     else
                     {
                         _exitingPlayers.Add(player.Id);
-                        await _room.PlayersCh.SendTo(player.ChatId, $"{strings.confirm_exit} ```{strings.exit}``` {strings.to_confirm_exit}");
+                        await _room.PlayersMessageChannel.SendTo(player.ChatId, $"{strings.confirm_exit} ```{strings.exit}``` {strings.to_confirm_exit}");
                     }
                 }
             }

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

@@ -43,7 +43,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     if (value > 0) message += $"\n{roles.ResourceManager.GetString(key.ToString())} - {value}";
                     Settings.Remove(key);
                 }
-                await PlayersCh.Send(message);
+                await PlayersMessageChannel.Send(message);
                 for (var i = 0; i < _turnOrder.Count; ++i)
                 {
                     var user = _turnOrder.Dequeue();

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

@@ -46,7 +46,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                         await ((DetectiveRole) player.CurrentRole).SetNightTarget(long.Parse(data[2]), data[3]);
                         break;
                     default:
-                        await _room.PlayersCh.SendTo(chatId, strings.not_supported_in_game);
+                        await _room.PlayersMessageChannel.SendTo(chatId, strings.not_supported_in_game);
                         break;
                 }
             }

+ 19 - 19
MafiaTelegramBot/Game/GameRooms/GameRoom.Role.cs

@@ -41,16 +41,16 @@ namespace MafiaTelegramBot.Game.GameRooms
             {
                 if (MessageId != -1)
                 {
-                    await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.activity_blocked);
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.activity_blocked);
                     NightTargetId = -2;
                 }
                 if (MafiaMessageId != -1)
                 {
                     Player.IsSpeaker = false;
-                    await Room.PlayersCh.EditTo(Player.Id, MafiaMessageId, strings.activity_blocked);
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MafiaMessageId, strings.activity_blocked);
                     MafiaTargetId = -2;
                 }
-                await Room.PlayersCh.SendTo(Player.ChatId, message);
+                await Room.PlayersMessageChannel.SendTo(Player.ChatId, message);
             }
 
             public virtual async Task<string> IsWon()
@@ -63,18 +63,18 @@ namespace MafiaTelegramBot.Game.GameRooms
                     && Room.PlayersRole[Roles.Hooker].Count == 1 
                     && Room.PlayersRole[Roles.Hooker][0].CurrentRole.NightTargetId == Player.Id)
                 {
-                    await Room.PlayersCh.SendExcept(Player.Id, $"{strings.villagers_want_dispatch} {Player.NickName}, {strings.player_not_died_he_has_alibi}");
+                    await Room.PlayersMessageChannel.SendExcept(Player.Id, $"{strings.villagers_want_dispatch} {Player.NickName}, {strings.player_not_died_he_has_alibi}");
                 }
                 else
                 {
                     if (!Player.IsBlocked)
                     {
-                        await Room.PlayersCh.SendExcept(Player.Id, $"{strings.to_player} {Player.NickName} {strings.issued_posthumous_minute}");
-                        await Room.PlayersCh.SendTo(Player.ChatId, strings.you_will_be_dispatched);
+                        await Room.PlayersMessageChannel.SendExcept(Player.Id, $"{strings.to_player} {Player.NickName} {strings.issued_posthumous_minute}");
+                        await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.you_will_be_dispatched);
                         await SpeakAction(enableTimer: true);
                     }
                     await Kill();
-                    await Room.PlayersCh.Send($"({Player.TurnOrder}) {Player.NickName} {strings.dispatched}");
+                    await Room.PlayersMessageChannel.Send($"({Player.TurnOrder}) {Player.NickName} {strings.dispatched}");
                     if(RoleKey == Roles.Cop) Player.FoolRoleAchievementEvent();
                 }
             }
@@ -87,8 +87,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                     && ((ParasiteRole) Room.PlayersRole[Roles.Parasite][0].CurrentRole).ParentId == Player.Id)
                 {
                     await Room.PlayersRole[Roles.Parasite][0].CurrentRole.Kill();
-                    if(Room.IsDay) await Room.PlayersCh.Send($"{strings.for_unknown_reasons_died} {Room.PlayersRole[Roles.Parasite][0].NickName}");
-                    await Room.PlayersCh.SendTo(Room.PlayersRole[Roles.Parasite][0].Id,
+                    if(Room.IsDay) await Room.PlayersMessageChannel.Send($"{strings.for_unknown_reasons_died} {Room.PlayersRole[Roles.Parasite][0].NickName}");
+                    await Room.PlayersMessageChannel.SendTo(Room.PlayersRole[Roles.Parasite][0].Id,
                         strings.your_carrier_player_has_died);
                 }
             }
@@ -99,12 +99,12 @@ namespace MafiaTelegramBot.Game.GameRooms
                 if (inGamePlayers.Length == 0)
                 {
                     NightTargetId = -1;
-                    await Room.PlayersCh.EditTo(Player.Id, MessageId, strings.nothing_to_choose);
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId, strings.nothing_to_choose);
                 }
                 else
                 {
                     NightTargetId = NightTargetList[Utilities.Rnd.Next(NightTargetList.Count)].Id;
-                    await Room.PlayersCh.EditTo(Player.Id, MessageId,
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, MessageId,
                         $"{strings.automatically_choosed_target} {Room.Players[NightTargetId].NickName}");
                 }
             }
@@ -117,7 +117,7 @@ namespace MafiaTelegramBot.Game.GameRooms
 
             public async Task SpeakAction(int interval = Constants.SPEAK_INTERVAL, bool enableTimer = false)
             {
-                await Room.PlayersCh.SendTo(Player.ChatId, $"{strings.your_turn}", Keyboard.InGamePlayerMenuWithEndTurn);
+                await Room.PlayersMessageChannel.SendTo(Player.ChatId, $"{strings.your_turn}", Keyboard.InGamePlayerMenuWithEndTurn);
                 Player.IsSpeaker = true;
                 var timer = new Timer(interval) {AutoReset = false};
                 timer.Elapsed += (_, _) => TalkingActionComplete.Set();
@@ -125,7 +125,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                 TalkingActionComplete.WaitOne();
                 if (Room.TimerEnabled || enableTimer) timer.Stop();
                 TalkingActionComplete.Reset();
-                await Room.PlayersCh.SendTo(Player.ChatId, strings.your_turn_ended, Keyboard.InGamePlayerMenu);
+                await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.your_turn_ended, Keyboard.InGamePlayerMenu);
                 Player.IsSpeaker = false;
             }
 
@@ -133,7 +133,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             {
                 var voteTimer = new Timer(Constants.PUT_UP_VOTE_INTERVAL) {AutoReset = false};
                 var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).Except(Room.VoteUpList).ToList();
-                var message = await Room.PlayersCh.SendTo(Player.ChatId,
+                var message = await Room.PlayersMessageChannel.SendTo(Player.ChatId,
                     $"{strings.put_up_vote}\n{strings.you_have_twenty_seconds}{(isFirst ? "\n" + strings.user_not_choose : "")}",  
                     Keyboard.VoteKeyboard(alivePlayers, Player.Id, !isFirst));
                 voteTimer.Elapsed += async (_, _) =>
@@ -153,26 +153,26 @@ namespace MafiaTelegramBot.Game.GameRooms
             private List<Player> _votingTargetsList;
             public async Task VotingAction(List<Player> targets)
             {
-                _votingMessageId = (await Room.PlayersCh.SendTo(Player.Id, strings.you_have_ten_seconds_to_vote, 
+                _votingMessageId = (await Room.PlayersMessageChannel.SendTo(Player.Id, strings.you_have_ten_seconds_to_vote, 
                     Keyboard.VoteKeyboard(targets, Player.Id, false, Callback.VoteToKill))).MessageId;
                 _votingTargetsList = targets;
             }
             public async Task RandomVoting()
             {
                 var players = _votingTargetsList.Where(p => Room.Players.ContainsKey(p.Id)).ToArray();
-                if(players.Length == 0) await Room.PlayersCh.EditTo(Player.Id, _votingMessageId, strings.nothing_to_choose);
+                if(players.Length == 0) await Room.PlayersMessageChannel.EditTo(Player.Id, _votingMessageId, strings.nothing_to_choose);
                 else
                 {
                     var randomPlayer = players[Utilities.Rnd.Next(players.Length)];
                     await Room.PutUpVote(Player.Id, randomPlayer.Id, toKill: true);
-                    await Room.PlayersCh.EditTo(Player.Id, _votingMessageId, $"{strings.automatically_vote} ({randomPlayer.TurnOrder}) {randomPlayer.NickName}");
+                    await Room.PlayersMessageChannel.EditTo(Player.Id, _votingMessageId, $"{strings.automatically_vote} ({randomPlayer.TurnOrder}) {randomPlayer.NickName}");
                 }
             }
 
             public async Task DefenceAction()
             {
-                await Room.PlayersCh.SendExcept(Player.Id, $"{strings.now_defence} ({Player.TurnOrder}) {Player.NickName}");
-                await Room.PlayersCh.SendTo(Player.ChatId, strings.you_have_eigty_seconds_to_defence);
+                await Room.PlayersMessageChannel.SendExcept(Player.Id, $"{strings.now_defence} ({Player.TurnOrder}) {Player.NickName}");
+                await Room.PlayersMessageChannel.SendTo(Player.ChatId, strings.you_have_eigty_seconds_to_defence);
                 await SpeakAction(Constants.DEFENCE_INTERVAL);
             }
             public static Role GetNewRoleInstance(Roles roleKey, GameRoom room, Player player)

+ 36 - 9
MafiaTelegramBot/Game/GameRooms/GameRoom.Structure.cs

@@ -19,15 +19,15 @@ namespace MafiaTelegramBot.Game.GameRooms
         public string RoomName { get; init; } = "NoNameRoom";
         public Player Owner { get; init; } = new();
 
-        private Timer WaitingPlayers;
-        
-        public List<Player> VoteUpList = new();
-        public readonly Dictionary<long, long> VoteKillList = new();
+        private Timer _waitingPlayers;
+
+        private List<Player> VoteUpList = new();
+        private readonly Dictionary<long, long> VoteKillList = new();
 
         public readonly MessageHandler MHandler;
         public readonly QueryHandler QHandler;
-        private readonly MafiaChannel _mafiaCh;
-        public readonly PlayersChannel PlayersCh;
+        public readonly MafiaChannel MafiaMessageChannel;
+        public readonly Channel PlayersMessageChannel;
 
         private readonly Queue<Player> _turnOrder = new();
 
@@ -42,8 +42,8 @@ namespace MafiaTelegramBot.Game.GameRooms
             IsDay = false;
             MHandler = new MessageHandler(this);
             QHandler = new QueryHandler(this);
-            _mafiaCh = new MafiaChannel(this);
-            PlayersCh = new PlayersChannel(this);
+            MafiaMessageChannel = new MafiaChannel(this);
+            PlayersMessageChannel = new Channel(this);
         }
         public async Task<List<Player>> GetPlayers()
         {
@@ -66,7 +66,7 @@ namespace MafiaTelegramBot.Game.GameRooms
             var message = Owner.Id == player.Id
                 ? $"{player.NickName} ({strings.room_owner}) {strings.leave_from_game}"
                 : $"{player.NickName} {strings.leave_from_game}";
-            await PlayersCh.Send(message);
+            await PlayersMessageChannel.Send(message);
             if (IsRunning)
             {
                 if (IsDay && player.IsSpeaker) player.CurrentRole.TalkingActionComplete.Set();
@@ -88,6 +88,33 @@ namespace MafiaTelegramBot.Game.GameRooms
             player.ResetState();
         }
 
+        private async Task ForwardMessage(Player player, string message)
+        {
+            if(!IsRunning) await PlayersMessageChannel.SendExcept(player.Id, $"{player.NickName}: {message}");
+            else
+            {
+                if (!player.IsAlive) await PlayersMessageChannel.SendTo(player.Id, strings.you_now_died);
+                else if (player.IsBlocked) await PlayersMessageChannel.SendTo(player.Id, strings.you_blocked);
+                else if (!player.IsSpeaker) await PlayersMessageChannel.SendTo(player.Id, strings.now_you_cant_speak);
+                else if (IsDay) await PlayersMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
+                else
+                {
+                    if (player.CurrentRole.ColorRole == 2)
+                        await MafiaMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
+                    else if (player.GetRole() is Roles.Parasite)
+                    {
+                        var parasiteRole = player.CurrentRole as ParasiteRole;
+                        await PlayersMessageChannel.SendTo(parasiteRole!.ParentId, $"({player.TurnOrder}) {player.NickName}: {message}");
+                    }
+                    else
+                    {
+                        await PlayersMessageChannel.SendTo(Players.Values.First(p => p.GetRole() is Roles.Parasite).Id, 
+                            $"({player.TurnOrder}) {player.NickName}: {message}");
+                    }
+                }
+            }
+        }
+
         public async Task<int> GetCapacity()
         {
             return await Task.FromResult(Players.Count);

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

@@ -12,20 +12,20 @@ namespace MafiaTelegramBot.Game.GameRooms
         public void SetTimer()
         {
             _minutes = 0;
-            WaitingPlayers = new System.Timers.Timer(60000);
-            WaitingPlayers.Elapsed += async (_ , _) => { await Remove(); };
-            WaitingPlayers.Enabled = true;
+            _waitingPlayers = new System.Timers.Timer(60000);
+            _waitingPlayers.Elapsed += async (_ , _) => { await Remove(); };
+            _waitingPlayers.Enabled = true;
         }
         
         public void StopTimer()
         {
-            WaitingPlayers.Stop();
+            _waitingPlayers.Stop();
         }
 
         public void StartTimer()
         {
             _minutes = 0;
-            WaitingPlayers.Start();
+            _waitingPlayers.Start();
         }
         
         private async Task Remove()
@@ -56,8 +56,8 @@ namespace MafiaTelegramBot.Game.GameRooms
         
         public void DeleteTimer()
         {
-            WaitingPlayers.Stop();
-            WaitingPlayers.Dispose();    
+            _waitingPlayers.Stop();
+            _waitingPlayers.Dispose();    
         }
     }
 }