diff --git a/CommandDelInstance.cs b/CommandDelInstance.cs index 703262c..8ae1fed 100644 --- a/CommandDelInstance.cs +++ b/CommandDelInstance.cs @@ -44,29 +44,22 @@ public void Execute(IRocketPlayer caller, string[] command) { UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("delint_help")); } - if (command.Length > 1) + else if (command.Length > 1) { UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("too_many_parameters")); return; } - if (command.Length == 1) + if (!ushort.TryParse(command[0], out var ID)) { - ushort ID; - if (!ushort.TryParse(command[0], out ID)) - { - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("delint_invalid")); - return; - } - if (PlayerInfoLib.Database.RemoveInstance(ID)) - { - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("delint_success")); - return; - } - else - { - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("delint_not_found")); - } + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("delint_invalid")); + return; + } + if (!PlayerInfoLib.Database.RemoveInstance(ID)) + { + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("delint_not_found")); + return; } + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("delint_success")); } } } diff --git a/CommandInvestigate.cs b/CommandInvestigate.cs index 5446f20..32c323a 100644 --- a/CommandInvestigate.cs +++ b/CommandInvestigate.cs @@ -2,10 +2,10 @@ using Rocket.API.Extensions; using Rocket.Unturned.Chat; using SDG.Unturned; -using Steamworks; -using System; using System.Collections.Generic; using UnityEngine; +using Math = System.Math; + namespace PlayerInfoLibrary { @@ -49,66 +49,55 @@ public void Execute(IRocketPlayer caller, string[] command) { UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("investigate_help")); } - CSteamID cSteamID; - uint totalRecods = 1; + else if (command.Length > 2) + { + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("too_many_parameters")); + return; + } + var totalRecods = 1u; uint? page = 1; - uint start = 0; - uint perPage = caller is ConsolePlayer ? 10u : 4u; - List pInfo = new List(); - if (command.Length >= 1) + var perPage = caller is ConsolePlayer ? 10u : 4u; + var pInfo = new List(); + uint start; + if (command.Length == 2) { - if (command.Length ==2) + page = command.GetUInt32Parameter(1); + if (page == null || page == 0) { - page = command.GetUInt32Parameter(1); - if (page == null || page == 0) - { - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("invalid_page")); - return; - } - } - if (command.Length > 2) - { - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("too_many_parameters")); + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("invalid_page")); return; } - // Is what is entered in the command a SteamID64 number? - if (command[0].isCSteamID(out cSteamID)) - { - PlayerData pData = PlayerInfoLib.Database.QueryById(cSteamID); - if(pData.IsValid()) - pInfo.Add(pData); - } - else if(Parser.checkIP(command[0])) - { - pInfo = PlayerInfoLib.Database.QueryByName(command[0], QueryType.IP, out totalRecods, true, (uint)page, perPage); - } - else - { - pInfo = PlayerInfoLib.Database.QueryByName(command[0], QueryType.Both, out totalRecods, true, (uint)page, perPage); - } - if (pInfo.Count > 0) + } + // Is what is entered in the command a SteamID64 number? + if (command[0].IsCSteamID(out var cSteamID)) + { + var pData = PlayerInfoLib.Database.QueryById(cSteamID); + if (pData.IsValid()) + pInfo.Add(pData); + } + else + { + pInfo = PlayerInfoLib.Database.QueryByName(command[0], Parser.checkIP(command[0]) ? QueryType.IP : QueryType.Both, out totalRecods, true, (uint)page, perPage); + } + if (pInfo.Count == 0) + { + UnturnedChat.Say(caller, "No players found by that name."); + return; + } + start = ((uint)page - 1) * perPage; + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("number_of_records_found", totalRecods, command[0], page, Math.Ceiling(totalRecods / (float)perPage)), Color.red); + foreach (var pData in pInfo) + { + start++; + if (pData.IsLocal()) { - start = ((uint)page - 1) * perPage; - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("number_of_records_found", totalRecods, command[0], page, Math.Ceiling(totalRecods / (float)perPage)), Color.red); - foreach (PlayerData pData in pInfo) - { - start++; - if (pData.IsLocal()) - { - UnturnedChat.Say(caller, string.Format("{0}: {1} [{2}] ({3}), IP: {4}, Local: {5}, IsVip: {6}", start, caller is ConsolePlayer ? pData.CharacterName : pData.CharacterName.Truncate(12), caller is ConsolePlayer ? pData.SteamName : pData.SteamName.Truncate(12), pData.SteamID, pData.IP, pData.IsLocal(), pData.IsVip()), Color.yellow); - UnturnedChat.Say(caller, string.Format("Seen: {0}, TT: {1}, Cleaned:{2}:{3}", pData.LastLoginLocal, pData.TotalPlayime.FormatTotalTime(), pData.CleanedBuildables, pData.CleanedPlayerData), Color.yellow); - } - else - { - UnturnedChat.Say(caller, string.Format("{0}: {1} [{2}] ({3}), IP: {4}, Local: {5}", start, caller is ConsolePlayer ? pData.CharacterName : pData.CharacterName.Truncate(12), caller is ConsolePlayer ? pData.SteamName : pData.SteamName.Truncate(12), pData.SteamID, pData.IP, pData.IsLocal()), Color.yellow); - UnturnedChat.Say(caller, string.Format("Seen: {0}, TT: {1}, on: {2}:{3}", pData.LastLoginLocal, pData.TotalPlayime.FormatTotalTime(), pData.LastServerID, pData.LastServerName), Color.yellow); - } - } + UnturnedChat.Say(caller, string.Format("{0}: {1} [{2}] ({3}), IP: {4}, Local: {5}, IsVip: {6}", start, caller is ConsolePlayer ? pData.CharacterName : pData.CharacterName.Truncate(12), caller is ConsolePlayer ? pData.SteamName : pData.SteamName.Truncate(12), pData.SteamID, pData.IP, pData.IsLocal(), pData.IsVip()), Color.yellow); + UnturnedChat.Say(caller, string.Format("Seen: {0}, TT: {1}, Cleaned:{2}:{3}", pData.LastLoginLocal, pData.TotalPlayTime.FormatTotalTime(), pData.CleanedBuildables, pData.CleanedPlayerData), Color.yellow); } else { - UnturnedChat.Say(caller, "No players found by that name."); - return; + UnturnedChat.Say(caller, string.Format("{0}: {1} [{2}] ({3}), IP: {4}, Local: {5}", start, caller is ConsolePlayer ? pData.CharacterName : pData.CharacterName.Truncate(12), caller is ConsolePlayer ? pData.SteamName : pData.SteamName.Truncate(12), pData.SteamID, pData.IP, pData.IsLocal()), Color.yellow); + UnturnedChat.Say(caller, string.Format("Seen: {0}, TT: {1}, on: {2}:{3}", pData.LastLoginLocal, pData.TotalPlayTime.FormatTotalTime(), pData.LastServerID, pData.LastServerName), Color.yellow); } } } diff --git a/CommandRnInstance.cs b/CommandRnInstance.cs index 8ebec80..dab8852 100644 --- a/CommandRnInstance.cs +++ b/CommandRnInstance.cs @@ -44,24 +44,18 @@ public void Execute(IRocketPlayer caller, string[] command) { UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("rnint_help")); } - if (command.Length > 1) + else if (command.Length > 1) { UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("too_many_parameters")); return; } - if (command.Length == 1) + var newName = command[0].ToLower(); + if (PlayerInfoLib.Database.SetInstanceName(newName)) { - string newName = command[0].ToLower(); - if (PlayerInfoLib.Database.SetInstanceName(newName)) - { - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("rnint_success")); - return; - } - else - { - UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("rnint_not_found")); - } + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("rnint_success")); + return; } + UnturnedChat.Say(caller, PlayerInfoLib.Instance.Translate("rnint_not_found")); } } } diff --git a/DatabaseManager.cs b/DatabaseManager.cs index 0fac46c..732f428 100644 --- a/DatabaseManager.cs +++ b/DatabaseManager.cs @@ -10,14 +10,14 @@ namespace PlayerInfoLibrary { public class DatabaseManager { - private Dictionary Cache = new Dictionary(); + private readonly Dictionary Cache = new Dictionary(); public bool Initialized { get; private set; } private MySqlConnection Connection = null; - private int MaxRetry = 5; - private string Table; - private string TableConfig; - private string TableInstance; - private string TableServer; + private readonly int MaxRetry = 5; + private readonly string Table; + private readonly string TableConfig; + private readonly string TableInstance; + private readonly string TableServer; internal ushort InstanceID { get; private set; } public static readonly uint DatabaseSchemaVersion = 4; public static readonly uint DatabaseInterfaceVersion = 2; @@ -332,7 +332,7 @@ private bool HandleException(MySqlException ex, string msg = null) else { Logger.LogWarning(ex.Number.ToString() + ":" + ((MySqlErrorCode)ex.Number).ToString()); - Logger.LogException(ex , msg != null ? msg : null); + Logger.LogException(ex , msg ?? null); } return false; } @@ -410,7 +410,6 @@ public List QueryByName(string playerName, QueryType queryType, out List playerList = new List(); MySqlDataReader reader = null; totalRecods = 0; - uint limitStart = (page - 1) * limit; MySqlCommand command = Connection.CreateCommand(); try { @@ -767,7 +766,7 @@ internal void SaveToDB(PlayerData pdata, bool retry = false) command.Parameters.AddWithValue("@instanceid", pdata.ServerID); command.Parameters.AddWithValue("@lastinstanceid", pdata.LastServerID); command.Parameters.AddWithValue("@lastloginglobal", pdata.LastLoginGlobal.ToTimeStamp()); - command.Parameters.AddWithValue("@totalplaytime", pdata.TotalPlayime); + command.Parameters.AddWithValue("@totalplaytime", pdata.TotalPlayTime); command.Parameters.AddWithValue("@lastloginlocal", pdata.LastLoginLocal.ToTimeStamp()); command.Parameters.AddWithValue("@cleanedbuildables", pdata.CleanedBuildables); command.Parameters.AddWithValue("@cleanedplayerdata", pdata.CleanedPlayerData); diff --git a/Extensions.cs b/Extensions.cs index 353ade0..ae9d21d 100644 --- a/Extensions.cs +++ b/Extensions.cs @@ -1,4 +1,5 @@ using MySql.Data.MySqlClient; +using Rocket.Unturned.Player; using SDG.Unturned; using Steamworks; using System; @@ -17,7 +18,7 @@ public static long ToTimeStamp(this DateTime datetime) return (long)(datetime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds); } - public static bool IsDBNull (this MySqlDataReader reader, string fieldname) + public static bool IsDBNull(this MySqlDataReader reader, string fieldname) { return reader.IsDBNull(reader.GetOrdinal(fieldname)); } @@ -25,21 +26,19 @@ public static bool IsDBNull (this MySqlDataReader reader, string fieldname) public static string GetIP(this CSteamID cSteamID) { // Grab an active players ip address from CSteamID. - P2PSessionState_t sessionState; - SteamGameServerNetworking.GetP2PSessionState(cSteamID, out sessionState); + SteamGameServerNetworking.GetP2PSessionState(cSteamID, out var sessionState); return Parser.getIPFromUInt32(sessionState.m_nRemoteIP); } // Returns a Steamworks.CSteamID on out from a string, and returns true if it is a CSteamID. - public static bool isCSteamID(this string sCSteamID, out CSteamID cSteamID) + public static bool IsCSteamID(this string sCSteamID, out CSteamID cSteamID) { - ulong ulCSteamID; - cSteamID = (CSteamID)0; - if (ulong.TryParse(sCSteamID, out ulCSteamID)) + cSteamID = CSteamID.Nil; + if (ulong.TryParse(sCSteamID, out var ulCSteamID)) { if ((ulCSteamID >= 0x0110000100000000 && ulCSteamID <= 0x0170000000000000) || ulCSteamID == 0) { - cSteamID = (CSteamID)ulCSteamID; + cSteamID = new CSteamID(ulCSteamID); return true; } } @@ -71,5 +70,29 @@ public static string FormatTotalTime(this int totalTime) totalTimeFormated += ((int)(totalTime % 60)).ToString() + "s"; return totalTimeFormated; } + + public static int TotalPlayTime(this CSteamID PlayerID) + { + var RegistedTime = 0; + var Player = UnturnedPlayer.FromCSteamID(PlayerID); + if (Player != null) + { + var Component = Player.GetComponent(); + if (Component != null && Component.pData.IsValid() && Component.pData.IsLocal()) + RegistedTime = Component.pData.TotalPlayTime; + } + + if (RegistedTime == 0) + { + var pData = PlayerInfoLib.Database.QueryById(PlayerID, false); + if (pData.IsValid() && pData.IsLocal()) + RegistedTime = pData.TotalPlayTime; + } + + if (PlayerInfoLib.LoginTime.TryGetValue(PlayerID, out var Date)) + RegistedTime += (int)(DateTime.Now - Date).TotalSeconds; + + return RegistedTime; + } } } diff --git a/Libraries/BouncyCastle.Crypto.dll b/Libraries/BouncyCastle.Crypto.dll new file mode 100644 index 0000000..05036dd Binary files /dev/null and b/Libraries/BouncyCastle.Crypto.dll differ diff --git a/Libraries/Google.Protobuf.dll b/Libraries/Google.Protobuf.dll new file mode 100644 index 0000000..f106729 Binary files /dev/null and b/Libraries/Google.Protobuf.dll differ diff --git a/Libraries/I18N.West.dll b/Libraries/I18N.West.dll index bf7a5d6..af4ff63 100644 Binary files a/Libraries/I18N.West.dll and b/Libraries/I18N.West.dll differ diff --git a/Libraries/I18N.dll b/Libraries/I18N.dll index 21afd5d..a2627c2 100644 Binary files a/Libraries/I18N.dll and b/Libraries/I18N.dll differ diff --git a/Libraries/MySql.Data.dll b/Libraries/MySql.Data.dll index 42e4eae..54caaab 100644 Binary files a/Libraries/MySql.Data.dll and b/Libraries/MySql.Data.dll differ diff --git a/PlayerData.cs b/PlayerData.cs index f6eb250..7a61026 100644 --- a/PlayerData.cs +++ b/PlayerData.cs @@ -13,7 +13,7 @@ public class PlayerData public string CharacterName { get; internal set; } public string IP { get; internal set; } public DateTime LastLoginGlobal { get; internal set; } - public int TotalPlayime { get; internal set; } + public int TotalPlayTime { get; internal set; } public ushort LastServerID { get; internal set; } public string LastServerName { get; internal set; } public ushort ServerID { get; private set; } @@ -67,7 +67,7 @@ public bool IsVip() internal PlayerData() { SteamID = CSteamID.Nil; - TotalPlayime = 0; + TotalPlayTime = 0; } internal PlayerData(CSteamID steamID, string steamName, string characterName, string ip, DateTime lastLoginGlobal, ushort lastServerID, string lastServerName, ushort serverID, DateTime lastLoginLocal, bool cleanedBuildables, bool cleanedPlayerData, int totalPlayTime) { @@ -82,7 +82,7 @@ internal PlayerData(CSteamID steamID, string steamName, string characterName, st LastLoginLocal = lastLoginLocal; CleanedBuildables = cleanedBuildables; CleanedPlayerData = cleanedPlayerData; - TotalPlayime = totalPlayTime; + TotalPlayTime = totalPlayTime; } } } \ No newline at end of file diff --git a/PlayerInfoLib.cs b/PlayerInfoLib.cs index 4a435e2..17a26fa 100644 --- a/PlayerInfoLib.cs +++ b/PlayerInfoLib.cs @@ -56,13 +56,13 @@ private void Events_OnPlayerConnected(UnturnedPlayer player) if (LoginTime.ContainsKey(player.CSteamID)) LoginTime.Remove(player.CSteamID); LoginTime.Add(player.CSteamID, DateTime.Now); - PlayerData pData = Database.QueryById(player.CSteamID, false); - int totalTime = pData.TotalPlayime; - DateTime loginTime = PlayerInfoLib.LoginTime[player.CSteamID]; + var pData = Database.QueryById(player.CSteamID, false); + var totalTime = pData.TotalPlayTime; + var loginTime = LoginTime[player.CSteamID]; pData = new PlayerData(player.CSteamID, player.SteamName, player.CharacterName, player.CSteamID.GetIP(), loginTime, Database.InstanceID, Provider.serverName, Database.InstanceID, loginTime, false, false, totalTime); Database.SaveToDB(pData); // Recheck the ip address in the component, the ip isn't always fully set by the time this event is called. - PlayerInfoLibPComponent pc = player.GetComponent(); + var pc = player.GetComponent(); pc.Start(pData); } @@ -72,11 +72,10 @@ private void Events_OnPlayerDisconnected(UnturnedPlayer player) { if (LoginTime.ContainsKey(player.CSteamID)) { - PlayerData pData = Database.QueryById(player.CSteamID, false); + var pData = Database.QueryById(player.CSteamID, false); if (pData.IsValid() && pData.IsLocal()) { - int totalSessionTime = (int)(DateTime.Now - LoginTime[player.CSteamID]).TotalSeconds; - pData.TotalPlayime += totalSessionTime; + pData.TotalPlayTime += (int)(DateTime.Now - LoginTime[player.CSteamID]).TotalSeconds; Database.SaveToDB(pData); } LoginTime.Remove(player.CSteamID); diff --git a/PlayerInfoLib.csproj b/PlayerInfoLib.csproj index 6b89f43..28b4825 100644 --- a/PlayerInfoLib.csproj +++ b/PlayerInfoLib.csproj @@ -9,7 +9,7 @@ Properties PlayerInfoLib PlayerInfoLib - v4.0 + v4.6.2 512 @@ -39,6 +39,16 @@ lib\Assembly-CSharp-firstpass.dll False + + False + Libraries\BouncyCastle.Crypto.dll + False + + + False + Libraries\Google.Protobuf.dll + False + Libraries\I18N.dll False @@ -65,6 +75,14 @@ + + False + Libraries\System.Management.dll + + + False + Libraries\System.Transactions.dll + @@ -100,6 +118,12 @@ + + Always + + + Always + Always diff --git a/PlayerInfoLibPComponent.cs b/PlayerInfoLibPComponent.cs index d5d9de0..8487c2c 100644 --- a/PlayerInfoLibPComponent.cs +++ b/PlayerInfoLibPComponent.cs @@ -5,9 +5,9 @@ namespace PlayerInfoLibrary { public class PlayerInfoLibPComponent : UnturnedPlayerComponent { + public PlayerData pData { get; private set; } private bool start; private DateTime startTime; - private PlayerData pData; private float ping; protected override void Load() diff --git a/lib/Assembly-CSharp-firstpass.dll b/lib/Assembly-CSharp-firstpass.dll index eec2417..d29cf54 100644 Binary files a/lib/Assembly-CSharp-firstpass.dll and b/lib/Assembly-CSharp-firstpass.dll differ diff --git a/lib/Assembly-CSharp.dll b/lib/Assembly-CSharp.dll index e7690b6..708d1d6 100644 Binary files a/lib/Assembly-CSharp.dll and b/lib/Assembly-CSharp.dll differ diff --git a/lib/Rocket.API.dll b/lib/Rocket.API.dll index e273f32..c197c6f 100644 Binary files a/lib/Rocket.API.dll and b/lib/Rocket.API.dll differ diff --git a/lib/Rocket.Core.dll b/lib/Rocket.Core.dll index c008dc6..7197fcd 100644 Binary files a/lib/Rocket.Core.dll and b/lib/Rocket.Core.dll differ diff --git a/lib/Rocket.Unturned.dll b/lib/Rocket.Unturned.dll index 8587000..08ebe4c 100644 Binary files a/lib/Rocket.Unturned.dll and b/lib/Rocket.Unturned.dll differ diff --git a/lib/UnityEngine.CoreModule.dll b/lib/UnityEngine.CoreModule.dll index ee678e1..d9eb805 100644 Binary files a/lib/UnityEngine.CoreModule.dll and b/lib/UnityEngine.CoreModule.dll differ diff --git a/lib/UnityEngine.dll b/lib/UnityEngine.dll index a2fa84b..9cf3ba0 100644 Binary files a/lib/UnityEngine.dll and b/lib/UnityEngine.dll differ