Bläddra i källkod

Refactor room handlers

Tigran 4 år sedan
förälder
incheckning
020d2e466f

+ 11 - 4
MafiaTelegramBot/Commands/CallbackQueries/UserInGameCallbackQueryHandler.cs

@@ -1,4 +1,5 @@
 using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.Game;
 using Telegram.Bot.Types;
 
@@ -8,14 +9,20 @@ namespace MafiaTelegramBot.Commands.CallbackQueries
     {
         protected override string Command => "";
 
-        public override Task<Message> Execute(Update update)
+        public override async Task<Message> Execute(Update update)
         {
-            return base.Execute(update);
+            var room = RoomController.GetRoom(RoomEncrypter.GetCode(User.GetRoomName()));
+            return room == null
+                ? await MessageController.SendText(User.Info, strings.room_does_not_exists)
+                : await room.MHandler.Handle(update, User);
         }
 
-        protected override bool IsMatches(string command)
+        public override bool IsMatches(string command)
         {
-            return User != null ? User.GetRoomName() != "" : base.IsMatches(command);
+            if (User == null) return base.IsMatches(command);
+            if (User.GetRoomName() == "") return false;
+            var room = RoomController.GetRoom(RoomEncrypter.GetCode(User.GetRoomName()));
+            return room?.IsRunning ?? false;
         }
 
         public UserInGameCallbackQueryHandler(Player player) : base(player) { }

+ 1 - 1
MafiaTelegramBot/Commands/Messages/ChangeNicknameMessageHandler.cs

@@ -18,7 +18,7 @@ namespace MafiaTelegramBot.Commands.Messages
             Queue.AddUnique(id);
         }
 
-        protected override bool IsMatches(string command)
+        public override bool IsMatches(string command)
         {
             return User != null ? Queue.Contains(User.Info.Id) : base.IsMatches(command);
         }

+ 1 - 1
MafiaTelegramBot/Commands/Messages/CreateRoomMessageHandler.cs

@@ -19,7 +19,7 @@ namespace MafiaTelegramBot.Commands.Messages
             Queue.AddUniqueOrReplaceByKey(id, param);
         }
 
-        protected override bool IsMatches(string command)
+        public override bool IsMatches(string command)
         {
             return User != null ? Queue.ContainsKey(User.Info.Id) : base.IsMatches(command);
         }

+ 1 - 1
MafiaTelegramBot/Commands/Messages/EnterCodeMessageHandler.cs

@@ -19,7 +19,7 @@ namespace MafiaTelegramBot.Commands.Messages
             Queue.AddUnique(id);
         }
 
-        protected override bool IsMatches(string command)
+        public override bool IsMatches(string command)
         {
             return User != null ? Queue.Contains(User.Info.Id) : base.IsMatches(command);
         }

+ 1 - 1
MafiaTelegramBot/Commands/Messages/GiveRoleToPlayerMessageHandler.cs

@@ -20,7 +20,7 @@ namespace MafiaTelegramBot.Commands.Messages
             Queue.AddUnique(id);
         }
 
-        protected override bool IsMatches(string command)
+        public override bool IsMatches(string command)
         {
             return User != null ? Queue.Contains(User.Info.Id) : base.IsMatches(command);
         }

+ 8 - 4
MafiaTelegramBot/Commands/Messages/UserInGameMessageHandler.cs

@@ -1,4 +1,5 @@
 using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.Game;
 using Telegram.Bot.Types;
 
@@ -8,14 +9,17 @@ namespace MafiaTelegramBot.Commands.Messages
     {
         protected override string Command => "";
 
-        protected override bool IsMatches(string command)
+        public override bool IsMatches(string command)
         {
-            return User != null ? User.GetRoomName()!= "" : base.IsMatches(command);
+            return User != null ? User.GetRoomName() != "" : base.IsMatches(command);
         }
 
-        public override Task<Message> Execute(Update update)
+        public override async Task<Message> Execute(Update update)
         {
-            return base.Execute(update);
+            var room = RoomController.GetRoom(RoomEncrypter.GetCode(User.GetRoomName()));
+            return room == null
+                ? await MessageController.SendText(User.Info, strings.room_does_not_exists)
+                : await room.MHandler.Handle(update, User);
         }
 
         public UserInGameMessageHandler(Player player) : base(player) { }

+ 1 - 1
MafiaTelegramBot/Commands/UpdateHandler.cs

@@ -17,7 +17,7 @@ namespace MafiaTelegramBot.Commands
         
         public virtual Task<Message> Execute(Update update) { return Task.FromResult(new Message()); }
 
-        protected virtual bool IsMatches(string command) { return command.Contains(Command); }
+        public virtual bool IsMatches(string command) { return command.Contains(Command); }
 
         public static async Task<UpdateHandler> Factory(User user, string message, UpdateHandler caller)
         {

+ 34 - 46
MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs

@@ -8,6 +8,7 @@ using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.DataBase.EntityDao;
 using MafiaTelegramBot.Game.GameRoles;
 using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
 using Timer = System.Timers.Timer;
 
 namespace MafiaTelegramBot.Game.GameRooms
@@ -373,57 +374,44 @@ namespace MafiaTelegramBot.Game.GameRooms
             return result;
         }
 
-        private async Task PutUpVote(long playerId, long targetId, int messageId = -1, bool toKill = false)
+        private async Task<Message> PutUpVote(long playerId, long targetId, int messageId = -1, bool toKill = false)
         {
-            if (Players.ContainsKey(playerId))
+            if (!Players.ContainsKey(playerId)) return new Message();
+            
+            if (targetId == 0)
+            {
+                await PlayersMessageChannel.SendExcept(Players[playerId].Info,
+                    $"{Players[playerId].Info.NickName} {strings.skip_vote}");
+                return await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId, strings.you_skip_vote);
+            }
+
+            if (!Players.ContainsKey(targetId))
+                return await PlayersMessageChannel.SendTo(Players[playerId].Info,
+                    strings.this_player_left_from_game);
+            
+            if (!toKill)
             {
-                if (targetId == 0)
+                if (!VoteUpList.AddUnique(Players[targetId])) return new Message();
+                if (playerId != targetId)
                 {
-                    if (!toKill)
-                        await PlayersMessageChannel.SendExcept(Players[playerId].Info,
-                            $"{Players[playerId].Info.NickName} {strings.skip_vote}");
-                    await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId, strings.you_skip_vote);
-                }
-                else
-                {
-                    if (Players.ContainsKey(targetId))
-                    {
-                        if (!toKill)
-                        {
-                            if (VoteUpList.AddUnique(Players[targetId]))
-                            {
-                                if (playerId != targetId)
-                                {
-                                    await PlayersMessageChannel.SendExcept(Players[playerId].Info,
-                                        $"{Players[playerId].Info.NickName} {strings.put_up_vote_to} {Players[targetId].Info.NickName}");
-                                    await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
-                                        $"{strings.you_vote_player} {Players[targetId].Info.NickName}");
-                                }
-                                else
-                                {
-                                    await PlayersMessageChannel.SendExcept(Players[playerId].Info,
-                                        $"{Players[playerId].Info.NickName} {strings.vote_to_self}");
-                                    await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId, strings.you_vote_to_self);
-                                }
-                            }
-                        }
-                        else if (_voteKillList.AddUniqueByKey(playerId, targetId))
-                        {
-                            VoteUpList.Add(Players[targetId]);
-                            if (messageId != -1)
-                            {
-                                if (playerId != targetId)
-                                    await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
-                                        $"{strings.you_vote_to_kill} {Players[targetId].Info.NickName}");
-                                else
-                                    await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
-                                        strings.you_vote_to_kill_self);
-                            }
-                        }
-                    }
+                    await PlayersMessageChannel.SendExcept(Players[playerId].Info,
+                        $"{Players[playerId].Info.NickName} {strings.put_up_vote_to} {Players[targetId].Info.NickName}");
+                    return await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
+                        $"{strings.you_vote_player} {Players[targetId].Info.NickName}");
                 }
+                await PlayersMessageChannel.SendExcept(Players[playerId].Info,
+                    $"{Players[playerId].Info.NickName} {strings.vote_to_self}");
+                return await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
+                    strings.you_vote_to_self);
             }
-            else await PlayersMessageChannel.SendTo(Players[playerId].Info, strings.this_player_left_from_game);
+            
+            if (!_voteKillList.AddUniqueByKey(playerId, targetId)) return new Message();
+            VoteUpList.Add(Players[targetId]);
+            if (messageId == -1) return new Message();
+            if (playerId != targetId)
+                return await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId,
+                    $"{strings.you_vote_to_kill} {Players[targetId].Info.NickName}");
+            return await PlayersMessageChannel.EditTo(Players[playerId].Info, messageId, strings.you_vote_to_kill_self);
         }
 
         private async Task EndOfGame()

+ 5 - 3
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageChannels.cs

@@ -23,9 +23,10 @@ namespace MafiaTelegramBot.Game.GameRooms
                 return new Message();
             }
             
-            public async Task EditTo(UserEntity info, int messageId, string message, InlineKeyboardMarkup replyMarkup = null)
+            public async Task<Message> EditTo(UserEntity info, int messageId, string message, InlineKeyboardMarkup replyMarkup = null)
             {
-                if (Room.Players.ContainsKey(info.Id)) await MessageController.EditMessage(info, messageId, message, replyMarkup);
+                if (Room.Players.ContainsKey(info.Id))  return await MessageController.EditMessage(info, messageId, message, replyMarkup);
+                return new Message();
             }
             
             public async Task Send(string message, IReplyMarkup replyMarkup = null)
@@ -46,10 +47,11 @@ namespace MafiaTelegramBot.Game.GameRooms
                 return messages;
             }
 
-            public async Task SendExcept(UserEntity user, string message, IReplyMarkup replyMarkup = null)
+            public async Task<Message> SendExcept(UserEntity user, string message, IReplyMarkup replyMarkup = null)
             {
                 foreach (var info in Players)
                     if (info.Id != user.Id) await MessageController.SendText(info, message, replyMarkup);
+                return new Message();
             }
 
             public async Task SendSticker(string fileId)

+ 66 - 59
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageHandler.cs

@@ -1,10 +1,12 @@
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Commands;
+using MafiaTelegramBot.Commands.CallbackQueries;
+using MafiaTelegramBot.Commands.Messages;
 using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.Game.GameRoles;
-using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
 
@@ -18,57 +20,67 @@ namespace MafiaTelegramBot.Game.GameRooms
             
             private readonly GameRoom _room;
 
+            private readonly List<UpdateHandler> _commandsList = new()
+            {
+                new ShowProfileMessageHandler(null),
+                new LeaveMessageHandler(null),
+                new RoomSettingsMessageHandler(null),
+                new KickSelectedPlayerCallbackQueryHandler(null),
+                new StartGameMessageHandler(null),
+                new LookPlayersListMessageHandler(null),
+            };
+
             public MessageHandler(GameRoom room)
             {
                 _room = room;
             }
 
-            public async Task<Message> Handle(Update update)
+            public async Task<Message> Handle(Update update, Player player)
             {
                 var text = update.Message.Text;
-                var userId = update.Message.From.Id;
-                if (!_room.Players.ContainsKey(userId)) return new Message();
-                if(_exitingPlayers.Contains(userId)) await Leave(_room.Players[userId], update.Message.Text);
-                else if (text == keyboard.look_players_list) await LookPlayers(_room.Players[userId]);
-                else if (text == keyboard.leave) await Leave(_room.Players[userId]);
-                else if (text == keyboard.end_turn)
+                if (_room.IsRunning)
                 {
-                    if (_room.IsDay && _room.Players[userId].IsSpeaker) _room.Players[userId].CurrentRole.TalkingActionComplete.Set();
-                    else await _room.PlayersMessageChannel.SendTo(userId, strings.now_is_not_your_turn);
+                    if (_exitingPlayers.Contains(player.Info.Id)) return await Leave(player, update.Message.Text);
+                    if (text == keyboard.look_players_list) return await LookPlayers(player);
+                    if (text == keyboard.leave) return await Leave(player);
+                    if (text == keyboard.end_turn)
+                    {
+                        player.CurrentRole.TalkingActionComplete.Set();
+                        player.CurrentRole.TalkingActionComplete.Reset();
+                        return update.Message;
+                    }
+                    if (player.IsSpeaker) return await ForwardMessage(player, text);
+                    return await MessageController.SendText(player.Info, strings.now_is_not_your_turn);
                 }
-                else await ForwardMessage(_room.Players[userId], text);
-                return update.Message;
+                foreach (var item in _commandsList)
+                    if(item.IsMatches(text))
+                        if (Activator.CreateInstance(item.GetType(), player) is UpdateHandler handler)
+                            if(handler.IsMatches(text)) return await handler.Execute(update);
+                return await ForwardMessage(player, text);
             }
             
-            private async Task ForwardMessage(Player player, string message)
+            private async Task<Message> ForwardMessage(Player player, string message)
             {
-                if(!_room.IsRunning) await _room.PlayersMessageChannel.SendExcept(player.Id, $"{player.NickName}: {message}");
-                else
+                if(!_room.IsRunning) return await _room.PlayersMessageChannel.SendExcept(player.Info, $"{player.Info.NickName}: {message}");
+                if (!player.IsAlive) return await _room.PlayersMessageChannel.SendTo(player.Info, strings.you_now_died);
+                if (player.IsBlocked) return await _room.PlayersMessageChannel.SendTo(player.Info, strings.you_blocked);
+                if (!player.IsSpeaker) return await _room.PlayersMessageChannel.SendTo(player.Info, strings.now_you_cant_speak);
+                if (_room.IsDay) return await _room.PlayersMessageChannel.SendExcept(player.Info, $"({player.TurnOrder}) {player.Info.NickName}: {message}");
+                if (player.CurrentRole.ColorRole == 2)
+                    await _room.MafiaMessageChannel.SendExcept(player.Info, $"({player.TurnOrder}) {player.Info.NickName}: {message}");
+                if (player.CurrentRole is ParasiteRole role)
+                    return await _room.PlayersMessageChannel.SendTo(_room.Players[role.ParentId].Info, $"({player.TurnOrder}) {player.Info.NickName}: {message}");
+                try
                 {
-                    if (!player.IsAlive) await _room.PlayersMessageChannel.SendTo(player.Id, strings.you_now_died);
-                    else if (player.IsBlocked) await _room.PlayersMessageChannel.SendTo(player.Id, strings.you_blocked);
-                    else if (!player.IsSpeaker) await _room.PlayersMessageChannel.SendTo(player.Id, strings.now_you_cant_speak);
-                    else if (_room.IsDay) await _room.PlayersMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
-                    else
-                    {
-                        if (player.CurrentRole.ColorRole == 2)
-                            await _room.MafiaMessageChannel.SendExcept(player.Id, $"({player.TurnOrder}) {player.NickName}: {message}");
-                        if (player.GetRole() is Roles.Parasite)
-                        {
-                            var parasiteRole = player.CurrentRole as ParasiteRole;
-                            await _room.PlayersMessageChannel.SendTo(parasiteRole!.ParentId, $"({player.TurnOrder}) {player.NickName}: {message}");
-                        }
-                        else if (_room.PlayersRole.ContainsKey(Roles.Parasite)
-                                 && _room.PlayersRole[Roles.Parasite].Count == 1
-                                 && ((ParasiteRole)_room.PlayersRole[Roles.Parasite][0].CurrentRole).ParentId == player.Id)
-                        {
-                            await _room.PlayersMessageChannel.SendTo(_room.PlayersRole[Roles.Parasite][0].Id, $"({player.TurnOrder}) {player.NickName}: {message}");
-                        }
-                    }
+                    if (_room.PlayersRole[Roles.Parasite][0].CurrentRole is ParasiteRole parasite && parasite.ParentId == player.Info.Id)
+                        return await _room.PlayersMessageChannel.SendTo(_room.PlayersRole[Roles.Parasite][0].Info,
+                            $"({player.TurnOrder}) {player.Info.NickName}: {message}");
                 }
+                catch (Exception) { }
+                return new Message();
             }
 
-            private async Task LookPlayers(Player player)
+            private async Task<Message> LookPlayers(Player player)
             {
                 var players = _room.Players.Values.ToArray();
                 var nextPlayer = _room._turnOrder.Peek();
@@ -78,43 +90,38 @@ namespace MafiaTelegramBot.Game.GameRooms
                 for (var i = 0; i != stopIndex; i = (i+1) % players.Length)
                 {
                     i %= players.Length;
-                    if (stopIndex == -1 && players[i].Id == nextPlayer.Id) stopIndex = i;
+                    if (stopIndex == -1 && players[i].Info.Id == nextPlayer.Info.Id) stopIndex = i;
                     if (stopIndex == -1) continue;
-                    var role =  knownRoles.ContainsKey(players[i].Id)
-                        ? knownRoles[players[i].Id]
+                    var role =  knownRoles.ContainsKey(players[i].Info.Id)
+                        ? knownRoles[players[i].Info.Id]
                         : "";
                     message +=
                         $"\n{(message == strings.players_list ? strings.next + " - " : "")}" +
                         $"({players[i].TurnOrder}) " +
-                        $"{(players[i].Id == player.Id ? strings.you : players[i].NickName)} " +
+                        $"{(players[i].Info.Id == player.Info.Id ? strings.you : players[i].Info.NickName)} " +
                         $"({(players[i].IsAlive ? strings.alive : strings.died)}) " +
                         $"{role}";
                 }
-                await _room.PlayersMessageChannel.SendTo(player.Id, message);
+                return await _room.PlayersMessageChannel.SendTo(player.Info, message);
             }
 
