Pārlūkot izejas kodu

Add roles classes

Tigran 4 gadi atpakaļ
vecāks
revīzija
e4c7467508
44 mainītis faili ar 362 papildinājumiem un 205 dzēšanām
  1. 2 2
      MafiaTelegramBot.sln.DotSettings.user
  2. 1 1
      MafiaTelegramBot/Controllers/RoomController.cs
  3. 17 0
      MafiaTelegramBot/Game/GameRoles/BodyguardRole.cs
  4. 8 1
      MafiaTelegramBot/Game/GameRoles/CopRole.cs
  5. 17 0
      MafiaTelegramBot/Game/GameRoles/DameRole.cs
  6. 17 0
      MafiaTelegramBot/Game/GameRoles/DetectiveRole.cs
  7. 7 1
      MafiaTelegramBot/Game/GameRoles/DoctorRole.cs
  8. 10 1
      MafiaTelegramBot/Game/GameRoles/DonRole.cs
  9. 17 0
      MafiaTelegramBot/Game/GameRoles/ElderRole.cs
  10. 17 0
      MafiaTelegramBot/Game/GameRoles/FoolRole.cs
  11. 6 0
      MafiaTelegramBot/Game/GameRoles/HookerRole.cs
  12. 17 0
      MafiaTelegramBot/Game/GameRoles/JournalistRole.cs
  13. 17 0
      MafiaTelegramBot/Game/GameRoles/LawyerRole.cs
  14. 12 1
      MafiaTelegramBot/Game/GameRoles/MafiaRole.cs
  15. 17 0
      MafiaTelegramBot/Game/GameRoles/NecromancerRole.cs
  16. 4 19
      MafiaTelegramBot/Game/GameRoles/NoneRole.cs
  17. 17 0
      MafiaTelegramBot/Game/GameRoles/ParasiteRole.cs
  18. 4 19
      MafiaTelegramBot/Game/GameRoles/VillagerRole.cs
  19. 17 0
      MafiaTelegramBot/Game/GameRoles/WerewolfRole.cs
  20. 11 9
      MafiaTelegramBot/Game/GameRooms/ExtendedGameRoom.cs
  21. 2 2
      MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs
  22. 47 48
      MafiaTelegramBot/Game/GameRooms/GameRoom.MessageHandler.cs
  23. 1 1
      MafiaTelegramBot/Game/GameRooms/GameRoom.PrepareRoom.cs
  24. 14 3
      MafiaTelegramBot/Game/GameRooms/GameRoom.Role.cs
  25. 3 2
      MafiaTelegramBot/Game/GameRooms/NormalGameRoom.cs
  26. 1 1
      MafiaTelegramBot/Models/Commands/ConnectGameCommand.cs
  27. 1 1
      MafiaTelegramBot/Models/Commands/CreateGameCommand.cs
  28. 1 1
      MafiaTelegramBot/Models/Commands/CustomMessageHandlers/CreateRoomHandler.cs
  29. 1 1
      MafiaTelegramBot/Models/Commands/CustomMessageHandlers/EnterCodeHandler.cs
  30. 1 1
      MafiaTelegramBot/Models/Commands/DissolveRoomCommand.cs
  31. 1 1
      MafiaTelegramBot/Models/Commands/KickPlayerCommand.cs
  32. 1 1
      MafiaTelegramBot/Models/Commands/LeaveCommand.cs
  33. 2 2
      MafiaTelegramBot/Models/Commands/RoomSettingsCommand.cs
  34. 1 1
      MafiaTelegramBot/Models/Commands/ShowProfileCommand.cs
  35. 4 4
      MafiaTelegramBot/Models/Commands/StartCommand.cs
  36. 1 1
      MafiaTelegramBot/Models/Inlines/ConnectToPublicRoomQuery.cs
  37. 1 1
      MafiaTelegramBot/Models/Inlines/ConnectToSelectedRoomQuery.cs
  38. 1 1
      MafiaTelegramBot/Models/Inlines/KickSelectedPlayerQuery.cs
  39. 1 1
      MafiaTelegramBot/Models/Inlines/MakePrivateRoomQuery.cs
  40. 1 1
      MafiaTelegramBot/Models/Inlines/MakePublicRoomQuery.cs
  41. 1 1
      MafiaTelegramBot/Models/Inlines/SettingsProfileQuery.cs
  42. 3 5
      MafiaTelegramBot/Resources/Keyboard.cs
  43. 34 70
      MafiaTelegramBot/Resources/keyboard.Designer.cs
  44. 3 0
      MafiaTelegramBot/Resources/keyboard.resx

+ 2 - 2
MafiaTelegramBot.sln.DotSettings.user

@@ -1,12 +1,12 @@
 <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=MafiaTelegramBot_002Fappsettings/@EntryIndexedValue">True</s:Boolean>
 	
-	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=MafiaTelegramBot_002FResources_002Fkeyboard/@EntryIndexedValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=MafiaTelegramBot_002FResources_002Fkeyboard/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=MafiaTelegramBot_002FResources_002Froles/@EntryIndexedValue">False</s:Boolean>
 	
 	
 	
-	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=MafiaTelegramBot_002FResources_002Fstrings/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=MafiaTelegramBot_002FResources_002Fstrings/@EntryIndexedValue">False</s:Boolean>
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=MafiaTelegramBot_002Fstrings/@EntryIndexedValue">True</s:Boolean>
 	
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean>

+ 1 - 1
MafiaTelegramBot/Controllers/RoomController.cs

