Bladeren bron

Merge branch 'MTB-38' into develop

# Conflicts:
#	MafiaTelegramBot/DataBase/Entity/UserEntity.cs
#	MafiaTelegramBot/Game/Player.cs
#	MafiaTelegramBot/Resources/strings.resx
Tigran 4 jaren geleden
bovenliggende
commit
1042a711c1

+ 0 - 1
MafiaTelegramBot/Controllers/RoomController.cs

@@ -1,7 +1,6 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using MafiaTelegramBot.CustomCollections.Extensions;
 using MafiaTelegramBot.Game;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Models;

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

@@ -1,7 +1,6 @@
 using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 using System.Threading.Tasks;
-using MafiaTelegramBot.CustomCollections;
 using MafiaTelegramBot.DataBase.EntityDao;
 
 namespace MafiaTelegramBot.DataBase.Entity
@@ -35,6 +34,5 @@ namespace MafiaTelegramBot.DataBase.Entity
             if (buff != newName && buff != "\\[NoNickname\\]")
                 await UserDao.Update(this);
         }
-        
     }
 }

+ 31 - 4
MafiaTelegramBot/Game/GameRooms/GameRoom.cs

@@ -43,11 +43,12 @@ namespace MafiaTelegramBot.Game.GameRooms
             {
                 IsRunning = true;
                 await FirstNight();
+                await FirstDay();
                 await GameCycle();
                 await EndOfGame();
             }).Start();
         }
-
+        
         public async Task<ResultCode> Prepare()
         {
             var resultCode = CanStartGame();
@@ -58,6 +59,30 @@ namespace MafiaTelegramBot.Game.GameRooms
             return resultCode;
         }
 
+        private async Task FirstDay()
+        {
+            await NotifyPlayersAbout(-1, strings.first_day_message);
+            await Task.Run(async() =>
+            {
+                var turnsCount = Players.Count;
+                Player firstPlayer = null;
+                for (var i = 0; i < turnsCount; ++i)
+                {
+                    var player = _turnOrder.Dequeue();
+                    await NotifyPlayersAbout(player.Id, $"{strings.now_turn} {player.NickName}");
+                    await Bot.SendWithMarkdown2(player.ChatId, strings.your_turn);
+                    player.IsSpeaker = true;
+                    Thread.Sleep(60*1000);
+                    player.IsSpeaker = false;
+                    await Bot.SendWithMarkdown2(player.ChatId, strings.your_turn_ended);
+                    if (i != 0) _turnOrder.Enqueue(player);
+                    else firstPlayer = player;
+                }
+                _turnOrder.Enqueue(firstPlayer);
+            });
+            await NotifyPlayersAbout(-1, strings.city_falls_asleep);
+        }
+
         private async Task FirstNight()
         {
             await Task.Run(async() =>
@@ -71,14 +96,13 @@ namespace MafiaTelegramBot.Game.GameRooms
                 if (don != null) await Bot.SendWithMarkdown2(don.ChatId, message);
                 foreach (var player in mafia)
                     await Bot.SendWithMarkdown2(player.ChatId, message);
-                Thread.Sleep(10000);
+                Thread.Sleep(10*1000);
             });
         }
 
 
         private async Task GameCycle()
         {
-            await NotifyPlayersAbout(-1, strings.first_day_message);
             await Task.Run(() =>
             {
                 
@@ -91,10 +115,12 @@ namespace MafiaTelegramBot.Game.GameRooms
             await Task.Run(async () =>
             {
                 foreach (var (_, player) in Players)
+                {
                     player.CurrentRole = Role.GetNewRoleInstance(Roles.None);
+                    player.IsPlaying = false;
+                }
                 IsRunning = false;
                 _turnOrder.Clear();
-                Thread.Sleep(10000);//TODO just for tests
                 if (!Players.ContainsKey(Owner.Id) || Players.Count == 0) new Task(async() => 
                     await RoomController.DissolveRoom(RoomEncrypter.GetCode(RoomName))).Start();
                 else
@@ -153,6 +179,7 @@ namespace MafiaTelegramBot.Game.GameRooms
                     var player = playersCopy.GetAndRemove(random.Next(playersCopy.Count));
                     _turnOrder.Enqueue(player);
                     player.TurnOrder = _turnOrder.Count;
+                    player.IsPlaying = true;
                 }
             });
         }

+ 9 - 6
MafiaTelegramBot/Game/Player.cs

@@ -18,15 +18,18 @@ namespace MafiaTelegramBot.Game
         public Role CurrentRole = new NoneRole();
         public int TurnOrder = -1;
         private string _roomName = "";
-        
-        public StatisticsList Statistics = new();
+        public bool IsAlive = true;
+        public bool IsSpeaker = false;
+        public bool IsPlaying = false;
+
+        public readonly StatisticsList Statistics = new();
 
-        public async Task<bool> loadStatistics()
+        public async Task<bool> LoadStatistics()
         {
-            List<StatisticsEntity> UserStats = await UserDao.DataBase.Statistics.Where(s => s.UserId == Id).AsNoTracking().ToListAsync();
-            foreach (var ROLE in UserStats)
+            List<StatisticsEntity> userStats = await UserDao.DataBase.Statistics.Where(s => s.UserId == Id).AsNoTracking().ToListAsync();
+            foreach (var role in userStats)
             {
-                Statistics.Add(Enum.Parse<Roles>(ROLE.Role),ROLE);
+                Statistics.Add(Enum.Parse<Roles>(role.Role),role);
             }
 
             return true;

+ 3 - 0
MafiaTelegramBot/Models/Commands/Command.cs

@@ -1,6 +1,7 @@
 #nullable enable
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using MafiaTelegramBot.DataBase.EntityDao;
 using MafiaTelegramBot.Models.Commands.CustomMessageHandlers;
 using Telegram.Bot.Types;
 using Telegram.Bot.Types.Enums;
@@ -25,6 +26,8 @@ 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 commands = Bot.Commands;
             var message = update.Message.Text;

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

@@ -0,0 +1,22 @@
+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;
+        }
+    }
+}

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

@@ -440,5 +440,29 @@ namespace MafiaTelegramBot {
                 return ResourceManager.GetString("city_falls_asleep", resourceCulture);
             }
         }
+        
+        internal static string now_turn {
+            get {
+                return ResourceManager.GetString("now_turn", resourceCulture);
+            }
+        }
+        
+        internal static string your_turn_ended {
+            get {
+                return ResourceManager.GetString("your_turn_ended", resourceCulture);
+            }
+        }
+        
+        internal static string now_is_not_your_turn {
+            get {
+                return ResourceManager.GetString("now_is_not_your_turn", resourceCulture);
+            }
+        }
+        
+        internal static string your_turn {
+            get {
+                return ResourceManager.GetString("your_turn", resourceCulture);
+            }
+        }
     }
 }

+ 9 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -216,6 +216,15 @@
     <data name="city_falls_asleep" xml:space="preserve">
         <value>Город засыпает</value>
     </data>
+    <data name="now_turn" xml:space="preserve">
+        <value>Сейчас ходит</value>
+    </data>
+    <data name="your_turn_ended" xml:space="preserve">
+        <value>Ваш ход закончился</value>
+    </data>
+    <data name="now_is_not_your_turn" xml:space="preserve">
+        <value>Сейчас не ваш ход</value>
+    </data>
     <data name="your_turn" xml:space="preserve">
         <value>Ваш ход</value>
     </data>