Skip to content

Commit

Permalink
Add rawbroadcast and sudo (as)
Browse files Browse the repository at this point in the history
  • Loading branch information
sgkoishi committed Jan 8, 2023
1 parent 5f28111 commit e759893
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 6 deletions.
12 changes: 12 additions & 0 deletions src/Consts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ public static class Permissions
public readonly static string PvPCommand = "chireiden.omni.setpvp";
public readonly static string TeamCommand = "chireiden.omni.setteam";
public readonly static string SyncLoadout = "chireiden.omni.syncloadout";
public readonly static string TimeoutCommand = "chireiden.omni.timeout";
public readonly static string IntervalCommand = "chireiden.omni.interval";
public readonly static string ClearInterval = "chireiden.omni.cleartimeout";
public readonly static string ShowTimeout = "chireiden.omni.showtimeout";
public static class Admin
{
public readonly static string Ghost = "chireiden.omni.ghost";
Expand All @@ -24,6 +28,8 @@ public static class Admin
public readonly static string DebugStat = "chireiden.omni.admin.debugstat";
public readonly static string MaxPlayers = "chireiden.omni.admin.maxplayers";
public readonly static string TileProvider = "chireiden.omni.admin.tileprovider";
public readonly static string RawBroadcast = "chireiden.omni.admin.rawbroadcast";
public readonly static string Sudo = "chireiden.omni.admin.sudo";
}
}
public static class Commands
Expand All @@ -37,6 +43,12 @@ public static class Commands
public readonly static string DebugStat = "_debugstat";
public readonly static string MaxPlayers = "maxplayers";
public readonly static string TileProvider = "tileprovider";
public readonly static string Timeout = "settimeout";
public readonly static string Interval = "setinterval";
public readonly static string ClearInterval = "clearinterval";
public readonly static string ShowTimeout = "showdelay";
public readonly static string RawBroadcast = "rbc";
public readonly static string Sudo = "runas";
}
public static class DataKey
{
Expand Down
117 changes: 112 additions & 5 deletions src/MiscCommands.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Terraria.Localization;
using System.Reflection;
using Terraria.Localization;
using TerrariaApi.Server;
using TShockAPI;

Expand Down Expand Up @@ -41,7 +42,7 @@ private void Command_PvP(CommandArgs args)
}

player[0].TPlayer.hostile = pvp;
Terraria.NetMessage.TrySendData((int) PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, player[0].Index);
Terraria.NetMessage.TrySendData((int)PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, player[0].Index);
}
else
{
Expand All @@ -52,7 +53,7 @@ private void Command_PvP(CommandArgs args)
}

args.Player.TPlayer.hostile = pvp;
Terraria.NetMessage.TrySendData((int) PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, args.Player.Index);
Terraria.NetMessage.TrySendData((int)PacketTypes.TogglePvp, -1, -1, NetworkText.Empty, args.Player.Index);
}
}

Expand Down Expand Up @@ -100,7 +101,7 @@ private void Command_Team(CommandArgs args)
}

player[0].TPlayer.team = team;
Terraria.NetMessage.TrySendData((int) PacketTypes.PlayerTeam, -1, -1, NetworkText.Empty, player[0].Index);
Terraria.NetMessage.TrySendData((int)PacketTypes.PlayerTeam, -1, -1, NetworkText.Empty, player[0].Index);
}
else
{
Expand All @@ -111,7 +112,7 @@ private void Command_Team(CommandArgs args)
}

args.Player.TPlayer.team = team;
Terraria.NetMessage.TrySendData((int) PacketTypes.PlayerTeam, -1, -1, NetworkText.Empty, args.Player.Index);
Terraria.NetMessage.TrySendData((int)PacketTypes.PlayerTeam, -1, -1, NetworkText.Empty, args.Player.Index);
}
}
private void Command_GC(CommandArgs args)
Expand Down Expand Up @@ -145,4 +146,110 @@ private void Command_MaxPlayers(CommandArgs args)
args.Player.SendErrorMessage("Invalid max players.");
}
}

private void Command_RawBroadcast(CommandArgs args)
{
if (args.Parameters.Count == 0)
{
args.Player.SendErrorMessage("Invalid broadcast message.");
return;
}

// No need to log because TShock log every command already.
TSPlayer.All.SendMessage(args.Parameters[0], 0, 0, 0);
}