@@ -79,7 +79,7 @@ namespace MafiaTelegramBot.Controllers
             {
                 if (OpenedGames.ContainsKey(roomKey))
                 {
-                    await OpenedGames[roomKey].PlayersCh.Send(strings.room_dissolved, Keyboards.MainMenu);
+                    await OpenedGames[roomKey].PlayersCh.Send(strings.room_dissolved, Keyboard.MainMenu);
                     foreach (var player in OpenedGames[roomKey].Players.Values) await player.RemoveGame();
                     RoomEncrypter.RemoveCode(OpenedGames[roomKey].RoomName);
                     OpenedGames.Remove(roomKey);

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/BodyguardRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class BodyguardRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Bodyguard;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public BodyguardRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 8 - 1
MafiaTelegramBot/Game/GameRoles/CopRole.cs

@@ -13,9 +13,10 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task NightAction()
         {
+            NightTargetId = -1;
             var targets = Room.Players.Values.Except(KnownRoles).Where(p => p.IsAlive).ToList();
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_check_role, 
-                Keyboards.NightChooseTargetKeyboard(targets, Player.Id));
+                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
             MessageId = message.MessageId;
         }
 
@@ -34,6 +35,12 @@ namespace MafiaTelegramBot.Game.GameRoles
             }
         }
 
+        public override Task CancelNightActionResult(string message)
+        {
+            //TODO why action canceled
+            return Task.CompletedTask;
+        }
+
         public override Task<Message> SetNightTarget(long userId)
         {
             NightTargetId = userId;

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/DameRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class DameRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Dame;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public DameRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/DetectiveRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class DetectiveRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Detective;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public DetectiveRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 7 - 1
MafiaTelegramBot/Game/GameRoles/DoctorRole.cs

@@ -15,7 +15,7 @@ namespace MafiaTelegramBot.Game.GameRoles
         {
             var targets = Room.Players.Values.Where(p => p.IsAlive).ToList();
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_heal, 
-                Keyboards.NightChooseTargetKeyboard(targets, Player.Id));
+                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
             MessageId = message.MessageId;
         }
 
@@ -32,6 +32,12 @@ namespace MafiaTelegramBot.Game.GameRoles
             }
         }
 
+        public override Task CancelNightActionResult(string message)
+        {
+            //TODO why action canceled
+            return Task.CompletedTask;
+        }
+
         public override Task<Message> SetNightTarget(long userId)
         {
             var canHeal = true; //TODO why doctor cant heal

+ 10 - 1
MafiaTelegramBot/Game/GameRoles/DonRole.cs

@@ -14,14 +14,17 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task NightAction()
         {
+            NightTargetId = -1;
+            Player.IsSpeaker = true;
             var targets = Room.Players.Values.Except(KnownRoles).Where(p => p.IsAlive).ToList();
             var message = await Bot.SendWithMarkdown2(Player.ChatId, strings.choose_player_to_check_role, 
-                Keyboards.NightChooseTargetKeyboard(targets, Player.Id));
+                Keyboard.NightChooseTargetKeyboard(targets, Player.Id));
             MessageId = message.MessageId;
         }
 
         public override async Task ApplyNightActionResult()
         {
+            Player.IsSpeaker = false;
             if (NightTargetId == -1)
                 await Bot.Get().EditMessageTextAsync(Player.ChatId, MessageId, strings.you_have_not_choosen_target);
             else
@@ -35,6 +38,12 @@ namespace MafiaTelegramBot.Game.GameRoles
             }
         }
 
+        public override Task CancelNightActionResult(string message)
+        {
+            //TODO why action canceled
+            return Task.CompletedTask;
+        }
+
         public override async Task<Message> SetNightTarget(long userId)
         {
             NightTargetId = userId;

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/ElderRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class ElderRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Elder;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public ElderRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/FoolRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class FoolRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Fool;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public FoolRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 6 - 0
MafiaTelegramBot/Game/GameRoles/HookerRole.cs

@@ -22,6 +22,12 @@ namespace MafiaTelegramBot.Game.GameRoles
             
         }
 
+        public override Task CancelNightActionResult(string message)
+        {
+            //TODO why action canceled
+            return Task.CompletedTask;
+        }
+
         public override async Task<Message> SetNightTarget(long userId)
         {
             NightTargetId = userId;

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/JournalistRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class JournalistRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Journalist;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public JournalistRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/LawyerRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class LawyerRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Lawyer;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public LawyerRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 12 - 1
MafiaTelegramBot/Game/GameRoles/MafiaRole.cs

@@ -1,3 +1,4 @@
+using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;
@@ -12,7 +13,11 @@ namespace MafiaTelegramBot.Game.GameRoles
 
         public override async Task NightAction()
         {
-            
+            NightTargetId = -1;
+            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));
+            MessageId = message.MessageId;
         }
 
         public override async Task ApplyNightActionResult()
@@ -20,6 +25,12 @@ namespace MafiaTelegramBot.Game.GameRoles
             
         }
 
