Explorar o código

Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	MafiaTelegramBot/Resources/strings.resx
Tigran %!s(int64=4) %!d(string=hai) anos
pai
achega
c12a56bc15

+ 8 - 2
MafiaTelegramBot/Controllers/RoomController.cs

@@ -26,7 +26,8 @@ namespace MafiaTelegramBot.Controllers
                     : new NormalGameRoom {Owner = creator, RoomName = roomName, IsPrivate = isPrivate};
                 OpenedGames.Add(roomKey, room);
                 room.Players.Add(creator.Id, creator);
-
+                
+                room.SetTimer();
                 UserDao.GetPlayerById(creator.Id).Result.StopTimer();
                 
                 return ResultCode.CodeOk;
@@ -43,7 +44,9 @@ namespace MafiaTelegramBot.Controllers
                 if (OpenedGames[roomKey].IsFilled()) return ResultCode.RoomIsFilled;
                 if (!player.SetRoomName(roomName)) return ResultCode.UserAlreadyInGame;
                 OpenedGames[roomKey].Players.Add(player.Id, player);
-                
+
+                if (OpenedGames[roomKey].Players.Count > Constants.PLAYER_DISABLE_TIMER)
+                    OpenedGames[roomKey].StopTimer();
                 UserDao.GetPlayerById(player.Id).Result.StopTimer();
                 
                 await OpenedGames[roomKey].PlayersCh.SendExcept(player.Id, $"{player.NickName} {strings.connected_to_game}");
@@ -69,6 +72,8 @@ namespace MafiaTelegramBot.Controllers
                 player.CurrentRole = new NoneRole();
                 player.TurnOrder = -1;
                 OpenedGames[roomKey].Players.Remove(player.Id);
+                if (OpenedGames[roomKey].Players.Count <= Constants.PLAYER_DISABLE_TIMER)
+                    OpenedGames[roomKey].StartTimer();
                 
                 UserDao.GetPlayerById(player.Id).Result.StartTimer();
                 
@@ -92,6 +97,7 @@ namespace MafiaTelegramBot.Controllers
                     await OpenedGames[roomKey].PlayersCh.Send(strings.room_dissolved, Keyboard.MainMenu);
                     foreach (var player in OpenedGames[roomKey].Players.Values) await player.RemoveGame();
                     RoomEncrypter.RemoveCode(OpenedGames[roomKey].RoomName);
+                    OpenedGames[roomKey].DeleteTimer();
                     OpenedGames.Remove(roomKey);
                 }
             });

+ 23 - 0
MafiaTelegramBot/Game/GameRoles/FoolRole.cs

@@ -1,3 +1,4 @@
+using System.Threading.Tasks;
 using MafiaTelegramBot.Game.GameRooms;
 using MafiaTelegramBot.Resources;
 
@@ -6,6 +7,28 @@ namespace MafiaTelegramBot.Game.GameRoles
     public class FoolRole : GameRoom.Role
     {
         public override Roles RoleKey => Roles.Fool;
+
+        public bool _isWinner = false; 
+        public override async Task IsWon()
+        {
+            if (_isWinner) await Room.PlayersCh.SendTo(Player.ChatId, strings.you_won);
+        }
+
+        public override async Task Dispatch()
+        { 
+            await base.Dispatch();
+            if (!Player.IsAlive)
+            {
+                _isWinner = true;
+            }
+        }
+
+        public override async Task Kill()
+        {
+             await base.Kill();
+             _isWinner = false;
+        }
+
         public FoolRole(GameRoom room, Player player) : base(room, player) { }
     }
 }

+ 2 - 0
MafiaTelegramBot/Game/GameRooms/GameRoom.GameProcess.cs

@@ -321,6 +321,8 @@ namespace MafiaTelegramBot.Game.GameRooms
                     await PlayersCh.Send(strings.mafia_won, exceptDied: false);
                     await PlayersCh.SendSticker(Stickers.Sticker["MafiaWins"]);
                 }
+                if (PlayersRole.ContainsKey(Roles.Fool))
+                    PlayersRole[Roles.Fool][0].CurrentRole.IsWon();
                 var rolesMessage = strings.in_this_game_roles;
                 var sortedPLayers = Players.Values.ToList();
                 sortedPLayers.Sort((x, y) => x.TurnOrder - y.TurnOrder);

+ 5 - 1
MafiaTelegramBot/Game/GameRooms/GameRoom.Role.cs

@@ -46,7 +46,11 @@ namespace MafiaTelegramBot.Game.GameRooms
                 }
                 await Room.PlayersCh.SendTo(Player.ChatId, message);
             }