-            private async Task Leave(Player player, string text = "")
+            private async Task<Message> Leave(Player player, string text = "")
             {
                 var roomName = player.GetRoomName();
-                if (_room.IsRunning)
+                if (_exitingPlayers.Remove(player.Info.Id))
                 {
-                    if (_exitingPlayers.Remove(player.Id))
-                    {
-                        if (text == strings.exit)
-                        {
-                            var resultCode = await RoomController.LeaveFromGame(player);
-                            if (resultCode == ResultCode.CodeOk)
-                                await Bot.SendWithMarkdown2(player.ChatId, $"{strings.you_leave_from_game} _*{roomName}*_",
-                                    player.IsAdmin ? Keyboard.AdminMainMenu : Keyboard.MainMenu);
-                            else await Utilities.GetResultCodeMessage(resultCode, player.ChatId);
-                        }
-                    }
-                    else
-                    {
-                        _exitingPlayers.Add(player.Id);
-                        await _room.PlayersMessageChannel.SendTo(player.ChatId, $"{strings.confirm_exit} ```{strings.exit}``` {strings.to_confirm_exit}");
-                    }
+                    if (text != strings.exit) return new Message();
+                    var resultCode = await RoomController.LeaveFromGame(player);
+                    if (resultCode == ResultCode.CodeOk)
+                        return await MessageController.SendText(player.Info,
+                            $"{strings.you_leave_from_game} {roomName}",
+                            player.Info.IsAdmin ? Keyboard.AdminMainMenu : Keyboard.MainMenu);
+                    return await MessageController.SendText(player.Info,
+                        Utilities.GetResultCodeMessage(resultCode));
                 }
+                _exitingPlayers.Add(player.Info.Id);
+                return await _room.PlayersMessageChannel.SendTo(player.Info,
+                    $"{strings.confirm_exit} \"{strings.exit}\" {strings.to_confirm_exit}");
             }
         }
     }

+ 9 - 15
MafiaTelegramBot/Game/GameRooms/GameRoom.QueryHandler.cs

@@ -1,6 +1,5 @@
 using System;
 using System.Threading.Tasks;
-using MafiaTelegramBot.DataBase.EntityDao;
 using MafiaTelegramBot.Game.GameRoles;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;
@@ -18,36 +17,31 @@ namespace MafiaTelegramBot.Game.GameRooms
                 _room = room;
             }
             
-            public async Task Handle(Update update)
+            public async Task<Message> Handle(Update update, Player player)
             {
                 var data = update.CallbackQuery.Data.Split('|');
-                var userId = long.Parse(data[1]);
-                var player = await UserDao.GetPlayerById(userId);
-                var messageId = update.CallbackQuery.Message.MessageId;
-                var chatId = player.ChatId;
                 var command = Enum.Parse<Callback>(data[0]);
                 switch (command)
                 {
                     case Callback.Vote:
-                        await _room.PutUpVote(player.Id, long.Parse(data[2]), messageId);
+                        var message = await _room.PutUpVote(player.Info.Id, 
+                            long.Parse(data[2]), update.CallbackQuery.Message.MessageId);
                         player.CurrentRole.VoteActionComplete.Set();
                         player.CurrentRole.VoteActionComplete.Reset();
-                        break;
+                        return message;
                     case Callback.VoteToKill:
-                        await _room.PutUpVote(player.Id, long.Parse(data[2]), messageId, true);
-                        break;
+                        return await _room.PutUpVote(player.Info.Id, long.Parse(data[2]), update.CallbackQuery.Message.MessageId, true);
                     case Callback.NightTarget:
                         await player.CurrentRole.SetNightTarget(long.Parse(data[2]));
-                        break;
+                        return new Message();
                     case Callback.MafiaTarget:
                         await player.CurrentRole.SetMafiaTarget(long.Parse(data[2]));
-                        break;
+                        return new Message();
                     case Callback.DetectiveTarget:
                         await ((DetectiveRole) player.CurrentRole).SetNightTarget(long.Parse(data[2]), data[3]);
-                        break;
+                        return new Message();
                     default:
-                        await _room.PlayersMessageChannel.SendTo(chatId, strings.not_supported_in_game);
-                        break;
+                        return await _room.PlayersMessageChannel.SendTo(player.Info, strings.not_supported_in_game);
                 }
             }
         }

+ 1 - 1
MafiaTelegramBot/Resources/Constants.cs

@@ -8,7 +8,7 @@ namespace MafiaTelegramBot.Resources
 {
     public static class Constants
     {
-        public const bool DEBUG = false;
+        public const bool DEBUG = true;
         
         public const int PLAYER_LIMITS_MIN = DEBUG ? 1 : 6;
         public const int MEMORY_CLEANER_INTERVAL = DEBUG ? 20 * 1000 : 30 * 60 * 1000;