+        public override Task CancelNightActionResult(string message)
+        {
+            //TODO why action canceled
+            return Task.CompletedTask;
+        }
+
         public override async Task<Message> SetNightTarget(long userId)
         {
             NightTargetId = userId;

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/NecromancerRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class NecromancerRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Necromancer;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public NecromancerRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 4 - 19
MafiaTelegramBot/Game/GameRoles/NoneRole.cs

@@ -1,7 +1,5 @@
 using System.Threading.Tasks;
-using System.Timers;
 using MafiaTelegramBot.Game.GameRooms;
-using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
 
@@ -10,23 +8,10 @@ namespace MafiaTelegramBot.Game.GameRoles
     public class NoneRole : GameRoom.Role
     {
         public override Roles RoleKey => Roles.None;
-
-        public override async Task NightAction()
-        {
-            
-        }
-
-        public override async Task ApplyNightActionResult()
-        {
-            
-        }
-
-        public override async Task<Message> SetNightTarget(long userId)
-        {
-            NightTargetId = userId;
-            return await Bot.Get().EditMessageTextAsync(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
-        }
-
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
         public NoneRole(GameRoom room, Player player) : base(room, player) { }
         public NoneRole() : base(null, null) { }
     }

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/ParasiteRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class ParasiteRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Parasite;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public ParasiteRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 4 - 19
MafiaTelegramBot/Game/GameRoles/VillagerRole.cs

@@ -1,7 +1,5 @@
 using System.Threading.Tasks;
-using System.Timers;
 using MafiaTelegramBot.Game.GameRooms;
-using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
 
@@ -10,23 +8,10 @@ namespace MafiaTelegramBot.Game.GameRoles
     public class VillagerRole : GameRoom.Role
     {
         public override Roles RoleKey => Roles.Villager;
-
-        public override async Task NightAction()
-        {
-            
-        }
-
-        public override async Task ApplyNightActionResult()
-        {
-            
-        }
-
-        public override async Task<Message> SetNightTarget(long userId)
-        {
-            NightTargetId = userId;
-            return await Bot.Get().EditMessageTextAsync(Player.ChatId, MessageId, $"{strings.you_choose_target} {Room.Players[userId].NickName}");
-        }
-
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
         public VillagerRole(GameRoom room, Player player) : base(room, player) { }
     }
 }

+ 17 - 0
MafiaTelegramBot/Game/GameRoles/WerewolfRole.cs

@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Game.GameRooms;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRoles
+{
+    public class WerewolfRole : GameRoom.Role
+    {
+        public override Roles RoleKey => Roles.Werewolf;
+        public override Task NightAction() { return Task.CompletedTask; }
+        public override Task ApplyNightActionResult() { return Task.CompletedTask; }
+        public override Task CancelNightActionResult(string message) { return Task.CompletedTask; }
+        public override Task<Message> SetNightTarget(long userId) { return new (()=>new Message()); }
+        public WerewolfRole(GameRoom room, Player player) : base(room, player) { }
+    }
+}

+ 11 - 9
MafiaTelegramBot/Game/GameRooms/ExtendedGameRoom.cs

@@ -10,21 +10,23 @@ namespace MafiaTelegramBot.Game.GameRooms
 
         protected override Dictionary<Roles, List<Player>> PlayersRole { get; } = new()
         {
+            [Roles.Hooker] = new List<Player>(),
+            [Roles.Parasite] = new List<Player>(),
             [Roles.Mafia] = new List<Player>(),
             [Roles.Don] = new List<Player>(),
-            [Roles.Villager] = new List<Player>(),
-            [Roles.Cop] = new List<Player>(),
-            [Roles.Doctor] = new List<Player>(),
             [Roles.Dame] = new List<Player>(),
-            [Roles.Hooker] = new List<Player>(),
+            [Roles.Cop] = new List<Player>(),
+            [Roles.Journalist] = new List<Player>(),
             [Roles.Detective] = new List<Player>(),
+            [Roles.Lawyer] = new List<Player>(),
+            [Roles.Bodyguard] = new List<Player>(),
+            [Roles.Doctor] = new List<Player>(),
+            [Roles.Necromancer] = new List<Player>(),
+            //passive roles
+            [Roles.Werewolf] = new List<Player>(),
             [Roles.Elder] = new List<Player>(),
             [Roles.Fool] = new List<Player>(),
-            [Roles.Journalist] = new List<Player>(),
-            [Roles.Werewolf] = new List<Player>(),
-            [Roles.Parasite] = new List<Player>(),
-            [Roles.Lawyer] = new List<Player>(),
-            [Roles.Necromancer] = new List<Player>()
+            [Roles.Villager] = new List<Player>(),
         };
 
         protected override Task ReadSettings()

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

@@ -192,8 +192,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                     await RoomController.DissolveRoom(RoomEncrypter.GetCode(RoomName))).Start();
                 else
                 {
-                    await Bot.SendWithMarkdown2(Owner.ChatId, strings.thanks_for_game, Keyboards.OwnerGameMenu);
-                    await PlayersCh.SendExcept(Owner.Id, strings.thanks_for_game, Keyboards.PlayerGameMenu);
+                    await Bot.SendWithMarkdown2(Owner.ChatId, strings.thanks_for_game, Keyboard.OwnerGameMenu);
+                    await PlayersCh.SendExcept(Owner.Id, strings.thanks_for_game, Keyboard.PlayerGameMenu);
                 }
             });
         }

+ 47 - 48
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageHandler.cs

@@ -1,8 +1,6 @@
 using System.Linq;
-using System.Security.AccessControl;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Controllers;
-using MafiaTelegramBot.DataBase.EntityDao;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
@@ -24,80 +22,81 @@ namespace MafiaTelegramBot.Game.GameRooms
             {
                 var text = update.Message.Text;
                 var userId = update.Message.From.Id;
-                var chatId = update.Message.Chat.Id;
-                if (text == keyboard.look_players_list) await LookPlayers(chatId, userId);
-                else if (text == keyboard.leave) await Leave(chatId, userId);
+                var player = _room.Players[userId];
+                if (text == keyboard.look_players_list) await LookPlayers(player);
+                else if (text == keyboard.leave) await Leave(player);
+                else if (text == keyboard.end_turn) player.CurrentRole.DayActionComplete.Set();
                 else
                 {
-                    var player = await UserDao.GetPlayerById(userId);
-                    if (!player.IsAlive) await Bot.SendWithMarkdown2(chatId, strings.you_now_died);
+                    if (!player.IsAlive) await Bot.SendWithMarkdown2(player.ChatId, strings.you_now_died);
+                    else await ForwardMessage(player, text);
+                }
+                return update.Message;
+            }
+
+            private async Task ForwardMessage(Player player, string message)
+            {
+                
+                if (_room.IsDay)
+                {
+                    if (player.IsSpeaker)
+                        await _room.PlayersCh.SendExcept(player.Id, $"\\({player.TurnOrder}\\) {player.NickName}: {message}");
+                    else
+                        await Bot.SendWithMarkdown2(player.ChatId, strings.now_is_not_your_turn);
+                }
+                else
+                {
+                    if (player.IsSpeaker)
+                        await _room.MafiaCh.SendExcept(player.Id, $"\\({player.TurnOrder}\\) {player.NickName}: {message}");
                     else
                     {
-                        if (_room.IsDay)
-                        {
-                            if (player.IsSpeaker)
-                                await _room.PlayersCh.SendExcept(userId, $"\\({player.TurnOrder}\\) {player.NickName}: {update.Message.Text}");
-                            else
-                                await Bot.SendWithMarkdown2(chatId, strings.now_is_not_your_turn);
-                        }
-                        else
-                        {
-                            if (player.IsSpeaker)
-                                await _room.MafiaCh.SendExcept(userId, $"\\({player.TurnOrder}\\) {player.NickName}: {update.Message.Text}");
-                            else
-                            {
-                                if(_room.IsFirstCycle && player.GetRole() is Roles.Mafia or Roles.Don)
-                                    await Bot.SendWithMarkdown2(chatId, strings.mafia_get_mail);
-                                else await Bot.SendWithMarkdown2(chatId, strings.villagers_are_sleep);
-                            }
-                        }
+                        if(_room.IsFirstCycle && player.GetRole() is Roles.Mafia or Roles.Don)
+                            await Bot.SendWithMarkdown2(player.ChatId, strings.mafia_get_mail);
+                        else await Bot.SendWithMarkdown2(player.ChatId, strings.villagers_are_sleep);
                     }
                 }
-                return update.Message;
             }
 
-            private async Task LookPlayers(long chatId, long userId)
+            private async Task LookPlayers(Player player)
             {
                 var players = _room.Players.Values.ToList();
-                var knownRoles = _room.Players[userId].CurrentRole.KnownRoles;
+                var knownRoles = player.CurrentRole.KnownRoles;
                 players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
                 var message = strings.players_list;
-                var user = _room.Players[userId];
-                foreach (var player in players)
+                foreach (var item in players)
                 {
                     var role = "";
-                    if (knownRoles.Contains(player))
+                    if (knownRoles.Contains(item) && item.GetRole() != Roles.None)
                     {
-                        role = user.GetRole() switch
+                        role = player.GetRole() switch
                         {
-                            Roles.Cop => player.GetRole() is Roles.Don or Roles.Mafia
+                            Roles.Cop => item.GetRole() is Roles.Don or Roles.Mafia
                                 ? roles.Mafia
                                 : roles.Villager,
-                            Roles.Don => player.GetRole() is Roles.Cop
+                            Roles.Don => item.GetRole() is Roles.Cop
                                 ? roles.Cop
-                                : roles.Villager,
-                            _ => player.GetRoleName()
+                                : item.GetRole() is Roles.Journalist
+                                    ? roles.Journalist : roles.Villager,
+                            _ => item.GetRoleName()
                         };
                     }
                     message +=
-                        $"\n\\({player.TurnOrder}\\) " +
-                        $"{player.NickName} " +
-                        $"\\({(player.IsAlive ? strings.alive : strings.died)}\\) " +
+                        $"\n\\({item.TurnOrder}\\) " +
+                        $"{item.NickName} " +
+                        $"\\({(item.IsAlive ? strings.alive : strings.died)}\\) " +
                         $"{role}";
                 }
-                await Bot.SendWithMarkdown2(chatId, message);
+                await Bot.SendWithMarkdown2(player.ChatId, message);
             }
 
-            private static async Task Leave(long chatId, long userId)
+            private async Task Leave(Player player)
             {
-                var user = await UserDao.GetPlayerById(userId);
-                var roomName = user.GetRoomName();
-                var resultCode = await RoomController.LeaveFromGame(user);
+                var roomName = player.GetRoomName();
+                var resultCode = await RoomController.LeaveFromGame(player);
                 if (resultCode == ResultCode.CodeOk)
-                    await Bot.SendWithMarkdown2(chatId, $"{strings.you_leave_from_game} _*{roomName}*_",
-                        Keyboards.MainMenu);
-                else
-                    await Utilities.GetResultCodeMessage(resultCode, chatId);
+                    await Bot.SendWithMarkdown2(player.ChatId, $"{strings.you_leave_from_game} _*{roomName}*_",
+                        Keyboard.MainMenu);
+                else await Utilities.GetResultCodeMessage(resultCode, player.ChatId);
             }
         }
     }

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

@@ -74,7 +74,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     $"{strings.your_role}: _*{player.GetRoleName()}*_\n" +
                     $"{strings.your_turn_order}: _*{player.TurnOrder}*_\n"+
                     $"{strings.bot_starting_game}";
-                await Bot.SendWithMarkdown2(player.ChatId, message, Keyboards.InGamePlayerMenu);
+                await Bot.SendWithMarkdown2(player.ChatId, message, Keyboard.InGamePlayerMenu);
             }
         }
         protected abstract Task ReadSettings();

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

@@ -21,10 +21,11 @@ namespace MafiaTelegramBot.Game.GameRooms
             protected long NightTargetId = -1;
             public readonly ManualResetEvent DayActionComplete = new(false);
             protected int MessageId = -1;
+            public abstract Roles RoleKey { get; }
             public abstract Task NightAction();
             public abstract Task ApplyNightActionResult();
+            public abstract Task CancelNightActionResult(string message);
             public abstract Task<Message> SetNightTarget(long userId);
-            public abstract Roles RoleKey { get; }
 
             protected Role(GameRoom room, Player player)
             {
@@ -47,7 +48,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     if (!Room.IsFirstCycle)
                     {
                         var alivePlayers = Room.Players.Values.Where(p => p.IsAlive).ToList();
-                        message = await Bot.SendWithMarkdown2(Player.ChatId, strings.put_up_vote, Keyboards.VoteKeyboard(alivePlayers, Player.Id, !Player.IsFirst));
+                        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);
@@ -77,13 +78,23 @@ namespace MafiaTelegramBot.Game.GameRooms
                 return roleKey switch
                 {
                     Roles.All => new NoneRole(),
+                    Roles.None => new NoneRole(),
                     Roles.Doctor => new DoctorRole(room, player),
                     Roles.Mafia => new MafiaRole(room, player),
                     Roles.Don => new DonRole(room, player),
                     Roles.Cop => new CopRole(room, player),
                     Roles.Villager => new VillagerRole(room, player),
                     Roles.Hooker => new HookerRole(room, player),
-                    Roles.None => new NoneRole(room, player),
+                    Roles.Elder => new ElderRole(room, player),
+                    Roles.Werewolf => new WerewolfRole(room, player),
+                    Roles.Journalist => new JournalistRole(room, player),
+                    Roles.Detective => new DetectiveRole(room, player),
+                    Roles.Dame => new DameRole(room, player),
+                    Roles.Parasite => new ParasiteRole(room, player),
+                    Roles.Lawyer => new LawyerRole(room, player),
+                    Roles.Fool => new FoolRole(room, player),
+                    Roles.Necromancer => new NecromancerRole(room, player),
+                    Roles.Bodyguard => new BodyguardRole(room, player),
                     _ => throw new ArgumentOutOfRangeException(nameof(roleKey), roleKey, null)
                 };
             }

+ 3 - 2
MafiaTelegramBot/Game/GameRooms/NormalGameRoom.cs

@@ -12,9 +12,10 @@ namespace MafiaTelegramBot.Game.GameRooms
         {
             [Roles.Mafia] = new List<Player>(),
             [Roles.Don] = new List<Player>(),
-            [Roles.Villager] = new List<Player>(),
             [Roles.Cop] = new List<Player>(),
-            [Roles.Doctor] = new List<Player>()
+            [Roles.Doctor] = new List<Player>(),
+            //passive roles
+            [Roles.Villager] = new List<Player>()
         };
 
         protected override async Task ReadSettings()

+ 1 - 1
MafiaTelegramBot/Models/Commands/ConnectGameCommand.cs

@@ -15,7 +15,7 @@ namespace MafiaTelegramBot.Models.Commands
             if (user.GetRoomName() != "")
                 return await Bot.SendWithMarkdown2(ChatId, strings.user_already_in_game);
             return await Bot.SendWithMarkdown2(ChatId, strings.choose_type_room, 
-                Keyboards.RoomTypeKeyboard(UserId, Callback.ConnectToPrivateRoom, Callback.ConnectToPublicRoom));
+                Keyboard.RoomTypeKeyboard(UserId, Callback.ConnectToPrivateRoom, Callback.ConnectToPublicRoom));
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Commands/CreateGameCommand.cs

@@ -16,7 +16,7 @@ namespace MafiaTelegramBot.Models.Commands
             if (user.GetRoomName() != "")
                 return await Bot.SendWithMarkdown2(ChatId, strings.user_already_in_game);
             return await Bot.SendWithMarkdown2(ChatId, strings.choose_type_room, 
-                Keyboards.RoomTypeKeyboard(UserId, Callback.MakePrivateRoom, Callback.MakePublicRoom));
+                Keyboard.RoomTypeKeyboard(UserId, Callback.MakePrivateRoom, Callback.MakePublicRoom));
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Commands/CustomMessageHandlers/CreateRoomHandler.cs

@@ -21,7 +21,7 @@ namespace MafiaTelegramBot.Models.Commands.CustomMessageHandlers
             var resultCode = await RoomController.CreateNewGame(user, roomName, isExtended, param[0] == "private");
             var result = resultCode == ResultCode.CodeOk
                 ? await Bot.SendWithMarkdown2(ChatId, 
-                    $"{strings.room_with_name} _*{roomName}*_ {strings.was_created}\n", Keyboards.OwnerGameMenu)
+                    $"{strings.room_with_name} _*{roomName}*_ {strings.was_created}\n", Keyboard.OwnerGameMenu)
                 : await Utilities.GetResultCodeMessage(resultCode, ChatId);
             if (resultCode == ResultCode.CodeOk && param[0] == "private")
                 await Bot.SendWithMarkdown2(ChatId, $"{strings.secret_key_is} _*{roomName}*_: ```{RoomEncrypter.GetCode(roomName)}```");

