Browse Source

Connecting to ranked games

Tigran 4 năm trước cách đây
mục cha
commit
9ad8b98281

+ 27 - 2
MafiaTelegramBot/Controllers/RoomController.cs

@@ -87,7 +87,7 @@ namespace MafiaTelegramBot.Controllers
             });
         }
 
-        public static async Task<List<GameRoom>> GetPublicRooms()
+        public static async Task<List<GameRoom>> GetPublicNotRankedRooms()
         {
             return await Task.Run(() =>
             {
@@ -99,7 +99,32 @@ namespace MafiaTelegramBot.Controllers
                 }
 
                 var rooms = OpenedGames.Values
-                    .Where(room => !room.IsPrivate && !room.IsFilled() && !room.IsRunning).
+                    .Where(room => !room.IsPrivate && !room.IsFilled() && !room.IsRunning && !room.IsRanking).
+                    ToList();
+                rooms.Sort((room, room2) => Comparison(room, room2).Result);
+                return rooms;
+            });
+        }
+
+        public static async Task<List<GameRoom>> GetPublicRankedRooms(char rank)
+        {
+            return await Task.Run(() =>
+            {
+                async Task<int> Comparison(GameRoom room, GameRoom room2)
+                {
+                    var first = await room.GetCapacity() / (double) await room.GetMaximum();
+                    var second = await room2.GetCapacity() / (double) await room2.GetMaximum();
+                    return second > first ? 1 : 0;
+                }
+
+                bool IsNeighborRank(char roomRank, char playerRank)
+                {
+                    return roomRank - playerRank > -2 && roomRank - playerRank < 2;
+                }
+                
+                var rooms = OpenedGames.Values
+                    .Where(room => !room.IsPrivate && !room.IsFilled() && !room.IsRunning
+                                   && room.IsRanking && IsNeighborRank(room.GetRoomRank().Result, rank)).
                     ToList();
                 rooms.Sort((room, room2) => Comparison(room, room2).Result);
                 return rooms;

+ 9 - 0
MafiaTelegramBot/DataBase/Entity/UserEntity.cs

@@ -28,6 +28,15 @@ namespace MafiaTelegramBot.DataBase.Entity
         [Column("nickname") , MaxLength(127)] public string NickName { get; set; } = "\\[NoNickname\\]";
         
         [Column("rank_number") , MaxLength(127)] public int RankNumber { get; set; } = 0;
+        
+        [Column("is_admin"), MaxLength(127)] private int isAdmin { get; set; } = 0;
+
+        [NotMapped]
+        public bool IsAdmin
+        {
+            get => isAdmin > 0;
+            set => isAdmin = value ? 1 : 0;
+        }
 
         public async Task UpdateNickName(string newName)
         {

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

@@ -88,7 +88,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     await PlayersRole[Roles.Parasite][0].CurrentRole.Kill();
                 if (player.CurrentRole.RoleKey==Roles.Werewolf) player.WerewolfRoleAchievementEvent(0,true);
             }
-            player.SubtractRankPoints();
+            if (IsRanking) player.SubtractRankPoints();
             player.ResetState();
         }
 

+ 2 - 0
MafiaTelegramBot/Models/Bot.cs

@@ -82,6 +82,8 @@ namespace MafiaTelegramBot.Models
                 new ChooseRoomViewQuery(),
                 new ChooseGameTypeQuery(),
                 new ChooseGameModeQuery(),
+                new ConnectToRankedQuery(),
+                new ConnectToNotRankedQuery(),
             };
         }
         

+ 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, 
-                Keyboard.RoomTypeKeyboard(UserId, Callback.ConnectToPrivateRoom, Callback.ConnectToPublicRoom));
+                Keyboard.RoomTypeKeyboard(UserId));
         }
     }
 }

+ 22 - 0
MafiaTelegramBot/Models/Inlines/ConnectToNotRankedQuery.cs

@@ -0,0 +1,22 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.DataBase.EntityDao;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class ConnectToNotRankedQuery : Query
+    {
+        protected override Callback Name => Callback.ConnectToNotRanked;
+
+        protected override async Task<Message> Execute(Update update)
+        {
+            await DeletePreviousMessage(ChatId, update.CallbackQuery.Message.MessageId);
+            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_view_room, 
+                Keyboard.RoomViewKeyboard(UserId, Callback.ConnectToPrivateRoom, Callback.ConnectToPublicRoom));
+        }
+    }
+}

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

