Ver Fonte

Change message resend logic, add some fields to determine game and player state

Tigran há 4 anos atrás
pai
commit
bcb2554e8c

+ 8 - 2
MafiaTelegramBot/Controllers/RoomController.cs

@@ -2,6 +2,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.Game;
+using MafiaTelegramBot.Game.GameRoles;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;
 using MafiaTelegramBot.Resources;
@@ -37,7 +38,7 @@ namespace MafiaTelegramBot.Controllers
                 if (!player.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
                 if (OpenedGames[roomKey].IsFilled()) return ResultCode.RoomIsFilled;
                 OpenedGames[roomKey].Players.Add(player.Id, player);
-                await OpenedGames[roomKey].NotifyPlayersAbout(player.Id, $"{player.NickName} {strings.connected_to_game}");
+                await OpenedGames[roomKey].PlayersCh.SendExcept(player.Id, $"{player.NickName} {strings.connected_to_game}");
                 return ResultCode.CodeOk;
             });
         }
@@ -54,8 +55,13 @@ namespace MafiaTelegramBot.Controllers
                 var roomName = player.GetRoomName();
                 var roomKey = RoomEncrypter.GetCode(roomName);
                 if (!await player.RemoveGame()) return ResultCode.UserNotInGame;
+                player.IsPlaying = false;
+                player.IsSpeaker = false;
+                player.IsAlive = true;
+                player.CurrentRole = new NoneRole();
+                player.TurnOrder = -1;
                 OpenedGames[roomKey].Players.Remove(player.Id);
-                await OpenedGames[roomKey].NotifyPlayersAbout(player.Id, $"{player.NickName} {strings.leave_from_game}");
+                await OpenedGames[roomKey].PlayersCh.SendExcept(player.Id, $"{player.NickName} {strings.leave_from_game}");
                 if (OpenedGames[roomKey].Players.Count >= 0) return ResultCode.CodeOk;
                 RoomEncrypter.RemoveCode(roomName);
                 OpenedGames.Remove(roomKey);

+ 80 - 0
MafiaTelegramBot/Game/GameRooms/GameRoom.MessageHandler.cs

@@ -0,0 +1,80 @@
+using System.Linq;
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.DataBase.EntityDao;
+using MafiaTelegramBot.Models;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+
+namespace MafiaTelegramBot.Game.GameRooms
+{
+    public partial class GameRoom
+    {
+        public class MessageHandler
+        {
+            private GameRoom _room;
+
+            public MessageHandler(GameRoom room)
+            {
+                _room = room;
+            }
+
+            public async Task<Message> Handle(Update update)
+            {
+                var text = update.Message.Text;
+                var userId = update.Message.From.Id;
+                var chatId = update.Message.Chat.Id;
+                if (text == keyboard.look_players_list) await LookPlayers(chatId);
+                else if (text == keyboard.leave) await Leave(chatId, userId);
+                else
+                {
+                    var player = await UserDao.GetPlayerById(userId);
+                    if (!player.IsAlive) await Bot.SendWithMarkdown2(chatId, strings.you_now_died);
+                    else
+                    {
+                        if (_room.IsDay)
+                        {
+                            if (player.IsSpeaker)
+                                await _room.PlayersCh.SendExcept(userId, $"\\({player.TurnOrder}\\){player.NickName}: {update.Message.Text}");
+                            else
+                                await Bot.SendWithMarkdown2(chatId, strings.now_is_not_your_turn);
+                        }
+                        else
+                        {
+                            if (player.IsSpeaker)
+                                await _room.MafiaCh.SendExcept(userId, $"\\({player.TurnOrder}\\){player.NickName}: {update.Message.Text}");
+                            else
+                            {
+                                if(_room.IsFirstNight && player.CurrentRole.RoleKey is Roles.Mafia or Roles.Don)
+                                    await Bot.SendWithMarkdown2(chatId, strings.mafia_get_mail);
+                                else await Bot.SendWithMarkdown2(chatId, strings.villagers_are_sleep);
+                            }
+                        }
+                    }
+                }
+                return update.Message;
+            }
+
+            private async Task LookPlayers(long chatId)
+            {
+                var players = _room.Players.Values.ToList();
+                players.Sort((x, y) => x.TurnOrder - y.TurnOrder);
+                var message = players.Aggregate(strings.players_list,
+                    (current, player) => current + $"\n\\({player.TurnOrder}\\) {player.NickName}");
+                await Bot.SendWithMarkdown2(chatId, message);
+            }
+
+            private static async Task Leave(long chatId, long userId)
+            {
+                var user = await UserDao.GetPlayerById(userId);
+                var roomName = user.GetRoomName();
+                var resultCode = await RoomController.LeaveFromGame(user);
+                if (resultCode == ResultCode.CodeOk)
+                    await Bot.SendWithMarkdown2(chatId, $"{strings.you_leave_from_game} _*{roomName}*_",
+                        Keyboards.MainMenu);
+                else
+                    await Utilities.GetResultCodeMessage(resultCode, chatId);
+            }
+        }
+    }
+}

+ 1 - 1
MafiaTelegramBot/Game/Player.cs

