Created
October 10, 2022 08:40
-
-
Save hakusaro/9b0624d94d6262944ceaabe4aec2ddad to your computer and use it in GitHub Desktop.
EasyCommands AccountInfo vs Classic AccountInfo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
TShock, a server mod for Terraria | |
Copyright (C) 2011-2019 Pryaxis & TShock Contributors | |
This program is free software: you can redistribute it and/or modify | |
it under the terms of the GNU General Public License as published by | |
the Free Software Foundation, either version 3 of the License, or | |
(at your option) any later version. | |
This program is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
GNU General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with this program. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
using EasyCommands; | |
using EasyCommands.Commands; | |
using Microsoft.Xna.Framework; | |
using Newtonsoft.Json; | |
using System; | |
using System.Collections.Generic; | |
using Terraria; | |
using TShockAPI; | |
using TShockAPI.DB; | |
using TShockAPI.Hooks; | |
using TShockCommands.Annotations; | |
using Utils = TShockAPI.Utils; | |
namespace TShockCommands.Commands; | |
class AccountCommands : CommandCallbacks<TSPlayer> | |
{ | |
[Command("accountinfo", "ai")] | |
[HelpText("Shows information about a user.")] | |
[CommandPermissions(Permissions.checkaccountinfo)] | |
public void ViewAccountInfo([AllowSpaces] string? username = null) | |
{ | |
if (String.IsNullOrWhiteSpace(username)) | |
{ | |
Sender.SendErrorMessage("Invalid syntax! Proper syntax: {0}accountinfo <username>", TextOptions.CommandPrefix); | |
return; | |
} | |
var account = TShock.UserAccounts.GetUserAccountByName(username); | |
if (account is not null) | |
{ | |
DateTime LastSeen; | |
string Timezone = TimeZoneInfo.Local.GetUtcOffset(DateTime.Now).Hours.ToString("+#;-#"); | |
if (DateTime.TryParse(account.LastAccessed, out LastSeen)) | |
{ | |
LastSeen = DateTime.Parse(account.LastAccessed).ToLocalTime(); | |
Sender.SendSuccessMessage("{0}'s last login occurred {1} {2} UTC{3}.", account.Name, LastSeen.ToShortDateString(), | |
LastSeen.ToShortTimeString(), Timezone); | |
} | |
if (Sender.Group.HasPermission(Permissions.advaccountinfo)) | |
{ | |
List<string> KnownIps = JsonConvert.DeserializeObject<List<string>>(account.KnownIps?.ToString() ?? string.Empty); | |
string ip = KnownIps?[KnownIps.Count - 1] ?? "N/A"; | |
DateTime Registered = DateTime.Parse(account.Registered).ToLocalTime(); | |
Sender.SendSuccessMessage("{0}'s group is {1}.", account.Name, account.Group); | |
Sender.SendSuccessMessage("{0}'s last known IP is {1}.", account.Name, ip); | |
Sender.SendSuccessMessage("{0}'s register date is {1} {2} UTC{3}.", account.Name, Registered.ToShortDateString(), Registered.ToShortTimeString(), Timezone); | |
} | |
} | |
else | |
Sender.SendErrorMessage("User {0} does not exist.", username); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
TShock, a server mod for Terraria | |
Copyright (C) 2011-2019 Pryaxis & TShock Contributors | |
This program is free software: you can redistribute it and/or modify | |
it under the terms of the GNU General Public License as published by | |
the Free Software Foundation, either version 3 of the License, or | |
(at your option) any later version. | |
This program is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
GNU General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with this program. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
using Newtonsoft.Json; | |
using System; | |
using System.Collections.Generic; | |
using System.Collections.ObjectModel; | |
using System.Diagnostics; | |
using System.IO; | |
using System.Linq; | |
using System.Text; | |
using System.Threading; | |
using Terraria; | |
using Terraria.ID; | |
using Terraria.Localization; | |
using TShockAPI.DB; | |
using TerrariaApi.Server; | |
using TShockAPI.Hooks; | |
using Terraria.GameContent.Events; | |
using Microsoft.Xna.Framework; | |
using TShockAPI.Localization; | |
using System.Text.RegularExpressions; | |
using Terraria.DataStructures; | |
using Terraria.GameContent.Creative; | |
namespace TShockAPI | |
{ | |
public delegate void CommandDelegate(CommandArgs args); | |
public class CommandArgs : EventArgs | |
{ | |
public string Message { get; private set; } | |
public TSPlayer Player { get; private set; } | |
public bool Silent { get; private set; } | |
/// <summary> | |
/// Parameters passed to the argument. Does not include the command name. | |
/// IE '/kick "jerk face"' will only have 1 argument | |
/// </summary> | |
public List<string> Parameters { get; private set; } | |
public Player TPlayer | |
{ | |
get { return Player.TPlayer; } | |
} | |
public CommandArgs(string message, TSPlayer ply, List<string> args) | |
{ | |
Message = message; | |
Player = ply; | |
Parameters = args; | |
Silent = false; | |
} | |
public CommandArgs(string message, bool silent, TSPlayer ply, List<string> args) | |
{ | |
Message = message; | |
Player = ply; | |
Parameters = args; | |
Silent = silent; | |
} | |
} | |
public class Command | |
{ | |
/// <summary> | |
/// Gets or sets whether to allow non-players to use this command. | |
/// </summary> | |
public bool AllowServer { get; set; } | |
/// <summary> | |
/// Gets or sets whether to do logging of this command. | |
/// </summary> | |
public bool DoLog { get; set; } | |
/// <summary> | |
/// Gets or sets the help text of this command. | |
/// </summary> | |
public string HelpText { get; set; } | |
/// <summary> | |
/// Gets or sets an extended description of this command. | |
/// </summary> | |
public string[] HelpDesc { get; set; } | |
/// <summary> | |
/// Gets the name of the command. | |
/// </summary> | |
public string Name { get { return Names[0]; } } | |
/// <summary> | |
/// Gets the names of the command. | |
/// </summary> | |
public List<string> Names { get; protected set; } | |
/// <summary> | |
/// Gets the permissions of the command. | |
/// </summary> | |
public List<string> Permissions { get; protected set; } | |
private CommandDelegate commandDelegate; | |
public CommandDelegate CommandDelegate | |
{ | |
get { return commandDelegate; } | |
set | |
{ | |
if (value == null) | |
throw new ArgumentNullException(); | |
commandDelegate = value; | |
} | |
} | |
public Command(List<string> permissions, CommandDelegate cmd, params string[] names) | |
: this(cmd, names) | |
{ | |
Permissions = permissions; | |
} | |
public Command(string permissions, CommandDelegate cmd, params string[] names) | |
: this(cmd, names) | |
{ | |
Permissions = new List<string> { permissions }; | |
} | |
public Command(CommandDelegate cmd, params string[] names) | |
{ | |
if (cmd == null) | |
throw new ArgumentNullException("cmd"); | |
if (names == null || names.Length < 1) | |
throw new ArgumentException("names"); | |
AllowServer = true; | |
CommandDelegate = cmd; | |
DoLog = true; | |
HelpText = "No help available."; | |
HelpDesc = null; | |
Names = new List<string>(names); | |
Permissions = new List<string>(); | |
} | |
public bool Run(string msg, bool silent, TSPlayer ply, List<string> parms) | |
{ | |
if (!CanRun(ply)) | |
return false; | |
try | |
{ | |
CommandDelegate(new CommandArgs(msg, silent, ply, parms)); | |
} | |
catch (Exception e) | |
{ | |
ply.SendErrorMessage("Command failed, check logs for more details."); | |
TShock.Log.Error(e.ToString()); | |
} | |
return true; | |
} | |
public bool Run(string msg, TSPlayer ply, List<string> parms) | |
{ | |
return Run(msg, false, ply, parms); | |
} | |
public bool HasAlias(string name) | |
{ | |
return Names.Contains(name); | |
} | |
public bool CanRun(TSPlayer ply) | |
{ | |
if (Permissions == null || Permissions.Count < 1) | |
return true; | |
foreach (var Permission in Permissions) | |
{ | |
if (ply.HasPermission(Permission)) | |
return true; | |
} | |
return false; | |
} | |
} | |
public static class Commands | |
{ | |
public static List<Command> ChatCommands = new List<Command>(); | |
public static ReadOnlyCollection<Command> TShockCommands = new ReadOnlyCollection<Command>(new List<Command>()); | |
/// <summary> | |
/// The command specifier, defaults to "/" | |
/// </summary> | |
public static string Specifier | |
{ | |
get { return string.IsNullOrWhiteSpace(TShock.Config.Settings.CommandSpecifier) ? "/" : TShock.Config.Settings.CommandSpecifier; } | |
} | |
/// <summary> | |
/// The silent command specifier, defaults to "." | |
/// </summary> | |
public static string SilentSpecifier | |
{ | |
get { return string.IsNullOrWhiteSpace(TShock.Config.Settings.CommandSilentSpecifier) ? "." : TShock.Config.Settings.CommandSilentSpecifier; } | |
} | |
private delegate void AddChatCommand(string permission, CommandDelegate command, params string[] names); | |
public static void InitCommands() | |
{ | |
List<Command> tshockCommands = new List<Command>(100); | |
Action<Command> add = (cmd) => | |
{ | |
tshockCommands.Add(cmd); | |
ChatCommands.Add(cmd); | |
}; | |
add(new Command(Permissions.checkaccountinfo, ViewAccountInfo, "accountinfo", "ai") | |
{ | |
HelpText = "Shows information about a user." | |
}); | |
TShockCommands = new ReadOnlyCollection<Command>(tshockCommands); | |
} | |
private static void ViewAccountInfo(CommandArgs args) | |
{ | |
if (args.Parameters.Count < 1) | |
{ | |
args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}accountinfo <username>", Specifier); | |
return; | |
} | |
string username = String.Join(" ", args.Parameters); | |
if (!string.IsNullOrWhiteSpace(username)) | |
{ | |
var account = TShock.UserAccounts.GetUserAccountByName(username); | |
if (account != null) | |
{ | |
DateTime LastSeen; | |
string Timezone = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Hours.ToString("+#;-#"); | |
if (DateTime.TryParse(account.LastAccessed, out LastSeen)) | |
{ | |
LastSeen = DateTime.Parse(account.LastAccessed).ToLocalTime(); | |
args.Player.SendSuccessMessage("{0}'s last login occurred {1} {2} UTC{3}.", account.Name, LastSeen.ToShortDateString(), | |
LastSeen.ToShortTimeString(), Timezone); | |
} | |
if (args.Player.Group.HasPermission(Permissions.advaccountinfo)) | |
{ | |
List<string> KnownIps = JsonConvert.DeserializeObject<List<string>>(account.KnownIps?.ToString() ?? string.Empty); | |
string ip = KnownIps?[KnownIps.Count - 1] ?? "N/A"; | |
DateTime Registered = DateTime.Parse(account.Registered).ToLocalTime(); | |
args.Player.SendSuccessMessage("{0}'s group is {1}.", account.Name, account.Group); | |
args.Player.SendSuccessMessage("{0}'s last known IP is {1}.", account.Name, ip); | |
args.Player.SendSuccessMessage("{0}'s register date is {1} {2} UTC{3}.", account.Name, Registered.ToShortDateString(), Registered.ToShortTimeString(), Timezone); | |
} | |
} | |
else | |
args.Player.SendErrorMessage("User {0} does not exist.", username); | |
} | |
else args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}accountinfo <username>", Specifier); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment