/// <summary>
 /// Returns <see cref="Player"/> from jail
 /// </summary>
 public static void ReturnFromJail(Player player)
 {
     if (player == null || string.IsNullOrEmpty(player.SteamId.Trim()))
     {
         return;
     }
     if (AdminToolbox.ATPlayerDict.ContainsKey(player.SteamId))
     {
         API.PlayerSettings psetting = AdminToolbox.ATPlayerDict[player.SteamId];
         psetting.isJailed     = false;
         psetting.JailedToTime = DateTime.Now;
         player.ChangeRole(psetting.previousRole, true, false);
         player.Teleport(psetting.originalPos, true);
         player.SetHealth(psetting.previousHealth);
         if (psetting.playerPrevInv != null)
         {
             foreach (Smod2.API.Item item in player.GetInventory())
             {
                 item.Remove();
             }
             foreach (Smod2.API.Item item in psetting.playerPrevInv)
             {
                 player.GiveItem(item.ItemType);
             }
         }
         player.SetAmmo(AmmoType.DROPPED_5, psetting.prevAmmo5);
         player.SetAmmo(AmmoType.DROPPED_7, psetting.prevAmmo7);
         player.SetAmmo(AmmoType.DROPPED_9, psetting.prevAmmo9);
         AdminToolbox.ATPlayerDict[player.SteamId].playerPrevInv = null;
     }
     else
     {
         AdminToolbox.plugin.Info("Could not return player from jail! Player not in PlayerDict!");
     }
 }
 /// <summary>
 /// For setting <see cref="API.PlayerSettings"/> stats
 /// <para>Returns false if <paramref name="steamID"/> is not in <see cref="AdminToolbox.ATPlayerDict"/></para>
 /// </summary>
 public static bool SetPlayerStats(string steamID, int?Kills = null, int?TeamKills = null, int?Deaths = null, int?RoundsPlayed = null, int?BanCount = null)
 {
     if (!AdminToolbox.ATPlayerDict.ContainsKey(steamID))
     {
         return(false);
     }
     API.PlayerSettings setting = AdminToolbox.ATPlayerDict[steamID];
     setting.Kills        = Kills ?? setting.Kills;
     setting.TeamKills    = TeamKills ?? setting.TeamKills;
     setting.Deaths       = Deaths ?? setting.Deaths;
     setting.RoundsPlayed = RoundsPlayed ?? setting.RoundsPlayed;
     setting.banCount     = BanCount ?? setting.banCount;
     AdminToolbox.ATPlayerDict[steamID] = setting;
     return(true);
 }
 /// <summary>
 /// For setting <see cref="API.PlayerSettings"/> bools by <paramref name="steamID"/>
 /// <para>Returns false if <paramref name="steamID"/> is not in <see cref="AdminToolbox.ATPlayerDict"/></para>
 /// </summary>
 public static bool SetPlayerBools(string steamID, bool?spectatorOnly = null, bool?godMode = null, bool?dmgOff = null, bool?destroyDoor = null, bool?keepSettings = null, bool?lockDown = null, bool?instantKill = null, bool?isJailed = null)
 {
     if (!AdminToolbox.ATPlayerDict.ContainsKey(steamID))
     {
         return(false);
     }
     API.PlayerSettings setting = AdminToolbox.ATPlayerDict[steamID];
     setting.overwatchMode = spectatorOnly ?? setting.overwatchMode;
     setting.godMode       = godMode ?? setting.godMode;
     setting.dmgOff        = dmgOff ?? setting.dmgOff;
     setting.destroyDoor   = destroyDoor ?? setting.destroyDoor;
     setting.lockDown      = lockDown ?? setting.lockDown;
     setting.instantKill   = instantKill ?? setting.instantKill;
     setting.isJailed      = isJailed ?? setting.isJailed;
     AdminToolbox.ATPlayerDict[steamID] = setting;
     return(true);
 }
 /// <summary>
 /// Sends <see cref="Player"/> to jail
 /// </summary>
 public static bool SendToJail(Player player, DateTime?jailedToTime)
 {
     if (player.TeamRole.Role == Role.SPECTATOR)
     {
         return(false);
     }
     if (AdminToolbox.ATPlayerDict.ContainsKey(player.SteamId))
     {
         API.PlayerSettings psetting = AdminToolbox.ATPlayerDict[player.SteamId];
         psetting.JailedToTime = jailedToTime ?? ((psetting.JailedToTime > DateTime.Now) ? psetting.JailedToTime : DateTime.Now.AddYears(1));
         //Saves original variables
         psetting.originalPos = player.GetPosition();
         if (!psetting.isJailed)
         {
             psetting.previousRole   = player.TeamRole.Role;
             psetting.playerPrevInv  = player.GetInventory();
             psetting.previousHealth = player.GetHealth();
             psetting.prevAmmo5      = player.GetAmmo(AmmoType.DROPPED_5);
             psetting.prevAmmo7      = player.GetAmmo(AmmoType.DROPPED_7);
             psetting.prevAmmo9      = player.GetAmmo(AmmoType.DROPPED_9);
         }
         //Changes role to Tutorial, teleports to jail, removes inv.
         player.ChangeRole(Role.TUTORIAL, true, false);
         player.Teleport(JailPos, true);
         foreach (Smod2.API.Item item in player.GetInventory())
         {
             item.Remove();
         }
         psetting.isJailed = true;
         return(true);
     }
     else
     {
         AdminToolbox.plugin.Debug("Could not send player to jail! Player not in PlayerDict!");
         return(false);
     }
 }
        public string[] OnCall(ICommandSender sender, string[] args)
        {
            if (Server.GetPlayers().Count > 0)
            {
                Player myPlayer = (args.Length > 0) ? API.GetPlayerFromString.GetPlayer(args[0]) : null;
                if (myPlayer == null && sender is Player sendingPlayer)
                {
                    myPlayer = sendingPlayer;
                }
                else if (myPlayer == null)
                {
                    if (args.Length > 0)
                    {
                        return new string[] { "Could not find player: " + args[0] }
                    }
                }
                ;
                else
                {
                    return new string[] { GetUsage() }
                };

                //Handling player stats
                AdminToolbox.AddMissingPlayerVariables(new List <Player> {
                    myPlayer
                });
                AdminToolbox.atfileManager.PlayerStatsFileManager(new List <Player> {
                    myPlayer
                }, Managers.ATFileManager.PlayerFile.Write);
                API.PlayerSettings playerDict = (AdminToolbox.ATPlayerDict.ContainsKey(myPlayer.SteamId)) ? AdminToolbox.ATPlayerDict[myPlayer.SteamId] : new API.PlayerSettings(myPlayer.SteamId);

                //Inventory
                string playerInv = string.Empty;
                foreach (Smod2.API.Item i in myPlayer.GetInventory().Where(i => i.ItemType != ItemType.NULL))
                {
                    playerInv += i.ItemType + ", ";
                }
                if (playerInv == string.Empty)
                {
                    playerInv = "Empty Inventory";
                }

                //Calculating remaining jail time
                int remainingJailTime = ((int)playerDict.JailedToTime.Subtract(DateTime.Now).TotalSeconds >= 0) ? (int)playerDict.JailedToTime.Subtract(DateTime.Now).TotalSeconds : 0;

                string _playerRole = (IsPlayer(sender)) ? ColoredRole(myPlayer) : myPlayer.TeamRole.Role + "";

                //Building string
                string playerInfoString = Environment.NewLine + Environment.NewLine +
                                          "Player: (" + myPlayer.PlayerId + ") " + myPlayer.Name + Environment.NewLine +
                                          BuildTwoLiner(" - SteamID: " + myPlayer.SteamId, " - IP: " + myPlayer.IpAddress.Replace("::ffff:", string.Empty)) + Environment.NewLine +
                                          BuildTwoLiner(" - Server Rank: " + "<color=" + myPlayer.GetUserGroup().Color + ">" + myPlayer.GetRankName() + "</color>") + Environment.NewLine +
                                          BuildTwoLiner(" - Role: " + _playerRole, " - Health: " + myPlayer.GetHealth()) + Environment.NewLine +
                                          BuildTwoLiner(" - AdminToolbox Toggables: ") + Environment.NewLine +
                                          BuildTwoLiner("   - Godmode: " + (playerDict.godMode), " - NoDmg: " + (playerDict.dmgOff)) + Environment.NewLine +
                                          BuildTwoLiner("   - OverwatchMode: " + (myPlayer.OverwatchMode), " - KeepSettings: " + (playerDict.keepSettings)) + Environment.NewLine +
                                          BuildTwoLiner("   - BreakDoors: " + (playerDict.destroyDoor), " - PlayerLockDown: " + (playerDict.lockDown)) + Environment.NewLine +
                                          BuildTwoLiner("   - InstantKill: " + (playerDict.instantKill), " - GhostMode: " + myPlayer.GetGhostMode()) + Environment.NewLine +
                                          BuildTwoLiner("   - IsJailed: " + (playerDict.isJailed), " - Released In: " + remainingJailTime) + Environment.NewLine +
                                          BuildTwoLiner(" - Stats:") + Environment.NewLine +
                                          BuildTwoLiner("   - Kills: " + playerDict.Kills, " - TeamKills: " + playerDict.TeamKills) + Environment.NewLine +
                                          BuildTwoLiner("   - Deaths: " + playerDict.Deaths, " - Times Banned: " + playerDict.banCount) + Environment.NewLine +
                                          BuildTwoLiner("   - Playtime: " + (int)playerDict.MinutesPlayed + " minutes", " - Rounds Played: " + playerDict.RoundsPlayed) + Environment.NewLine +
                                          BuildTwoLiner(" - Position:") + Environment.NewLine +
                                          BuildTwoLiner("  - X:" + (int)myPlayer.GetPosition().x + " Y:" + (int)myPlayer.GetPosition().y + " Z:" + (int)myPlayer.GetPosition().z) + Environment.NewLine +
                                          BuildTwoLiner(" - Inventory: " + playerInv) + Environment.NewLine;
                if (IsPlayer(sender))
                {
                    return new string[] { playerInfoString.Replace("True ", "<color=green>" + "True" + " </color>").Replace("False", "<color=red>" + "False" + "</color>") }
                }
                ;
                else
                {
                    return new string[] { playerInfoString }
                };
            }
        /// <summary>
        /// Read/Writes stats to/from <see cref="File"/> for each steamID in the <see cref="List{T}"/>
        /// </summary>
        public void PlayerStatsFileManager(List <string> steamIdList, PlayerFile FileOperation = PlayerFile.Read)
        {
            if (Directory.Exists(FileManager.GetAppFolder()))
            {
                char splitChar = ';';
                if (!Directory.Exists(AdminToolboxFolder))
                {
                    Directory.CreateDirectory(AdminToolboxFolder);
                }
                if (!Directory.Exists(AdminToolboxPlayerStats))
                {
                    Directory.CreateDirectory(AdminToolboxPlayerStats);
                }

                if (steamIdList != null && steamIdList.Count > 0)
                {
                    foreach (string sid in steamIdList)
                    {
                        ReadWriteHandler(sid, FileOperation);
                    }
                }
                else
                {
                    foreach (string steamID in AdminToolbox.ATPlayerDict.Keys)
                    {
                        ReadWriteHandler(steamID, FileOperation);
                    }
                }

                void ReadWriteHandler(string steamID, PlayerFile Operation)
                {
                    if (string.IsNullOrEmpty(steamID))
                    {
                        return;
                    }
                    if (!AdminToolbox.ATPlayerDict.ContainsKey(steamID))
                    {
                        AdminToolbox.AddMissingPlayerVariables(PluginManager.Manager.Server.GetPlayers(steamID));
                        return;
                    }
                    ;
                    switch (Operation)
                    {
                    case PlayerFile.Read:
                        ReadFromFile(steamID);
                        break;

                    case PlayerFile.Write:
                        WriteToFile(steamID);
                        break;

                    default:
                        ReadFromFile(steamID);
                        break;
                    }
                }

                void WriteToFile(string steamID)
                {
                    if (!AdminToolbox.ATPlayerDict.ContainsKey(steamID))
                    {
                        if (PluginManager.Manager.Server.GetPlayers(steamID).Count < 1)
                        {
                            return;
                        }
                        AdminToolbox.AddMissingPlayerVariables(PluginManager.Manager.Server.GetPlayers(steamID).FirstOrDefault());
                    }
                    if (!AdminToolbox.ATPlayerDict.ContainsKey(steamID))
                    {
                        return;
                    }
                    string playerFilePath = (AdminToolbox.ATPlayerDict.ContainsKey(steamID)) ? AdminToolboxPlayerStats + Path.DirectorySeparatorChar + steamID + ".txt" : AdminToolboxPlayerStats + Path.DirectorySeparatorChar + "server" + ".txt";

                    if (!File.Exists(playerFilePath))
                    {
                        File.Create(playerFilePath).Dispose();
                    }

                    API.PlayerSettings setting = (AdminToolbox.ATPlayerDict.ContainsKey(steamID)) ? AdminToolbox.ATPlayerDict[steamID] : new API.PlayerSettings(steamID);
                    int    Kills         = (AdminToolbox.ATPlayerDict.ContainsKey(steamID) && AdminToolbox.ATPlayerDict[steamID].Kills > 0) ? AdminToolbox.ATPlayerDict[steamID].Kills : 0;
                    int    TeamKills     = (AdminToolbox.ATPlayerDict.ContainsKey(steamID) && AdminToolbox.ATPlayerDict[steamID].TeamKills > 0) ? AdminToolbox.ATPlayerDict[steamID].TeamKills : 0;
                    int    Deaths        = (AdminToolbox.ATPlayerDict.ContainsKey(steamID) && AdminToolbox.ATPlayerDict[steamID].Deaths > 0) ? AdminToolbox.ATPlayerDict[steamID].Deaths : 0;
                    double minutesPlayed = (AdminToolbox.ATPlayerDict.ContainsKey(steamID) && AdminToolbox.ATPlayerDict[steamID].MinutesPlayed > 0) ? DateTime.Now.Subtract(AdminToolbox.ATPlayerDict[steamID].JoinTime).TotalMinutes + AdminToolbox.ATPlayerDict[steamID].MinutesPlayed : 0;
                    int    BanCount      = (AdminToolbox.ATPlayerDict.ContainsKey(steamID) && AdminToolbox.ATPlayerDict[steamID].banCount > 0) ? AdminToolbox.ATPlayerDict[steamID].banCount : 0;

                    if (AdminToolbox.ATPlayerDict.ContainsKey(steamID))
                    {
                        AdminToolbox.ATPlayerDict[steamID].JoinTime = DateTime.Now;
                    }
                    string str = string.Empty + Kills + splitChar + TeamKills + splitChar + Deaths + splitChar + minutesPlayed + splitChar + BanCount;

                    using (StreamWriter streamWriter = new StreamWriter(playerFilePath, false))
                    {
                        streamWriter.Write(str);
                        streamWriter.Close();
                    }
                    ReadFromFile(steamID);
                }

                void ReadFromFile(string steamID)
                {
                    string playerFilePath = (AdminToolbox.ATPlayerDict.ContainsKey(steamID)) ? AdminToolboxPlayerStats + Path.DirectorySeparatorChar + steamID + ".txt" : AdminToolboxPlayerStats + Path.DirectorySeparatorChar + "server" + ".txt";

                    if (!File.Exists(playerFilePath))
                    {
                        PlayerStatsFileManager(new List <string> {
                            steamID
                        }, PlayerFile.Write);
                    }
                    string[] fileStrings = (File.ReadAllLines(playerFilePath).Length > 0) ? File.ReadAllLines(playerFilePath) : new string[] { "0;0;0;0;0" };
                    string[] playerStats = fileStrings.FirstOrDefault().Split(splitChar);
                    if (AdminToolbox.ATPlayerDict.ContainsKey(steamID))
                    {
                        API.PlayerSettings setting = AdminToolbox.ATPlayerDict[steamID];
                        setting.Kills         = (playerStats.Length > 0 && int.TryParse(playerStats[0], out int x0) && x0 > setting.Kills) ? x0 : setting.Kills;
                        setting.TeamKills     = (playerStats.Length > 1 && int.TryParse(playerStats[1], out int x1) && x1 > setting.TeamKills) ? x1 : setting.TeamKills;
                        setting.Deaths        = (playerStats.Length > 2 && int.TryParse(playerStats[2], out int x2) && x2 > setting.Deaths) ? x2 : setting.Deaths;
                        setting.MinutesPlayed = (playerStats.Length > 3 && double.TryParse(playerStats[3], out double x3) && x3 > setting.MinutesPlayed) ? x3 : setting.MinutesPlayed;
                        setting.banCount      = (playerStats.Length > 4 && int.TryParse(playerStats[4], out int x4) && x4 > setting.banCount) ? x4 : setting.banCount;
                        AdminToolbox.ATPlayerDict[steamID] = setting;
                    }
                }
            }
        }