private void Command_Sudo(CommandArgs args)
{
if (args.Parameters.Count == 0)
{
args.Player.SendErrorMessage("Invalid player.");
return;
}

if (args.Parameters.Count == 1)
{
args.Player.SendErrorMessage("Invalid command.");
return;
}

var player = TSPlayer.FindByNameOrID(args.Parameters[0]);
if (player.Count == 1)
{
// Right one
}
else if (args.Parameters[0] == "*" || this.config.PlayerWildcardFormat.Contains(args.Parameters[0]))
{
player = TShockAPI.TShock.Players.Where(p => p != null && p.Active).ToList();
}
else
{
if (player.Count == 0)
{
args.Player.SendErrorMessage("Invalid player.");
return;
}
if (player.Count > 1)
{
args.Player.SendMultipleMatchError(player.Select(p => p.Name));
return;
}
}

var withoutcheck = args.Parameters.Count > 2 && args.Parameters[2] == "-f";

if (withoutcheck)
{
var cmdargs = (List<string>)typeof(TShockAPI.Command)
.GetMethod("ParseParameters", BindingFlags.NonPublic | BindingFlags.Static)!
.Invoke(null, new object[] { args.Parameters[1] })!;
if (cmdargs.Count == 0)
{
args.Player.SendErrorMessage("Invalid command.");
return;
}

var cmdname = cmdargs[0];
if (!cmdname.StartsWith(Commands.Specifier) && !cmdname.StartsWith(Commands.SilentSpecifier))
{
args.Player.SendErrorMessage("Invalid command.");
return;
}

var silent = cmdname.StartsWith(Commands.SilentSpecifier);
var specifier = silent ? Commands.SilentSpecifier : Commands.Specifier;
cmdname = cmdname.Substring(specifier.Length);
var cmds = Commands.ChatCommands.Where(c => c.HasAlias(cmdname)).ToList();
var cmdtext = args.Parameters[1].Substring(specifier.Length);
foreach (var p in player)
{
var cmds_clone = cmds.ToList().AsEnumerable();
if (TShockAPI.Hooks.PlayerHooks.OnPlayerCommand(p, cmdname, cmdtext, cmdargs, ref cmds_clone, specifier))
{
continue;
}

foreach (var cmd in cmds_clone)
{
if (cmd.DoLog)
{
TShockAPI.TShock.Log.ConsoleInfo($"{args.Player.Name} force {p.Name} executed: {specifier}{cmdtext}");
}
else
{
TShockAPI.TShock.Log.ConsoleInfo($"{args.Player.Name} force {p.Name} executed (args omitted): {specifier}{cmdname}");
}

cmd.CommandDelegate(new CommandArgs(cmdtext, silent, p, cmdargs));
}
}
}
else
{
foreach (var p in player)
{
TShockAPI.Commands.HandleCommand(p, args.Parameters[1]);
}
}
}
}
6 changes: 6 additions & 0 deletions src/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,12 @@ private void PostTShockInitialize()
Commands.ChatCommands.Add(new Command(Consts.Permissions.Admin.DebugStat, this.Command_DebugStat, Consts.Commands.DebugStat));
Commands.ChatCommands.Add(new Command(Consts.Permissions.Admin.MaxPlayers, this.Command_MaxPlayers, Consts.Commands.MaxPlayers));
Commands.ChatCommands.Add(new Command(Consts.Permissions.Admin.TileProvider, this.Command_TileProvider, Consts.Commands.TileProvider));
Commands.ChatCommands.Add(new Command(Consts.Permissions.TimeoutCommand, this.Command_SetTimeout, Consts.Commands.Timeout));
Commands.ChatCommands.Add(new Command(Consts.Permissions.IntervalCommand, this.Command_SetInterval, Consts.Commands.Interval));
Commands.ChatCommands.Add(new Command(Consts.Permissions.ClearInterval, this.Command_ClearInterval, Consts.Commands.ClearInterval));
Commands.ChatCommands.Add(new Command(Consts.Permissions.ShowTimeout, this.Command_ListDelay, Consts.Commands.ShowTimeout));
Commands.ChatCommands.Add(new Command(Consts.Permissions.Admin.RawBroadcast, this.Command_RawBroadcast, Consts.Commands.RawBroadcast));
Commands.ChatCommands.Add(new Command(Consts.Permissions.Admin.Sudo, this.Command_Sudo, Consts.Commands.Sudo));
this.OnReload(new ReloadEventArgs(TSPlayer.Server));
}
}
13 changes: 12 additions & 1 deletion src/Vanilla.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,27 @@ private void PermissionSetup()
na?.AddPermission(Consts.Permissions.Admin.Ghost);
na?.AddPermission(Consts.Permissions.Admin.SetLanguage);
na?.AddPermission(Consts.Permissions.Admin.DebugStat);
na?.AddPermission(Consts.Permissions.Admin.MaxPlayers);
na?.AddPermission(Consts.Permissions.Admin.SetPvp);
na?.AddPermission(Consts.Permissions.Admin.SetTeam);
na?.AddPermission(Consts.Permissions.TimeoutCommand);
na?.AddPermission(Consts.Permissions.IntervalCommand);
na?.AddPermission(Consts.Permissions.ClearInterval);
na?.AddPermission(Consts.Permissions.ShowTimeout);
(preset.DebugForAdminOnly ? na : guest)?.AddPermission(Consts.Permissions.Whynot);

var ta = Utils.ParentGroup(
TShockAPI.TShock.Groups.GetGroupByName("owner") ?? TShockAPI.TShock.Groups.GetGroupByName("trustedadmin"),
g => g.HasPermission(TShockAPI.Permissions.maintenance));

ta?.AddPermission(Consts.Permissions.Admin.MaxPlayers);
ta?.AddPermission(Consts.Permissions.Admin.TileProvider);
ta?.AddPermission(Consts.Permissions.Admin.TriggerGarbageCollection);
ta?.AddPermission(Consts.Permissions.Admin.RawBroadcast);

var owner = Utils.ParentGroup(
TShockAPI.TShock.Groups.GetGroupByName("owner"),
g => g.HasPermission(TShockAPI.Permissions.su));

owner?.AddPermission(Consts.Permissions.Admin.Sudo);
}
}

0 comments on commit e759893

Please sign in to comment.