+ 1 - 1
MafiaTelegramBot/Models/Commands/CustomMessageHandlers/EnterCodeHandler.cs

@@ -16,7 +16,7 @@ namespace MafiaTelegramBot.Models.Commands.CustomMessageHandlers
             var roomKey = update.Message.Text;
             var resultCode = await RoomController.ConnectToGame(user, roomKey);
             var result = resultCode == ResultCode.CodeOk
-                ? Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboards.PlayerGameMenu)
+                ? Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboard.PlayerGameMenu)
                 : Utilities.GetResultCodeMessage(resultCode, ChatId);
             return await result;
         }

+ 1 - 1
MafiaTelegramBot/Models/Commands/DissolveRoomCommand.cs

@@ -16,7 +16,7 @@ namespace MafiaTelegramBot.Models.Commands
             var roomKey = RoomEncrypter.GetCode(user.GetRoomName());
             var resultCode = await RoomController.LeaveFromGame(user);
             var result = resultCode == ResultCode.CodeOk
-                ? await Bot.SendWithMarkdown2(ChatId, strings.room_dissolved, Keyboards.MainMenu)
+                ? await Bot.SendWithMarkdown2(ChatId, strings.room_dissolved, Keyboard.MainMenu)
                 : await Utilities.GetResultCodeMessage(resultCode, ChatId);
             if (resultCode == ResultCode.CodeOk) await RoomController.DissolveRoom(roomKey);
             return result;

+ 1 - 1
MafiaTelegramBot/Models/Commands/KickPlayerCommand.cs

@@ -17,7 +17,7 @@ namespace MafiaTelegramBot.Models.Commands
             var room = RoomController.GetRoom(roomKey);
             var players = await room.GetPlayers();
             if (players.Count > 0)
-                return await Bot.SendWithMarkdown2(ChatId, strings.kick_user, Keyboards.KickKeyboard(players));
+                return await Bot.SendWithMarkdown2(ChatId, strings.kick_user, Keyboard.KickKeyboard(players));
             return await Bot.SendWithMarkdown2(ChatId, strings.users_list_empty);
         }
         

+ 1 - 1
MafiaTelegramBot/Models/Commands/LeaveCommand.cs

@@ -16,7 +16,7 @@ namespace MafiaTelegramBot.Models.Commands
             var roomName = user.GetRoomName();
             var resultCode = await RoomController.LeaveFromGame(user);
             return resultCode == ResultCode.CodeOk
-                ? await Bot.SendWithMarkdown2(ChatId, $"{strings.you_leave_from_game} _*{roomName}*_", Keyboards.MainMenu)
+                ? await Bot.SendWithMarkdown2(ChatId, $"{strings.you_leave_from_game} _*{roomName}*_", Keyboard.MainMenu)
                 : await Utilities.GetResultCodeMessage(resultCode, ChatId);
         }
     }

+ 2 - 2
MafiaTelegramBot/Models/Commands/RoomSettingsCommand.cs

@@ -18,8 +18,8 @@ namespace MafiaTelegramBot.Models.Commands
             var room = RoomController.GetRoom(roomKey);
             var roomMaxCapacity = room.MaxPlayers;
             var status = room.TimerEnabled ? strings.enabled : strings.disabled;
-            await Bot.SendWithMarkdown2(ChatId, $"{strings.timer}: {status}", Keyboards.TimerSwitchKeyboard(UserId, room.TimerEnabled ? strings.disable : strings.enable));
-            return await Bot.SendWithMarkdown2(ChatId, $"{strings.max_capacity_message}: {roomMaxCapacity}", Keyboards.SetMaximumKeyboard(UserId));
+            await Bot.SendWithMarkdown2(ChatId, $"{strings.timer}: {status}", Keyboard.TimerSwitchKeyboard(UserId, room.TimerEnabled ? strings.disable : strings.enable));
+            return await Bot.SendWithMarkdown2(ChatId, $"{strings.max_capacity_message}: {roomMaxCapacity}", Keyboard.SetMaximumKeyboard(UserId));
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Commands/ShowProfileCommand.cs

@@ -19,7 +19,7 @@ namespace MafiaTelegramBot.Models.Commands
                 $"{strings.games_count} {result.Games}\n" +
                 $"{strings.wins_count} {result.Wins}\n" +
                 $"{strings.winrate} {result.GetWinrate()}%\n";
-            return await Bot.SendWithMarkdown2(ChatId, message, Keyboards.ProfileKeyboard(UserId));
+            return await Bot.SendWithMarkdown2(ChatId, message, Keyboard.ProfileKeyboard(UserId));
             
         }
     }

+ 4 - 4
MafiaTelegramBot/Models/Commands/StartCommand.cs

@@ -21,10 +21,10 @@ namespace MafiaTelegramBot.Models.Commands
                 if (player.GetRoomName() != "")
                     return await Bot.SendWithMarkdown2(ChatId, $"{strings.prefer_leave_from_room} {player.GetRoomName()}");
                 if (command.Length <= 1)