@@ -15,7 +15,7 @@ namespace MafiaTelegramBot.Game
 {
     public class Player : UserEntity
     {
-        public Role CurrentRole = new NoneRole();
+        public GameRooms.GameRoom.Role CurrentRole = new NoneRole();
         public int TurnOrder = -1;
         private string _roomName = "";
         public bool IsAlive = true;

+ 9 - 2
MafiaTelegramBot/Models/Commands/Command.cs

@@ -1,7 +1,9 @@
 #nullable enable
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
 using MafiaTelegramBot.DataBase.EntityDao;
+using MafiaTelegramBot.Game;
 using MafiaTelegramBot.Models.Commands.CustomMessageHandlers;
 using Telegram.Bot.Types;
 using Telegram.Bot.Types.Enums;
@@ -26,9 +28,14 @@ namespace MafiaTelegramBot.Models.Commands
         {
             var chatId = update.Message.Chat.Id;
             var userId = update.Message.From.Id;
-            var user = await UserDao.GetPlayerById(userId);
-            if(user.IsPlaying) return await ((Command?) new ResendMessageHandler().Clone(chatId, userId))!.Execute(update);
             await Bot.Get().SendChatActionAsync(chatId, ChatAction.Typing);
+            var user = await UserDao.GetPlayerById(userId);
+            if (user.IsPlaying)
+            {
+                var roomKey = RoomEncrypter.GetCode(user.GetRoomName());
+                var room = RoomController.GetRoom(roomKey);
+                return await room.Handler.Handle(update);
+            }
             var commands = Bot.Commands;
             var message = update.Message.Text;
             var command = FirstOrDefault(commands, message);

+ 0 - 22
MafiaTelegramBot/Models/Commands/CustomMessageHandlers/ResendMessageHandler.cs

@@ -1,22 +0,0 @@
-using System.Threading.Tasks;
-using MafiaTelegramBot.Controllers;
-using MafiaTelegramBot.DataBase.EntityDao;
-using MafiaTelegramBot.Game;
-using Telegram.Bot.Types;
-
-namespace MafiaTelegramBot.Models.Commands.CustomMessageHandlers
-{
-    public class ResendMessageHandler : Command
-    {
-        protected override string Name => "ResendMessageHandler";
-        protected override async Task<Message> Execute(Update update)
-        {
-            var user = await UserDao.GetPlayerById(UserId);
-            if (!user.IsSpeaker) return await Bot.SendWithMarkdown2(ChatId, strings.now_is_not_your_turn);
-            var roomKey = RoomEncrypter.GetCode(user.GetRoomName());
-            var room = RoomController.GetRoom(roomKey);
-            await room.NotifyPlayersAbout(UserId, $"\\({user.TurnOrder}\\){user.NickName}: {update.Message.Text}");
-            return update.Message;
-        }
-    }
-}

+ 0 - 1
MafiaTelegramBot/Models/Commands/LeaveCommand.cs

@@ -1,6 +1,5 @@
 using System.Threading.Tasks;
 using MafiaTelegramBot.Controllers;
-using MafiaTelegramBot.DataBase;
 using MafiaTelegramBot.DataBase.EntityDao;
 using MafiaTelegramBot.Resources;
 using Telegram.Bot.Types;

+ 1 - 1
MafiaTelegramBot/Models/Commands/StartGameCommand.cs

@@ -18,7 +18,7 @@ namespace MafiaTelegramBot.Models.Commands
             var result = await Bot.SendWithMarkdown2(owner.ChatId, strings.game_process_started);
             var resultCode = await room.Prepare();
             if (resultCode != ResultCode.CodeOk) return await Utilities.GetResultCodeMessage(resultCode, ChatId);
-            await room.NotifyPlayersAboutGameStarted();
+            await room.SendRolesToUsers();
             room.Start();
             return result;
         }

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

@@ -464,5 +464,29 @@ namespace MafiaTelegramBot {
                 return ResourceManager.GetString("your_turn", resourceCulture);
             }
         }
+        
+        internal static string players_list {
+            get {
+                return ResourceManager.GetString("players_list", resourceCulture);
+            }
+        }
+        
+        internal static string you_now_died {
+            get {
+                return ResourceManager.GetString("you_now_died", resourceCulture);
+            }
+        }
+        
+        internal static string villagers_are_sleep {
+            get {
+                return ResourceManager.GetString("villagers_are_sleep", resourceCulture);
+            }
+        }
+        
+        internal static string mafia_get_mail {
+            get {
+                return ResourceManager.GetString("mafia_get_mail", resourceCulture);
+            }
+        }
     }
 }

+ 12 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -228,4 +228,16 @@
     <data name="your_turn" xml:space="preserve">
         <value>Ваш ход</value>
     </data>
+    <data name="players_list" xml:space="preserve">
+        <value>Список игроков</value>
+    </data>
+    <data name="you_now_died" xml:space="preserve">
+        <value>Вы мертвы и не можете говорить!</value>
+    </data>
+    <data name="villagers_are_sleep" xml:space="preserve">
+        <value>Жители ночью говорят, а не болтают!</value>
+    </data>
+    <data name="mafia_get_mail" xml:space="preserve">
+        <value>В первую ночь мафия получает список соучастников.</value>
+    </data>
 </root>