diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a433825..8d1943f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ This is the rolling changelog for TShock for Terraria. Use past tense when adding new entries; sign your name off when you add or change something. This should primarily be things like user changes, not necessarily codebase changes unless it's really relevant or large. ## Upcoming Changes +* API: Version tick 2.0 +* API: Added TSPlayer.KillPlayer() (@WhiteXZ) +* API: Added TSPlayer.Logout() (@ProfessorXZ) +* Fixed connections after max slot is reached (@DeathCradle) +* Fixed server crashes caused by client disconnections when attempting to read closed sockets (@Enerdy) ## TShock 4.3.21 * Compatibility with Terraria 1.3.4.3 (@Patrikkk, @Zaicon). @@ -26,7 +31,6 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin * Added `/uploadssc [player]` which allows someone to upload SSC data for [player] and store it on the server. Adds `tshock.ssc.upload` and `tshock.ssc.upload.others` permission nodes to match (@DogooFalchion). * Added hardened stone to the whitelist of tiles editable by players (@DogooFalchion). * Added conversion system to send convert old MOTD format into smart text, while preserving initial line starting values to keep byte optimization for background colors Thanks to (@WhiteXZ, @Simon311, and especially @DogooFalchion) for the hard work on this issue. -* Fixed server-sided inventory issues caused by bank3 (@ProfessorXZ) ## TShock 4.3.20 * Security improvement: The auth system is now automatically disabled if a superadmin exists in the database (@Enerdy). diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index f1a07d67..00374b61 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -892,29 +892,7 @@ namespace TShockAPI return; } - PlayerHooks.OnPlayerLogout(args.Player); - - - if (Main.ServerSideCharacter) - { - args.Player.IgnoreActionsForInventory = String.Format("Server side characters is enabled! Please {0}register or {0}login to play!", Commands.Specifier); - if (!args.Player.IgnoreActionsForClearingTrashCan && (!args.Player.Dead || args.Player.TPlayer.difficulty != 2)) - { - args.Player.PlayerData.CopyCharacter(args.Player); - TShock.CharacterDB.InsertPlayerData(args.Player); - } - } - - args.Player.PlayerData = new PlayerData(args.Player); - args.Player.Group = TShock.Groups.GetGroupByName(TShock.Config.DefaultGuestGroupName); - args.Player.tempGroup = null; - if (args.Player.tempGroupTimer != null) - { - args.Player.tempGroupTimer.Stop(); - } - args.Player.User = null; - args.Player.IsLoggedIn = false; - + args.Player.Logout(); args.Player.SendSuccessMessage("You have been successfully logged out of your account."); if (Main.ServerSideCharacter) { @@ -1225,16 +1203,20 @@ namespace TShockAPI var user = TShock.Users.GetUserByName(username); if (user != null) { - DateTime LastSeen = DateTime.Parse(user.LastAccessed).ToLocalTime(); + DateTime LastSeen; string Timezone = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Hours.ToString("+#;-#"); - args.Player.SendSuccessMessage("{0}'s last login occured {1} {2} UTC{3}.", user.Name, LastSeen.ToShortDateString(), - LastSeen.ToShortTimeString(), Timezone); + if (DateTime.TryParse(user.LastAccessed, out LastSeen)) + { + LastSeen = DateTime.Parse(user.LastAccessed).ToLocalTime(); + args.Player.SendSuccessMessage("{0}'s last login occured {1} {2} UTC{3}.", user.Name, LastSeen.ToShortDateString(), + LastSeen.ToShortTimeString(), Timezone); + } if (args.Player.Group.HasPermission(Permissions.advaccountinfo)) { - List KnownIps = JsonConvert.DeserializeObject>(user.KnownIps); - string ip = KnownIps[KnownIps.Count - 1]; + List KnownIps = JsonConvert.DeserializeObject>(user.KnownIps?.ToString() ?? string.Empty); + string ip = KnownIps?[KnownIps.Count - 1] ?? "N/A"; DateTime Registered = DateTime.Parse(user.Registered).ToLocalTime(); args.Player.SendSuccessMessage("{0}'s group is {1}.", user.Name, user.Group); diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index cd64547f..c6fb7093 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -637,6 +637,33 @@ namespace TShockAPI return null; } + /// + /// Logs the player out of an account. + /// + public void Logout() + { + PlayerHooks.OnPlayerLogout(this); + if (Main.ServerSideCharacter) + { + IgnoreActionsForInventory = $"Server side characters is enabled! Please {Commands.Specifier}register or {Commands.Specifier}login to play!"; + if (!IgnoreActionsForClearingTrashCan && (!Dead || TPlayer.difficulty != 2)) + { + PlayerData.CopyCharacter(this); + TShock.CharacterDB.InsertPlayerData(this); + } + } + + PlayerData = new PlayerData(this); + Group = TShock.Groups.GetGroupByName(TShock.Config.DefaultGuestGroupName); + tempGroup = null; + if (tempGroupTimer != null) + { + tempGroupTimer.Stop(); + } + User = null; + IsLoggedIn = false; + } + /// /// Initializes a new instance of the class. ///