@@ -13,7 +13,7 @@ namespace MafiaTelegramBot.Models.Inlines
         {
             await DeletePreviousMessage(ChatId, update.CallbackQuery.Message.MessageId);
             var data = update.CallbackQuery.Data.Split('|');
-            var rooms = await RoomController.GetPublicRooms();
+            var rooms = await RoomController.GetPublicNotRankedRooms();
             if (rooms.Count == 0) return await Bot.SendWithMarkdown2(ChatId, strings.public_rooms_are_not_exist);
             return await Bot.SendWithMarkdown2(ChatId, strings.rooms, Keyboard.RoomsKeyboard(rooms, UserId, int.Parse(data[2])));
         }

+ 28 - 0
MafiaTelegramBot/Models/Inlines/ConnectToRankedQuery.cs

@@ -0,0 +1,28 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.DataBase.EntityDao;
+using MafiaTelegramBot.Game;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class ConnectToRankedQuery : Query
+    {
+        protected override Callback Name => Callback.ConnectToRanked;
+
+        protected override async Task<Message> Execute(Update update)
+        {
+            await DeletePreviousMessage(ChatId, update.CallbackQuery.Message.MessageId);
+            var user = await UserDao.GetPlayerById(UserId);
+            if (user.GetRoomName() != "")
+                return await Bot.SendWithMarkdown2(ChatId, strings.user_already_in_game);
+            var rooms = await RoomController.GetPublicRankedRooms(user.GetRank());
+            if (rooms.Count == 0) return await Bot.SendWithMarkdown2(ChatId, strings.public_rooms_are_not_exist);
+            var roomKey = RoomEncrypter.GetCode(rooms[0].RoomName);
+            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, Keyboard.PlayerGameMenu);
+        }
+    }
+}

+ 3 - 1
MafiaTelegramBot/Resources/Callback.cs

@@ -25,6 +25,8 @@ namespace MafiaTelegramBot.Resources
         ShowMyExtendedStats,
         ChooseRoomView,
         ChooseGameMode,
-        ChooseGameType
+        ChooseGameType,
+        ConnectToNotRanked,
+        ConnectToRanked
     }
 }

+ 10 - 1
MafiaTelegramBot/Resources/Keyboard.cs

@@ -44,7 +44,7 @@ namespace MafiaTelegramBot.Resources
             }, true
         );
 
-        public static InlineKeyboardMarkup RoomTypeKeyboard(long userId, Callback callbackPrivate, Callback callbackPublic)
+        public static InlineKeyboardMarkup RoomViewKeyboard(long userId, Callback callbackPrivate, Callback callbackPublic)
         {
             return new(new[]
             {
@@ -53,6 +53,15 @@ namespace MafiaTelegramBot.Resources
             });
         }
 
+        public static InlineKeyboardMarkup RoomTypeKeyboard(long userId)
+        {
+            return new(new[]
+            {
+                InlineKeyboardButton.WithCallbackData(strings.normal_game, $"{Callback.ConnectToNotRanked}|{userId}|0"),
+                InlineKeyboardButton.WithCallbackData(strings.ranking_game, $"{Callback.ConnectToRanked}|{userId}|0"),
+            });
+        }
+
         public static InlineKeyboardMarkup ChooseRoomView(long userId)
         {
             return new InlineKeyboardMarkup(new[]

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

@@ -1190,5 +1190,11 @@ namespace MafiaTelegramBot {
                 return ResourceManager.GetString("ranking_game", resourceCulture);
             }
         }
+        
+        internal static string choose_view_room {
+            get {
+                return ResourceManager.GetString("choose_view_room", resourceCulture);
+            }
+        }
     }
 }

+ 3 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -591,4 +591,7 @@
     <data name="ranking_game" xml:space="preserve">
         <value>Рейтинговая игра</value>
     </data>
+    <data name="choose_view_room" xml:space="preserve">
+        <value>Выберите вид комнаты</value>
+    </data>
 </root>