-                    return await Bot.SendWithMarkdown2(ChatId, strings.start_message, Keyboards.MainMenu);
+                    return await Bot.SendWithMarkdown2(ChatId, strings.start_message, Keyboard.MainMenu);
                 var code = await RoomController.ConnectToGame(player, command[1]);
                 result = code == ResultCode.CodeOk
-                    ? Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboards.PlayerGameMenu)
+                    ? Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboard.PlayerGameMenu)
                     : Utilities.GetResultCodeMessage(code, ChatId);
                 return await result;
             }
@@ -38,10 +38,10 @@ namespace MafiaTelegramBot.Models.Commands
             await UserDao.Update(user);
             UserDao.ActiveUsers.Add(user.Id, user);
             if (command.Length <= 1)
-                return await Bot.SendWithMarkdown2(ChatId, strings.start_message, Keyboards.MainMenu);
+                return await Bot.SendWithMarkdown2(ChatId, strings.start_message, Keyboard.MainMenu);
             var resultCode = await RoomController.ConnectToGame(user, command[1]);
             result = resultCode == ResultCode.CodeOk
-                ? Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboards.PlayerGameMenu)
+                ? Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboard.PlayerGameMenu)
                 : Utilities.GetResultCodeMessage(resultCode, ChatId);
             return await result;
         }

+ 1 - 1
MafiaTelegramBot/Models/Inlines/ConnectToPublicRoomQuery.cs

@@ -14,7 +14,7 @@ namespace MafiaTelegramBot.Models.Inlines
             await DeletePreviousMessage(ChatId, update.CallbackQuery.Message.MessageId);
             var rooms = await RoomController.GetPublicRooms();
             if (rooms.Count == 0) return await Bot.SendWithMarkdown2(ChatId, strings.public_rooms_are_not_exist);
-            return await Bot.SendWithMarkdown2(ChatId, strings.rooms, Keyboards.RoomsKeyboard(rooms, UserId));
+            return await Bot.SendWithMarkdown2(ChatId, strings.rooms, Keyboard.RoomsKeyboard(rooms, UserId));
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Inlines/ConnectToSelectedRoomQuery.cs

@@ -20,7 +20,7 @@ namespace MafiaTelegramBot.Models.Inlines
             var user = await UserDao.GetPlayerById(UserId);
             var resultCode = await RoomController.ConnectToGame(user, roomKey);
             if (resultCode != ResultCode.CodeOk) return await Utilities.GetResultCodeMessage(resultCode, ChatId);
-            return await Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboards.PlayerGameMenu);
+            return await Bot.SendWithMarkdown2(ChatId, strings.successful_entry_into_room, Keyboard.PlayerGameMenu);
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Inlines/KickSelectedPlayerQuery.cs

@@ -14,7 +14,7 @@ namespace MafiaTelegramBot.Models.Inlines
             var user = await UserDao.GetPlayerById(UserId);
             var resultCode = await RoomController.LeaveFromGame(user);
             if (resultCode != ResultCode.CodeOk) return await Utilities.GetResultCodeMessage(resultCode, ChatId);
-            return await Bot.SendWithMarkdown2(user.ChatId, $"{strings.you_were_kicked}", Keyboards.MainMenu);
+            return await Bot.SendWithMarkdown2(user.ChatId, $"{strings.you_were_kicked}", Keyboard.MainMenu);
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Inlines/MakePrivateRoomQuery.cs

@@ -15,7 +15,7 @@ namespace MafiaTelegramBot.Models.Inlines
             var user = await UserDao.GetPlayerById(UserId);
             if (user.GetRoomName() != "")
                 return await Bot.SendWithMarkdown2(ChatId, strings.user_already_in_game);
-            return await Bot.SendWithMarkdown2(ChatId, strings.choose_game_type, Keyboards.NormalExtendedKeyboard(UserId, "private"));
+            return await Bot.SendWithMarkdown2(ChatId, strings.choose_game_type, Keyboard.NormalExtendedKeyboard(UserId, "private"));
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Inlines/MakePublicRoomQuery.cs

@@ -15,7 +15,7 @@ namespace MafiaTelegramBot.Models.Inlines
             var user = await UserDao.GetPlayerById(UserId);
             if (user.GetRoomName() != "")
                 return await Bot.SendWithMarkdown2(ChatId, strings.user_already_in_game);
-            return await Bot.SendWithMarkdown2(ChatId, strings.choose_game_type, Keyboards.NormalExtendedKeyboard(UserId, "public"));
+            return await Bot.SendWithMarkdown2(ChatId, strings.choose_game_type, Keyboard.NormalExtendedKeyboard(UserId, "public"));
         }
     }
 }

+ 1 - 1
MafiaTelegramBot/Models/Inlines/SettingsProfileQuery.cs

@@ -14,7 +14,7 @@ namespace MafiaTelegramBot.Models.Inlines
         {
             await DeletePreviousMessage(ChatId, update.CallbackQuery.Message.MessageId);
             var user = await UserDao.GetPlayerById(UserId);
-            return await Bot.SendWithMarkdown2(ChatId, $"{strings.your_name} {user.NickName}", Keyboards.ChangeNameKeyboard(UserId));
+            return await Bot.SendWithMarkdown2(ChatId, $"{strings.your_name} {user.NickName}", Keyboard.ChangeNameKeyboard(UserId));
         }
     }
 }

+ 3 - 5
MafiaTelegramBot/Resources/Keyboards.cs → MafiaTelegramBot/Resources/Keyboard.cs

