Browse Source

Добавлены кнопки клавиатуры для управления комнатой, а также увеличение/уменьшение допустимого кол-ва игроков

Yjga125 4 years ago
parent
commit
7540ca7cb4

+ 9 - 0
MafiaTelegramBot/Controllers/RoomController.cs

@@ -74,5 +74,14 @@ namespace MafiaTelegramBot.Controllers
                 return Constants.CODE_OK;
             });
         }
+        
+        public static async Task<GameRoom> GetRoom(string roomKey)
+        {
+            return await Task.Run( ()=>
+            {
+                var room = OpenedGames[roomKey];
+                return room;
+            });
+        }
     }
 }

+ 4 - 3
MafiaTelegramBot/Game/GameRoom.cs

@@ -7,7 +7,8 @@ namespace MafiaTelegramBot.Game
     public class GameRoom
     {
         private bool _isRunning;
-        private int _maxPlayers = Constants.PLAYER_LIMITS_MAX;
+        
+        public int MaxPlayers = 10;
         private int _minPlayers = Constants.PLAYER_LIMITS_MIN;
         public virtual bool IsPrivate { get; protected set; } = false;
         public bool IsExtended { get; init; } = false;
@@ -19,7 +20,7 @@ namespace MafiaTelegramBot.Game
         public int Start()
         {
             if (Players.Count < _minPlayers) return Constants.TOO_FEW_PLAYERS;
-            if (Players.Count > _maxPlayers) return Constants.TOO_MANY_PLAYERS;
+            if (Players.Count > MaxPlayers) return Constants.TOO_MANY_PLAYERS;
             if (_isRunning) return Constants.GAME_ALREADY_RUNNING;
             _isRunning = true;
             //TODO game start logic
@@ -28,7 +29,7 @@ namespace MafiaTelegramBot.Game
 
         public bool IsFilled()
         {
-            return Players.Count == _maxPlayers;
+            return Players.Count == MaxPlayers;
         }
     }
 }

+ 7 - 3
MafiaTelegramBot/Models/Bot.cs

@@ -50,6 +50,8 @@ namespace MafiaTelegramBot.Models
                 new CreateGameCommand(),
                 new ConnectGameCommand(),
                 new ShowProfileCommand(),
+                new RoomSettingsCommand(),
+                new LeaveCommand(),
                 
                 //it always in end of array, handle all messages, that doesn't contains command string
                 new CustomMessageHandlingCommand()
@@ -70,10 +72,11 @@ namespace MafiaTelegramBot.Models
                 new MakePublicRoomQuery(),
                 new SettingsQuery(),
                 new ChangeNameQuery(),
-                new LeaveQuery(),
                 new SettingsRoomQuery(),
-                new ConnectToPrivateRoom(),
-                new LookUsersList()
+                new ConnectToPrivateRoomQuery(),
+                new LookUsersListQuery(),
+                new IncreaseRoomMaxCapacityQuery(),
+                new DecreaseRoomMaxCapacity()
             };
         }
         
@@ -93,6 +96,7 @@ namespace MafiaTelegramBot.Models
                 .Replace("@", "\\@")
                 .Replace("#", "\\#")
                 .Replace("!", "\\!")
+                .Replace("-", "\\-")
             );
             return replyMarkup == null
                 ? await Get().SendTextMessageAsync(chatId, newMessage, ParseMode.MarkdownV2)

+ 9 - 7
MafiaTelegramBot/Models/Commands/CustomMessageHandlingCommand.cs

@@ -82,13 +82,15 @@ namespace MafiaTelegramBot.Models.Commands
             var resultCode = param[0] == "public"
                 ? await RoomController.CreateNewGame(user, roomName, param[1] == strings.extended_callback)
                 : await RoomController.CreateNewGame(user, roomName, param[1] == strings.extended_callback, RoomEncrypter.Encrypt(roomName));
