Skip to content

Commit ebe0018

Browse files
Added EXEC Command
1 parent 592d8ba commit ebe0018

File tree

6 files changed

+237
-1
lines changed

6 files changed

+237
-1
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Rocket.API;
5+
using Rocket.Core.Logging;
6+
using Rocket.Unturned.Chat;
7+
using Rocket.Unturned.Player;
8+
using SDG.Unturned;
9+
using ShimmysAdminTools.Components;
10+
using ShimmysAdminTools.Modules;
11+
12+
namespace ShimmysAdminTools.Commands
13+
{
14+
public class ExecCommand : IRocketCommand
15+
{
16+
public AllowedCaller AllowedCaller => AllowedCaller.Both;
17+
18+
public string Name => "exec";
19+
20+
public string Help => "Excecutes a command or message as another player, bypassing permissions.";
21+
22+
public string Syntax => "exec [Player] [Command]";
23+
24+
public List<string> Aliases => new List<string>();
25+
26+
public List<string> Permissions => new List<string>() { "ShimmysAdminTools.exec" };
27+
28+
public void Execute(IRocketPlayer caller, string[] command)
29+
{
30+
if (command.Length >= 2)
31+
{
32+
string player = command[0];
33+
List<string> CommandParts = command.ToList();
34+
CommandParts.RemoveAt(0);
35+
string Command = string.Join(" ", CommandParts);
36+
37+
UnturnedPlayer TargetPlayer = UnturnedPlayer.FromName(player);
38+
if (TargetPlayer == null)
39+
{
40+
UnturnedChat.Say(caller, "Exec_Fail_NoPlayer".Translate());
41+
return;
42+
}
43+
if (execManager.IsActive)
44+
{
45+
execManager.EnablePlayerEXEC(TargetPlayer.CSteamID.m_SteamID);
46+
try
47+
{
48+
ChatManager.instance.askChat(TargetPlayer.CSteamID, (byte)EChatMode.GLOBAL, Command);
49+
}
50+
catch (Exception ex)
51+
{
52+
Logger.Log(ex);
53+
}
54+
finally
55+
{
56+
execManager.DisablePlayerEXEC(TargetPlayer.CSteamID.m_SteamID);
57+
}
58+
} else
59+
{
60+
UnturnedChat.Say(caller, "Exec_Fail_NotActive".Translate());
61+
}
62+
} else
63+
{
64+
UnturnedChat.Say(caller, Syntax);
65+
}
66+
}
67+
}
68+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Rocket.API;
7+
using Rocket.API.Serialisation;
8+
using Rocket.Unturned.Player;
9+
using ShimmysAdminTools.Modules;
10+
11+
namespace ShimmysAdminTools.Models
12+
{
13+
14+
public class EXECPassthroughPermissionsManager : IRocketPermissionsProvider
15+
{
16+
public IRocketPermissionsProvider Underlying;
17+
18+
public EXECPassthroughPermissionsManager(IRocketPermissionsProvider Underlying)
19+
{
20+
this.Underlying = Underlying;
21+
}
22+
23+
public RocketPermissionsProviderResult AddGroup(RocketPermissionsGroup group)
24+
{
25+
return Underlying.AddGroup(group);
26+
}
27+
28+
public RocketPermissionsProviderResult AddPlayerToGroup(string groupId, IRocketPlayer player)
29+
{
30+
return Underlying.AddPlayerToGroup(groupId, player);
31+
}
32+
33+
public RocketPermissionsProviderResult DeleteGroup(string groupId)
34+
{
35+
return Underlying.DeleteGroup(groupId);
36+
}
37+
38+
public RocketPermissionsGroup GetGroup(string groupId)
39+
{
40+
return Underlying.GetGroup(groupId);
41+
}
42+
43+
public List<RocketPermissionsGroup> GetGroups(IRocketPlayer player, bool includeParentGroups)
44+
{
45+
return Underlying.GetGroups(player, includeParentGroups);
46+
}
47+
48+
public List<Permission> GetPermissions(IRocketPlayer player)
49+
{
50+
return Underlying.GetPermissions(player);
51+
}
52+
53+
public List<Permission> GetPermissions(IRocketPlayer player, List<string> requestedPermissions)
54+
{
55+
return Underlying.GetPermissions(player, requestedPermissions);
56+
}
57+
58+
public bool HasPermission(IRocketPlayer player, List<string> requestedPermissions)
59+
{
60+
if (execManager.IsActive && player is UnturnedPlayer UPlayer && execManager.PlayerIsEXEC(UPlayer.CSteamID.m_SteamID))
61+
{
62+
return true;
63+
}
64+
return Underlying.HasPermission(player, requestedPermissions);
65+
}
66+
67+
public void Reload()
68+
{
69+
Underlying.Reload();
70+
}
71+
72+
public RocketPermissionsProviderResult RemovePlayerFromGroup(string groupId, IRocketPlayer player)
73+
{
74+
return Underlying.RemovePlayerFromGroup(groupId, player);
75+
}
76+
77+
public RocketPermissionsProviderResult SaveGroup(RocketPermissionsGroup group)
78+
{
79+
return Underlying.SaveGroup(group);
80+
}
81+
}
82+
}

ShimmysAdminTools/Models/PluginConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ public class PluginConfig : IRocketPluginConfiguration
1212
{
1313
public int MaxGlobalFlySpeed;
1414
public bool DisableAbusableCommands;
15+
public bool DelayStartEXECUtility = false;
1516
public PointToolSettings PointToolSettings;
1617

1718
[XmlArrayItem(elementName: "ID")]
1819
public List<ushort> BlacklistedAttachments;
1920
public void LoadDefaults()
2021
{
22+
DelayStartEXECUtility = false;
2123
MaxGlobalFlySpeed = 10;
2224
PointToolSettings = new PointToolSettings()
2325
{
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System.Collections.Generic;
2+
using Rocket.Core;
3+
using ShimmysAdminTools.Models;
4+
5+
namespace ShimmysAdminTools.Modules
6+
{
7+
public static class execManager
8+
{
9+
public static List<ulong> EXECPlayers = new List<ulong>();
10+
public static bool IsActive = false;
11+
12+
private static bool IsImplemented = false;
13+
14+
public static void Activate()
15+
{
16+
if (!IsImplemented)
17+
{
18+
IsImplemented = true;
19+
R.Permissions = new EXECPassthroughPermissionsManager(R.Permissions);
20+
}
21+
IsActive = true;
22+
}
23+
24+
public static void EnablePlayerEXEC(ulong Player)
25+
{
26+
lock (EXECPlayers)
27+
{
28+
if (!EXECPlayers.Contains(Player))
29+
{
30+
EXECPlayers.Add(Player);
31+
}
32+
IsActive = true;
33+
}
34+
}
35+
36+
public static void DisablePlayerEXEC(ulong Player)
37+
{
38+
lock (EXECPlayers)
39+
{
40+
EXECPlayers.RemoveAll(x => x == Player);
41+
}
42+
}
43+
44+
public static bool PlayerIsEXEC(ulong Player)
45+
{
46+
lock (EXECPlayers)
47+
{
48+
return EXECPlayers.Contains(Player);
49+
}
50+
}
51+
52+
public static void Deactivate()
53+
{
54+
lock (EXECPlayers)
55+
{
56+
IsActive = false;
57+
EXECPlayers.Clear();
58+
}
59+
}
60+
}
61+
}

ShimmysAdminTools/ShimmysAdminTools.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
<Compile Include="Commands\CommandSpyCommand.cs" />
8585
<Compile Include="Commands\DisableVehicleAccess.cs" />
8686
<Compile Include="Commands\AFlySpeedCommands.cs" />
87+
<Compile Include="Commands\ExecCommand.cs" />
8788
<Compile Include="Commands\FindBaseCommand.cs" />
8889
<Compile Include="Commands\ForceDemountCommand.cs" />
8990
<Compile Include="Commands\GotoBedCommand.cs" />
@@ -105,13 +106,15 @@
105106
<Compile Include="main.cs" />
106107
<Compile Include="Behaviors\FlightSession.cs" />
107108
<Compile Include="Behaviors\MapJumpingSession.cs" />
109+
<Compile Include="Models\EXECPassthroughPermissionsManager.cs" />
108110
<Compile Include="Models\PlayerData.cs" />
109111
<Compile Include="Models\PlayerSession.cs" />
110112
<Compile Include="Models\PluginConfig.cs" />
111113
<Compile Include="Models\PointToolMode.cs" />
112114
<Compile Include="Models\RaycastResult.cs" />
113115
<Compile Include="Models\StructureCluster.cs" />
114116
<Compile Include="Models\UnturnedKey.cs" />
117+
<Compile Include="Modules\execManager.cs" />
115118
<Compile Include="Modules\NoClippingTool.cs" />
116119
<Compile Include="Modules\PlayerDataStore.cs" />
117120
<Compile Include="Modules\PlayerSessionStore.cs" />

ShimmysAdminTools/main.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,21 @@ public override void LoadPlugin()
4040
ChatManager.onCheckPermissions = Chat_OnCheckPermissions;
4141

4242
LoadCurrentPlayers();
43+
44+
Level.onLevelLoaded += OnLevelloaded;
45+
46+
if (!Config.DelayStartEXECUtility)
47+
{
48+
execManager.Activate();
49+
}
50+
}
51+
52+
private void OnLevelloaded(int level)
53+
{
54+
if (State == PluginState.Loaded && Config.DelayStartEXECUtility)
55+
{
56+
execManager.Activate();
57+
}
4358
}
4459

4560
private void Chat_CheckCommand(SteamPlayer Player, string Command)
@@ -208,7 +223,9 @@ public bool PlayerMuteExpired(PlayerData Data)
208223
{ "SetAttachment_Fail_Item", "Failed to find item." },
209224
{ "SetAttachment_Fail_Blacklist", "This attachment is blacklisted." },
210225
{ "SetAttachment_GaveAttachment", "Gave your gun {0}." },
211-
{ "Fail_Command_Disabled", "This command is disabled." }
226+
{ "Fail_Command_Disabled", "This command is disabled." },
227+
{ "Exec_Fail_NoPlayer", "Failed to find player." },
228+
{ "Exec_Fail_NotActive", "ERROR: The EXEC Permissions utility is not active. Try restarting the server." }
212229
};
213230

214231
private void UnturnedPlayerEvents_OnPlayerUpdateGesture(UnturnedPlayer player, Rocket.Unturned.Events.UnturnedPlayerEvents.PlayerGesture gesture)
@@ -218,6 +235,7 @@ private void UnturnedPlayerEvents_OnPlayerUpdateGesture(UnturnedPlayer player, R
218235
PointToolManager.ManageGestureUpdate(player, gesture);
219236
}
220237
}
238+
221239
private void Events_OnBeforePlayerConnected(UnturnedPlayer player)
222240
{
223241
PlayerSessionStore.TryRegisterPlayer(player);
@@ -250,6 +268,8 @@ public void LoadCurrentPlayers()
250268

251269
public override void UnloadPlugin(PluginState state = PluginState.Unloaded)
252270
{
271+
execManager.Deactivate();
272+
Level.onLevelLoaded -= OnLevelloaded;
253273
U.Events.OnBeforePlayerConnected -= Events_OnBeforePlayerConnected;
254274
U.Events.OnPlayerDisconnected -= Events_OnPlayerDisconnected;
255275
VehicleManager.onEnterVehicleRequested -= VehicleManager_onEnterVehicleRequested;

0 commit comments

Comments
 (0)