@@ -1,14 +1,11 @@
 using System.Collections.Generic;
-using System.Linq;
-using MafiaTelegramBot.DataBase;
-using MafiaTelegramBot.DataBase.Entity;
 using MafiaTelegramBot.Game;
 using MafiaTelegramBot.Game.GameRooms;
 using Telegram.Bot.Types.ReplyMarkups;
 
 namespace MafiaTelegramBot.Resources
 {
-    public static class Keyboards
+    public static class Keyboard
     {
         public static readonly ReplyKeyboardMarkup MainMenu = new(new[]
             {
@@ -34,7 +31,8 @@ namespace MafiaTelegramBot.Resources
         
         public static readonly ReplyKeyboardMarkup InGamePlayerMenu = new(new[]
             {
-                new KeyboardButton[] {keyboard.look_players_list, keyboard.leave}
+                new KeyboardButton[] {keyboard.look_players_list, keyboard.leave},
+                new KeyboardButton[] {keyboard.end_turn}
             }, true
         );
 

+ 34 - 70
MafiaTelegramBot/Resources/keyboard.Designer.cs

@@ -1,7 +1,6 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.42000
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -12,46 +11,32 @@ namespace MafiaTelegramBot.Resources {
     using System;
     
     
-    /// <summary>
-    ///   A strongly-typed resource class, for looking up localized strings, etc.
-    /// </summary>
-    // This class was auto-generated by the StronglyTypedResourceBuilder
-    // class via a tool like ResGen or Visual Studio.
-    // To add or remove a member, edit your .ResX file then rerun ResGen
-    // with the /str option, or rebuild your VS project.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     internal class keyboard {
         
-        private static global::System.Resources.ResourceManager resourceMan;
+        private static System.Resources.ResourceManager resourceMan;
         
-        private static global::System.Globalization.CultureInfo resourceCulture;
+        private static System.Globalization.CultureInfo resourceCulture;
         
-        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
         internal keyboard() {
         }
         
-        /// <summary>
-        ///   Returns the cached ResourceManager instance used by this class.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Resources.ResourceManager ResourceManager {
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static System.Resources.ResourceManager ResourceManager {
             get {
-                if (object.ReferenceEquals(resourceMan, null)) {
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MafiaTelegramBot.Resources.keyboard", typeof(keyboard).Assembly);
+                if (object.Equals(null, resourceMan)) {
+                    System.Resources.ResourceManager temp = new System.Resources.ResourceManager("MafiaTelegramBot.Resources.keyboard", typeof(keyboard).Assembly);
                     resourceMan = temp;
                 }
                 return resourceMan;
             }
         }
         
-        /// <summary>
-        ///   Overrides the current thread's CurrentUICulture property for all
-        ///   resource lookups using this strongly typed resource class.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Globalization.CultureInfo Culture {
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static System.Globalization.CultureInfo Culture {
             get {
                 return resourceCulture;
             }
@@ -60,84 +45,63 @@ namespace MafiaTelegramBot.Resources {
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Начать игру.
-        /// </summary>
-        internal static string begin_game {
+        internal static string connect_game {
             get {
-                return ResourceManager.GetString("begin_game", resourceCulture);
+                return ResourceManager.GetString("connect_game", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Подключиться.
-        /// </summary>
-        internal static string connect_game {
+        internal static string look_players_list {
             get {
-                return ResourceManager.GetString("connect_game", resourceCulture);
+                return ResourceManager.GetString("look_players_list", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Создать игру.
-        /// </summary>
         internal static string create_game {
             get {
                 return ResourceManager.GetString("create_game", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Распустить комнату.
-        /// </summary>
-        internal static string dissolve_room {
+        internal static string show_profile {
             get {
-                return ResourceManager.GetString("dissolve_room", resourceCulture);
+                return ResourceManager.GetString("show_profile", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Исключить игрока.
-        /// </summary>
-        internal static string kick_player {
+        internal static string begin_game {
             get {
-                return ResourceManager.GetString("kick_player", resourceCulture);
+                return ResourceManager.GetString("begin_game", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Покинуть игру.
-        /// </summary>
-        internal static string leave {
+        internal static string room_settings {
             get {
-                return ResourceManager.GetString("leave", resourceCulture);
+                return ResourceManager.GetString("room_settings", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Список игроков.
-        /// </summary>
-        internal static string look_players_list {
+        internal static string kick_player {
             get {
-                return ResourceManager.GetString("look_players_list", resourceCulture);
+                return ResourceManager.GetString("kick_player", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Настройки комнаты.
-        /// </summary>
-        internal static string room_settings {
+        internal static string leave {
             get {
-                return ResourceManager.GetString("room_settings", resourceCulture);
+                return ResourceManager.GetString("leave", resourceCulture);
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to Мой профиль.
-        /// </summary>
-        internal static string show_profile {
+        internal static string dissolve_room {
             get {
-                return ResourceManager.GetString("show_profile", resourceCulture);
+                return ResourceManager.GetString("dissolve_room", resourceCulture);
+            }
+        }
+        
+        internal static string end_turn {
+            get {
+                return ResourceManager.GetString("end_turn", resourceCulture);
             }
         }
     }

+ 3 - 0
MafiaTelegramBot/Resources/keyboard.resx

@@ -45,4 +45,7 @@
     <data name="dissolve_room" xml:space="preserve">
         <value>Распустить комнату</value>
     </data>
+    <data name="end_turn" xml:space="preserve">
+        <value>Закончить ход</value>
+    </data>
 </root>