Forráskód Böngészése

Fix long room name bug

Tigran 4 éve
szülő
commit
255b5e8a1d

+ 6 - 2
MafiaTelegramBot/Controllers/RoomController.cs

@@ -13,9 +13,9 @@ namespace MafiaTelegramBot.Controllers
 
         public static async Task<ResultCode> CreateNewGame(User owner, string roomName, bool extended, string secretPhrase = null)
         {
-            var gameExists = await Task.Run(() => OpenedGames.ContainsKey(roomName));
             return await Task.Run(async () =>
             {
+                var gameExists = await Task.Run(() => OpenedGames.ContainsKey(roomName));
                 if (gameExists) return ResultCode.GameAlreadyExists;
                 if (!await owner.SetRoomKey(secretPhrase ?? roomName)) return ResultCode.UserAlreadyInGame;
                 var room = secretPhrase == null
@@ -23,6 +23,7 @@ namespace MafiaTelegramBot.Controllers
                     : new PrivateGameRoom {Creator = owner, RoomName = roomName, IsExtended = extended};
                 OpenedGames.Add(secretPhrase ?? roomName, room);
                 room.Players.Add(owner.Id, owner);
+                RoomEncrypter.CreateShortName(roomName);
                 return ResultCode.CodeOk;
             });
         }
@@ -56,7 +57,10 @@ namespace MafiaTelegramBot.Controllers
                 var roomKey = player.GetRoomKey();
                 if (!await player.RemoveGame()) return ResultCode.UserNotInGame;
                 OpenedGames[roomKey].Players.Remove(player.Id);
-                if (OpenedGames[roomKey].Players.Count == 0) OpenedGames.Remove(roomKey);
+                if (OpenedGames[roomKey].Players.Count != 0) return ResultCode.CodeOk;
+                RoomEncrypter.RemoveShortName(OpenedGames[roomKey].RoomName);
+                if(OpenedGames[roomKey].IsPrivate) RoomEncrypter.Remove(OpenedGames[roomKey].RoomName);
+                OpenedGames.Remove(roomKey);
                 return ResultCode.CodeOk;
             });
         }

+ 29 - 1
MafiaTelegramBot/Game/RoomEncrypter.cs

@@ -8,7 +8,10 @@ namespace MafiaTelegramBot.Game
     {
         private static readonly Dictionary<string, string> ToPassword = new();
         private static readonly Dictionary<string, string> ToName = new();
-
+        
+        private static readonly Dictionary<string, string> ShortName = new();
+        private static readonly Dictionary<string, string> FullName = new();
+        
         public static string Encrypt(string roomName)
         {
             var pass = RandomString();
@@ -17,16 +20,34 @@ namespace MafiaTelegramBot.Game
             ToName.Add(pass,roomName);
             return pass;
         }
+        
+        public static void CreateShortName(string roomName)
+        {
+            var shortName = RandomString();
+            while (ShortName.ContainsKey(shortName)) shortName = RandomString();
+            ShortName.Add(roomName, shortName);
+            FullName.Add(shortName,roomName);
+        }
 
         public static string CodeToName(string pass)
         {
             return ToName.GetValueOrDefault(pass);
         }
+        
+        public static string FullToShort(string roomName)
+        {
+            return ShortName.GetValueOrDefault(roomName);
+        }
 
         public static string NameToCode(string name)
         {
             return ToPassword.GetValueOrDefault(name);
         }
+
+        public static string ShortToFull(string shortName)
+        {
+            return FullName.GetValueOrDefault(shortName);
+        }
         
         private static readonly Random Random = new Random();
 
@@ -43,5 +64,12 @@ namespace MafiaTelegramBot.Game
             ToName.Remove(pass);
             ToPassword.Remove(name);
         }
+        
+        public static void RemoveShortName(string roomName)
+        {
+            var shortName = FullToShort(roomName);
+            FullName.Remove(shortName);
+            ShortName.Remove(roomName);
+        }
     }
 }

+ 3 - 2
MafiaTelegramBot/Models/Inlines/ConnectToPublicRoomQuery.cs

@@ -1,5 +1,6 @@
 using System.Threading.Tasks;
 using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.Game;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
 using Telegram.Bot.Types.Enums;
@@ -21,13 +22,13 @@ namespace MafiaTelegramBot.Models.Inlines
             var rooms = await RoomController.GetPublicRooms();
             if (rooms.Count == 0) return await Bot.SendWithMarkdown2(chatId, strings.public_rooms_are_not_exist);
             var inlineButtons = new InlineKeyboardButton[rooms.Count];
-            for (var i = 0; i < rooms.Count; ++i) // buttons
+            for (var i = 0; i < rooms.Count && i < Constants.MAX_SHOWING_ROOMS; ++i) // buttons
             {
                 inlineButtons[i] = new InlineKeyboardButton
                 {
                     Text =
                         $"{rooms[i].RoomName} ({rooms[i].Players.Values.Count.ToString()}/{rooms[i].MaxPlayers.ToString()})",
-                    CallbackData = $"{callback.connect_to_selected_room}|{userId}|{rooms[i].RoomName}"
+                    CallbackData = $"{callback.connect_to_selected_room}|{userId}|{RoomEncrypter.FullToShort(rooms[i].RoomName)}"
                 };
             }
 

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

@@ -2,6 +2,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.DataBase;
+using MafiaTelegramBot.Game;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
 using Telegram.Bot.Types.Enums;
@@ -19,7 +20,8 @@ namespace MafiaTelegramBot.Models.Inlines
             var data = update.CallbackQuery.Data;
             var param = data.Split('|');
             var userId = long.Parse(param[1]);
-            var roomName = param[2];
+            var shortName = param[2];
+            var roomName = RoomEncrypter.ShortToFull(shortName);
             var user = await UserDao.GetUserById(userId);
             var resultCode = await RoomController.ConnectToGame(user, roomName);
             switch (resultCode)

+ 1 - 0
MafiaTelegramBot/Resources/Constants.cs

@@ -4,5 +4,6 @@ namespace MafiaTelegramBot.Resources
     {
         public const int PLAYER_LIMITS_MIN = 1;
         public const int PLAYER_LIMITS_MAX = 16;
+        public const int MAX_SHOWING_ROOMS = 10;
     }
 }