Explorar el Código

MTB-7 connect to public room

zelpold hace 4 años
padre
commit
6f5703d908

+ 19 - 0
MafiaTelegramBot/Controllers/RoomController.cs

@@ -74,6 +74,25 @@ namespace MafiaTelegramBot.Controllers
                 return Constants.CODE_OK;
             });
         }
+
+        public static async Task<List<GameRoom>> GetPublicRooms()
+        {
+            return await Task.Run(() =>
+            {
+                var rooms = OpenedGames.Values.ToList();
+                List<GameRoom> publicRooms = new List<GameRoom>();
+                int countRooms = 0;
+                foreach (var room in rooms)
+                {
+                    if (room.IsPrivate) continue;
+                    if (room.IsFilled()) continue;
+                    publicRooms.Add(room);
+                    countRooms++;
+                    if (countRooms == 10) break;
+                }
+                return publicRooms;
+            });
+        }
         
         public static async Task<GameRoom> GetRoom(string roomKey)
         {

+ 3 - 1
MafiaTelegramBot/Models/Bot.cs

@@ -76,7 +76,9 @@ namespace MafiaTelegramBot.Models
                 new ConnectToPrivateRoomQuery(),
                 new LookUsersListQuery(),
                 new IncreaseRoomMaxCapacityQuery(),
-                new DecreaseRoomMaxCapacity()
+                new DecreaseRoomMaxCapacity(),
+                new ConnectToPublicRoomQuery(),
+                new ConnectToSelectedRoomQuery()
             };
         }
         

+ 44 - 0
MafiaTelegramBot/Models/Inlines/ConnectToPublicRoomQuery.cs

@@ -0,0 +1,44 @@
+using System.Collections;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.Enums;
+using Telegram.Bot.Types.ReplyMarkups;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class ConnectToPublicRoomQuery : Query
+    {
+        protected override string Name => strings.connect_to_public_room_callback;
+        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;
+            await Bot.Get().SendChatActionAsync(chatId, ChatAction.Typing);
+            var data = update.CallbackQuery.Data;
+            var param = data.Split('|');
+            var userId = long.Parse(param[1]);
+            var rooms = await RoomController.GetPublicRooms();
+            if (rooms.Count != 0)
+            {
+                
+                
+                InlineKeyboardButton[] inlineButtons = new InlineKeyboardButton[rooms.Count];
+                for (var i = 0; i < rooms.Count; ++i) // buttons
+                {
+                    inlineButtons[i] = new InlineKeyboardButton
+                    {
+                        Text =
+                            $"{rooms[i].RoomName} ({rooms[i].Players.Values.Count.ToString()}/{rooms[i].MaxPlayers.ToString()}",
+                        CallbackData = $"{strings.connect_to_selected_room_callback}|{userId}|{rooms[i].RoomName}"
+                    };
+                }
+
+                var inlineKeyboard = new InlineKeyboardMarkup(inlineButtons);
+                return await Bot.SendWithMarkdown2(chatId, strings.rooms, inlineKeyboard);
+            }
+            return await Bot.SendWithMarkdown2(chatId, strings.public_rooms_are_not_exist);
+        }
+    }
+}

+ 54 - 0
MafiaTelegramBot/Models/Inlines/ConnectToSelectedRoomQuery.cs

@@ -0,0 +1,54 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.DataBase;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.Enums;
+using Telegram.Bot.Types.ReplyMarkups;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class ConnectToSelectedRoomQuery : Query
+    {
+        protected override string Name => strings.connect_to_selected_room_callback;
+        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;
+            await Bot.Get().SendChatActionAsync(chatId, ChatAction.Typing);
+            var data = update.CallbackQuery.Data;
+            var param = data.Split('|');
+            var userId = long.Parse(param[1]);
+            var roomName = param[2];
+            var user = await UserDao.GetUserById(userId);
+            var resultCode = await RoomController.ConnectToGame(user, roomName);
+            switch (resultCode)
+            {
+                case Constants.CODE_OK:
+                {
+                    var users = await RoomController.GetPlayers(roomName);
+                    foreach (var player in users)
+                    {
+                        if (userId == player.Id) continue;
+                        await Bot.SendWithMarkdown2(player.ChatId, $"{strings.entry_another_user} _*{user?.Username}*_");
+                    }
+                    var keyboard = new InlineKeyboardMarkup(new []
+                    {
+                        new []{
+                            InlineKeyboardButton.WithCallbackData(strings.look_user_list, $"{strings.look_user_list_callback}|{userId}|{roomName}"),
+                            //TODO сделать другой выход из комнаты
+                            InlineKeyboardButton.WithCallbackData(strings.leave, $"{strings.leave_callback}|{userId}")
+                        }
+                    });
+                    return await Bot.SendWithMarkdown2(chatId, strings.successful_entry_into_room, keyboard);
+                }
+                case Constants.ROOM_IS_FILLED:
+                    return await Bot.SendWithMarkdown2(chatId, strings.room_is_filled);
+                case Constants.USER_ALREADY_IN_GAME:
+                    return await Bot.SendWithMarkdown2(chatId, strings.user_already_in_game);
+                default:
+                    return await Bot.SendWithMarkdown2(chatId, strings.unexpected_error);
+            }
+        }
+    }
+}

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

@@ -168,6 +168,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to connect_to_selected_room_callback.
+        /// </summary>
+        internal static string connect_to_selected_room_callback {
+            get {
+                return ResourceManager.GetString("connect_to_selected_room_callback", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Создать игру.
         /// </summary>
@@ -429,6 +438,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Открытых публичных комнат нет.
+        /// </summary>
+        internal static string public_rooms_are_not_exist {
+            get {
+                return ResourceManager.GetString("public_rooms_are_not_exist", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Комната.
         /// </summary>
@@ -456,6 +474,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Комнаты .
+        /// </summary>
+        internal static string rooms {
+            get {
+                return ResourceManager.GetString("rooms", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Секретный код для подключения к комнате.
         /// </summary>

+ 9 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -219,4 +219,13 @@
     <data name="max_capacity_message" xml:space="preserve">
         <value>Максимальное кол-во игроков</value>
     </data>
+    <data name="connect_to_selected_room_callback" xml:space="preserve">
+        <value>connect_to_selected_room_callback</value>
+    </data>
+    <data name="public_rooms_are_not_exist" xml:space="preserve">
+        <value>Открытых публичных комнат нет</value>
+    </data>
+    <data name="rooms" xml:space="preserve">
+        <value>Комнаты </value>
+    </data>
 </root>