Browse Source

Merge branch 'develop' of https://gogs.veloe.link/Veloe/MafiaTelegramBot into develop

 Conflicts:
	MafiaTelegramBot/Resources/strings.resx
zelpold 4 years ago
parent
commit
d5b3a9d1b0

+ 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);
                 }
             });

+ 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;
 

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

@@ -294,6 +294,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Если не наберется минимальное количество игроков, комната будет распущена через 2 минуты!.
+        /// </summary>
+        internal static string dissolve_warning {
+            get {
+                return ResourceManager.GetString("dissolve_warning", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to включен.
         /// </summary>

+ 3 - 0
MafiaTelegramBot/Resources/strings.resx

@@ -426,6 +426,9 @@
     <data name="you_won" xml:space="preserve">
         <value>Вы победили</value>
     </data>
+    <data name="dissolve_warning" xml:space="preserve">
+        <value>Если не наберется минимальное количество игроков, комната будет распущена через 2 минуты!</value>
+    </data>
     <data name="the_fool_won" xml:space="preserve">
         <value>Дурачок в этой игре победил! </value>
     </data>