-            
+
+            public virtual async Task IsWon()
+            {
+                await Room.PlayersCh.SendTo(Player.ChatId, strings.you_won);
+            }
             public virtual async Task Dispatch()
             {
                 if (Room.PlayersRole.ContainsKey(Roles.Hooker)

+ 3 - 0
MafiaTelegramBot/Game/GameRooms/GameRoom.Structure.cs

@@ -1,6 +1,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
+using System.Timers;
 using MafiaTelegramBot.Resources;
 
 namespace MafiaTelegramBot.Game.GameRooms
@@ -19,6 +20,8 @@ namespace MafiaTelegramBot.Game.GameRooms
 
         private int _largeVote; //большее из количеств голосов за игроков 
 
+        private Timer WaitingPlayers;
+        
         public readonly List<Player> VoteUpList = new();
         public readonly Dictionary<long, long> VoteKillList = new();
 

+ 66 - 0
MafiaTelegramBot/Game/GameRooms/GameRoom.Timer.cs

@@ -0,0 +1,66 @@
+using System;
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.Models;
+using MafiaTelegramBot.Resources;
+
+namespace MafiaTelegramBot.Game.GameRooms
+{
+    public abstract partial class GameRoom
+    {
+        private int minutes;
+        public async Task SetTimer()
+        {
+            minutes = 0;
+            WaitingPlayers = new System.Timers.Timer(60000);
+            WaitingPlayers.Elapsed += async (x , y) =>
+            {
+                await Remove();
+            };
+            WaitingPlayers.Enabled = true;
+        }
+        
+        public async Task StopTimer()
+        {
+            WaitingPlayers.Stop();
+        }
+
+        public async Task StartTimer()
+        {
+            minutes = 0;
+            WaitingPlayers.Start();
+        }
+        
+        private async Task Remove()
+        {
+            try
+            {
+                switch (minutes)
+                {
+                    case Constants.MINUTES_UNTIL_DISSOLVE - 2:
+                        Bot.SendHyperLink(Owner.ChatId, strings.dissolve_warning);
+                        minutes++;
+                        break;
+                    case Constants.MINUTES_UNTIL_DISSOLVE:
+                        RoomController.DissolveRoom(RoomEncrypter.GetCode(RoomName));
+                        //GC.Collect();
+                        break;
+                    default:
+                        minutes++;
+                        break;
+                }
+            }
+            catch (Exception)
+            {
+                await Console.Out.WriteLineAsync("Cant delete room!");
+            }
+            
+        }
+        
+        public void DeleteTimer()
+        {
+            WaitingPlayers.Stop();
+            WaitingPlayers.Dispose();    
+        }
+    }
+}

+ 4 - 1
MafiaTelegramBot/Models/Commands/Command.cs

@@ -34,8 +34,11 @@ namespace MafiaTelegramBot.Models.Commands
             var startCommand = new StartCommand();
             //TODO refactor later
             if (message.Contains(startCommand.Name)) return await ((Command?) startCommand.Clone(chatId, userId))!.Execute(update);
-            await UserDao.GetPlayerById(userId).Result.Restart();
+            
             var user = await UserDao.GetPlayerById(userId);
+            
+            await UserDao.GetPlayerById(userId).Result.Restart();
+            
             if (user.IsPlaying)
             {
                 var roomKey = RoomEncrypter.GetCode(user.GetRoomName());

+ 2 - 0
MafiaTelegramBot/Resources/Constants.cs

@@ -3,6 +3,8 @@ namespace MafiaTelegramBot.Resources
     public static class Constants
     {
         public const int PLAYER_LIMITS_MIN = 1;
+        public const int PLAYER_DISABLE_TIMER = 3;
+        public const int MINUTES_UNTIL_DISSOLVE = 10;
         public const int PLAYER_LIMITS_MAX = 16;
         public const int MAX_SHOWING_ROOMS = 10;
 

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

@@ -860,5 +860,17 @@ namespace MafiaTelegramBot {
                 return ResourceManager.GetString("automatically_choosed_target", resourceCulture);
             }
         }
+        
+        internal static string you_won {
+            get {
+                return ResourceManager.GetString("you_won", resourceCulture);
+            }
+        }
+        
+        internal static string dissolve_warning {
+            get {
+                return ResourceManager.GetString("dissolve_warning", resourceCulture);
+            }
+        }
     }
 }

+ 6 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -426,4 +426,10 @@
     <data name="automatically_choosed_target" xml:space="preserve">
         <value>Автоматически была выбрана цель:</value>
     </data>
+    <data name="you_won" xml:space="preserve">
+        <value>Вы победили</value>
+    </data>
+    <data name="dissolve_warning" xml:space="preserve">
+        <value>Если не наберется минимальное количество игроков, комната будет распущена через 2 минуты!</value>
+    </data>
 </root>