-            var keyboard = new InlineKeyboardMarkup(new []
-            {
-                new []{
-                    InlineKeyboardButton.WithCallbackData(strings.settings, $"{strings.settings_room_callback}|{userId}"),
-                    InlineKeyboardButton.WithCallbackData(strings.leave, $"{strings.leave_callback}|{userId}")
-                }
-            });
+            var keyboard = new ReplyKeyboardMarkup (
+                new[]
+                {
+                    new KeyboardButton[] {strings.begin_game, strings.settings_to_room},
+                    new KeyboardButton[] {strings.kick_player, strings.leave}
+                },
+                true
+            );
+
             var result = resultCode switch
             {
                 Constants.CODE_OK => await Bot.SendWithMarkdown2(chatId, $"{strings.room_with_name} _*{roomName}*_ {strings.was_created}", keyboard),

+ 20 - 8
MafiaTelegramBot/Models/Inlines/LeaveQuery.cs → MafiaTelegramBot/Models/Commands/LeaveCommand.cs

@@ -1,28 +1,40 @@
 using System.Threading.Tasks;
 using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.DataBase;
+using MafiaTelegramBot.Models.Inlines;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
 using Telegram.Bot.Types.Enums;
+using Telegram.Bot.Types.ReplyMarkups;
 
-namespace MafiaTelegramBot.Models.Inlines
+namespace MafiaTelegramBot.Models.Commands
 {
-    public class LeaveQuery : Query
+    public class LeaveCommand : Command
     {
-        protected override string Name => strings.leave_callback;
+        protected override string Name => strings.leave;
         public override async Task<Message> Execute(Update update)
         {
-            await DeletePreviousMessage(update.CallbackQuery.Message.Chat.Id, update.CallbackQuery.Message.MessageId);
-            var chatId = update.CallbackQuery.Message.Chat.Id;
+            var chatId = update.Message.Chat.Id;
             await Bot.Get().SendChatActionAsync(chatId, ChatAction.Typing);
-            var data = update.CallbackQuery.Data;
-            var userId = long.Parse(data.Split('|')[1]);
+
+            var userId = update.Message.From.Id;
             var user = await UserDao.GetUserById(userId);
             var game = user!.GetCurrentGame();
             var result = await RoomController.LeaveFromGame(user);
+            
+            ReplyKeyboardMarkup keyboard = new(
+                new[]
+                {
+                    new KeyboardButton[] {strings.create_game},
+                    new KeyboardButton[] {strings.connect_game},
+                    new KeyboardButton[] {strings.show_profile}
+                },
+                true
+            );
+            
             return result switch
             {
-                Constants.CODE_OK => await Bot.SendWithMarkdown2(chatId, $"{strings.leave_from_game} _*{game}*_"),
+                Constants.CODE_OK => await Bot.SendWithMarkdown2(chatId, $"{strings.leave_from_game} _*{game}*_", keyboard),
                 Constants.USER_NOT_IN_GAME => await Bot.SendWithMarkdown2(chatId, strings.not_in_game),
                 _ => await Bot.SendWithMarkdown2(chatId, strings.unexpected_error)
             };

+ 33 - 0
MafiaTelegramBot/Models/Commands/RoomSettingsCommand.cs

@@ -0,0 +1,33 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.DataBase;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.ReplyMarkups;
+
+namespace MafiaTelegramBot.Models.Commands
+{
+    public class RoomSettingsCommand:Command
+    {
+        protected override string Name => strings.settings_to_room;
+        public override async Task<Message> Execute(Update update)
+        {
+            var chatId = update.Message.Chat.Id;
+            var userId = update.Message.From.Id;
+
+            var user = await UserDao.GetUserById(userId);
+            var room_name = user.GetCurrentGame();
+            var room = await RoomController.GetRoom(room_name);
+            var room_max_capacity = room.MaxPlayers;
+            
+            var message = $"{strings.max_capacity_message}: {room_max_capacity}";
+            
+            var inlineKeyboard = new InlineKeyboardMarkup(new[]
+            {
+                new[] {InlineKeyboardButton.WithCallbackData(strings.decrease_number_of_players, $"{strings.decrease_number_of_players_callback}|{userId}"), InlineKeyboardButton.WithCallbackData(strings.increase_number_of_players, $"{strings.increase_number_of_players_callback}|{userId}")}
+            });
+
+            var reply = await Bot.SendWithMarkdown2(chatId, message, inlineKeyboard);
+            return reply;
+        }
+    }
+}

+ 1 - 1
MafiaTelegramBot/Models/Inlines/ConnectToPrivateRoom.cs → MafiaTelegramBot/Models/Inlines/ConnectToPrivateRoomQuery.cs

@@ -7,7 +7,7 @@ using Telegram.Bot.Types.Enums;
 
 namespace MafiaTelegramBot.Models.Inlines
 {
-    public class ConnectToPrivateRoom : Query
+    public class ConnectToPrivateRoomQuery : Query
     {
         protected override string Name => strings.connect_to_private_room_callback;
         public override async Task<Message> Execute(Update update)

+ 41 - 0
MafiaTelegramBot/Models/Inlines/DecreaseRoomMaxCapacity.cs

@@ -0,0 +1,41 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.DataBase;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.ReplyMarkups;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class DecreaseRoomMaxCapacity:Query
+    {
+        protected override string Name => strings.decrease_number_of_players_callback;
+        public override async Task<Message> Execute(Update update)
+        {
+            var messageId = update.CallbackQuery.Message.MessageId;
+            var chatId = update.CallbackQuery.Message.Chat.Id;
+
+            var data = update.CallbackQuery.Data;
+            var userId = long.Parse(data.Split('|')[1]);
+
+            var user = await UserDao.GetUserById(userId);
+            var room_name = user.GetCurrentGame();
+            var room = await RoomController.GetRoom(room_name);
+            var room_max_capacity = room.MaxPlayers;
+            
+            if (room_max_capacity > Constants.PLAYER_LIMITS_MIN)
+            {
+                room_max_capacity = --room.MaxPlayers;
+            }
+            
+            var message = $"{strings.max_capacity_message}: {room_max_capacity}";
+            
+            var inlineKeyboard = new InlineKeyboardMarkup(new[]
+            {
+                new[] {InlineKeyboardButton.WithCallbackData(strings.decrease_number_of_players, $"{strings.decrease_number_of_players_callback}|{userId}"), InlineKeyboardButton.WithCallbackData(strings.increase_number_of_players, $"{strings.increase_number_of_players_callback}|{userId}")}
+            });
+            
+            return await Bot.Get().EditMessageTextAsync(chatId, messageId, message, replyMarkup:inlineKeyboard);
+        }
+    }
+}

+ 43 - 0
MafiaTelegramBot/Models/Inlines/IncreaseRoomMaxCapacityQuery.cs

@@ -0,0 +1,43 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.DataBase;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.ReplyMarkups;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class IncreaseRoomMaxCapacityQuery : Query
+    {
+        protected override string Name => strings.increase_number_of_players_callback;
+
+        public override async Task<Message> Execute(Update update)
+        {
+            var messageId = update.CallbackQuery.Message.MessageId;
+            var chatId = update.CallbackQuery.Message.Chat.Id;
+
+            var data = update.CallbackQuery.Data;
+            var userId = long.Parse(data.Split('|')[1]);
+
+            var user = await UserDao.GetUserById(userId);
+            var room_name = user.GetCurrentGame();
+            var room = await RoomController.GetRoom(room_name);
+            var room_max_capacity = room.MaxPlayers;
+
+
+            if (room_max_capacity < Constants.PLAYER_LIMITS_MAX)
+            {
+                room_max_capacity = ++room.MaxPlayers;
+            }
+            
+            var message = $"{strings.max_capacity_message}: {room_max_capacity}";
+            
+            var inlineKeyboard = new InlineKeyboardMarkup(new[]
+            {
+                new[] {InlineKeyboardButton.WithCallbackData(strings.decrease_number_of_players, $"{strings.decrease_number_of_players_callback}|{userId}"), InlineKeyboardButton.WithCallbackData(strings.increase_number_of_players, $"{strings.increase_number_of_players_callback}|{userId}")}
+            });
+            
+            return await Bot.Get().EditMessageTextAsync(chatId, messageId, message, replyMarkup:inlineKeyboard);
+        }
+    }
+}

+ 1 - 1
MafiaTelegramBot/Models/Inlines/LookUsersList.cs → MafiaTelegramBot/Models/Inlines/LookUsersListQuery.cs

@@ -7,7 +7,7 @@ using Telegram.Bot.Types.Enums;
 
 namespace MafiaTelegramBot.Models.Inlines
 {
-    public class LookUsersList :Query
+    public class LookUsersListQuery :Query
     {
         protected override string Name => strings.look_user_list_callback;
         public override async Task<Message> Execute(Update update)

+ 72 - 0
MafiaTelegramBot/Resources/strings.Designer.cs

@@ -69,6 +69,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Начать игру.
+        /// </summary>
+        internal static string begin_game {
+            get {
+                return ResourceManager.GetString("begin_game", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Сменить имя.
         /// </summary>
@@ -168,6 +177,24 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to -.
+        /// </summary>
+        internal static string decrease_number_of_players {
+            get {
+                return ResourceManager.GetString("decrease_number_of_players", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to lower_number_of_players.
+        /// </summary>
+        internal static string decrease_number_of_players_callback {
+            get {
+                return ResourceManager.GetString("decrease_number_of_players_callback", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Введите код от комнаты.
         /// </summary>
@@ -240,6 +267,33 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to +.
+        /// </summary>
+        internal static string increase_number_of_players {
+            get {
+                return ResourceManager.GetString("increase_number_of_players", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to increase_number_of_players.
+        /// </summary>
+        internal static string increase_number_of_players_callback {
+            get {
+                return ResourceManager.GetString("increase_number_of_players_callback", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Исключить игрока.
+        /// </summary>
+        internal static string kick_player {
+            get {
+                return ResourceManager.GetString("kick_player", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Выйти.
         /// </summary>
@@ -321,6 +375,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Максимальное кол-во игроков.
+        /// </summary>
+        internal static string max_capacity_message {
+            get {
+                return ResourceManager.GetString("max_capacity_message", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Мои роли.
         /// </summary>
@@ -438,6 +501,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Настройки комнаты.
+        /// </summary>
+        internal static string settings_to_room {
+            get {
+                return ResourceManager.GetString("settings_to_room", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Магазин.
         /// </summary>

+ 24 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -195,4 +195,28 @@
     <data name="users_list_empty" xml:space="preserve">
         <value>В комнате нет игроков, кроме вас </value>
     </data>
+    <data name="begin_game" xml:space="preserve">
+        <value>Начать игру</value>
+    </data>
+    <data name="kick_player" xml:space="preserve">
+        <value>Исключить игрока</value>
+    </data>
+    <data name="settings_to_room" xml:space="preserve">
+        <value>Настройки комнаты</value>
+    </data>
+    <data name="decrease_number_of_players" xml:space="preserve">
+        <value>-</value>
+    </data>
+    <data name="decrease_number_of_players_callback" xml:space="preserve">
+        <value>lower_number_of_players</value>
+    </data>
+    <data name="increase_number_of_players" xml:space="preserve">
+        <value>+</value>
+    </data>
+    <data name="increase_number_of_players_callback" xml:space="preserve">
+        <value>increase_number_of_players</value>
+    </data>
+    <data name="max_capacity_message" xml:space="preserve">
+        <value>Максимальное кол-во игроков</value>
+    </data>
 </root>