Skip to content

Commit 544ec9a

Browse files
authored
Custom ranks and permissions system (PHASE 1) (#170)
* First pass at permissions * Update stuff * More rank and permission commands + logic * Final stage of phase 1 for Custom ranks and permissions
1 parent 0c3c8f2 commit 544ec9a

9 files changed

Lines changed: 840 additions & 3 deletions

‎Essentials/Commands/RanksModule.cs‎

Lines changed: 319 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,319 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Timers;
7+
using Sandbox;
8+
using Sandbox.Engine.Multiplayer;
9+
using Sandbox.Game.GameSystems.BankingAndCurrency;
10+
using Sandbox.Game.World;
11+
using Torch;
12+
using NLog;
13+
using Torch.Commands;
14+
using Torch.Commands.Permissions;
15+
using VRage.Game.ModAPI;
16+
using VRageRender.Utils;
17+
using VRageMath;
18+
using Newtonsoft.Json;
19+
using System.IO;
20+
21+
namespace Essentials.Commands {
22+
[Category("pr")]
23+
public class RanksModule : CommandModule {
24+
public static readonly Logger Log = LogManager.GetCurrentClassLogger();
25+
public PlayerAccountModule AccModule = new PlayerAccountModule();
26+
public RanksAndPermissionsModule RanksAndPermissions = new RanksAndPermissionsModule();
27+
28+
29+
[Command("createrank")]
30+
[Permission(MyPromoteLevel.Admin)]
31+
public void CreateRank(string name) {
32+
if (!RanksAndPermissions.GenerateRank(name)) {
33+
Context.Respond("Rank already exists!");
34+
return;
35+
}
36+
Context.Respond("Rank Created!");
37+
}
38+
39+
[Command("delrank")]
40+
[Permission(MyPromoteLevel.Admin)]
41+
public void DeleteRank(string name) {
42+
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(name);
43+
if (rank == null) {
44+
Context.Respond($"Rank '{name}' does not exist!");
45+
return;
46+
}
47+
RanksAndPermissionsModule.Ranks.Remove(rank);
48+
RanksAndPermissions.SaveRankData();
49+
50+
}
51+
52+
[Command("renamerank")]
53+
[Permission(MyPromoteLevel.Admin)]
54+
public void RenameRank(string oldName, string newName) {
55+
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(oldName);
56+
if (rank == null) {
57+
Context.Respond($"Rank '{oldName}' does not exist!");
58+
return;
59+
}
60+
rank.RankName = newName;
61+
RanksAndPermissions.UpdateRankObject(rank);
62+
RanksAndPermissions.UpdateRegisteredPlayersRanks(newName);
63+
}
64+
65+
[Command("setdefaultrank")]
66+
[Permission(MyPromoteLevel.Admin)]
67+
public void SetDefaultRank(string name) {
68+
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(name);
69+
if (rank == null) {
70+
Context.Respond($"Rank '{name}' does not exist!");
71+
return;
72+
}
73+
EssentialsPlugin.Instance.Config.DefaultRank = name;
74+
EssentialsPlugin.Instance.Save();
75+
Context.Respond($"Default rank set to '{name}'!");
76+
Log.Info($"Default rank set to '{name}'!");
77+
}
78+
79+
[Command("setrank")]
80+
[Permission(MyPromoteLevel.Admin)]
81+
public void SetRank(string playerName, string rankName) {
82+
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(rankName);
83+
/*IMyPlayer player = Utilities.GetPlayerByNameOrId(playerName);
84+
if (player == null) {
85+
Context.Respond("Player does not exist!");
86+
return;
87+
}*/
88+
89+
if (rank == null) {
90+
Context.Respond("Rank does not exist!");
91+
return;
92+
}
93+
94+
PlayerAccountModule.PlayerAccountData data = new PlayerAccountModule.PlayerAccountData();
95+
var RegisteredPlayers = PlayerAccountModule.PlayersAccounts.Select(o => o.Player).ToList();
96+
if (!RegisteredPlayers.Contains(playerName)) {
97+
Log.Warn($"Player {playerName} does have registered player object... Creating one");
98+
data.Player = playerName;
99+
//data.SteamID = playerName;
100+
data.Rank = rank.RankName;
101+
AccModule.UpdatePlayerAccount(data);
102+
Context.Respond($"{playerName}'s rank set to {rank.RankName}");
103+
Log.Info($"{playerName}'s rank set to {rank.RankName}");
104+
return;
105+
}
106+
data = PlayerAccountModule.PlayersAccounts.Single(a => a.Player == playerName);
107+
data.Rank = rank.RankName;
108+
MySession.Static.SetUserPromoteLevel(data.SteamID, RanksAndPermissions.ParseMyPromoteLevel(rank.KeenLevelRank));
109+
110+
AccModule.UpdatePlayerAccount(data);
111+
}
112+
113+
[Command("addinheritance")]
114+
[Permission(MyPromoteLevel.Admin)]
115+
public void AddInheritance(string rankName, string inheritanceName) {
116+
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(rankName);
117+
if (rank != null) {
118+
RanksAndPermissionsModule.RankData InheritRank = RanksAndPermissions.GetRankData(inheritanceName);
119+
if (InheritRank == null) {
120+
Context.Respond("The rank you are trying to add to the inheritance list does not exist!");
121+
return;
122+
}
123+
rank.Inherits.Add(inheritanceName);
124+
RanksAndPermissions.UpdateRankObject(rank);
125+
Context.Respond("Inheritance added!");
126+
return;
127+
}
128+
Context.Respond("The rank you are trying to add inheritence to does not exist");
129+
}
130+
131+
[Command("delinheritance")]
132+
[Permission(MyPromoteLevel.Admin)]
133+
public void DelInheritance(string rankName, string inheritanceName) {
134+
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(rankName);
135+
if (rank != null) {
136+
if (!rank.Inherits.Contains(inheritanceName)) {
137+
Context.Respond($"{rank.RankName} does not inherit {inheritanceName}");
138+
return;
139+
}
140+
rank.Inherits.Remove(inheritanceName);
141+
RanksAndPermissions.UpdateRankObject(rank);
142+
Context.Respond("Inheritance removed");
143+
return;
144+
}
145+
Context.Respond("The rank you are trying to remove inheritence from does not exist");
146+
147+
}
148+
149+
[Command("addperm")]
150+
[Permission(MyPromoteLevel.Admin)]
151+
public void AddPermission(string rankName, string command) {
152+
RanksAndPermissionsModule.RankData data = new RanksAndPermissionsModule.RankData();
153+
bool found = false;
154+
foreach (var Rank in RanksAndPermissionsModule.Ranks) {
155+
if (Rank.RankName == rankName) {
156+
data = Rank;
157+
found = true;
158+
break;
159+
}
160+
}
161+
162+
if (!found) {
163+
Context.Respond($"Rank '{rankName}' does not exist!");
164+
return;
165+
}
166+
167+
if (command.Substring(0,1) == "-") {
168+
string stringAfterChar = command.Substring(command.IndexOf("-") + 1);
169+
if (data.Permissions.Allowed.Contains(stringAfterChar)) {
170+
data.Permissions.Allowed.Remove(stringAfterChar);
171+
Context.Respond($"Permission to use command '{command}' has been removed from the {data.RankName} rank!");
172+
RanksAndPermissions.UpdateRankObject(data);
173+
return;
174+
}
175+
}
176+
177+
if (!data.Permissions.Allowed.Contains(command)) {
178+
data.Permissions.Allowed.Add(command);
179+
Context.Respond($"Permission to use command '{command}' has been added to the {data.RankName} rank!");
180+
RanksAndPermissions.UpdateRankObject(data);
181+
return;
182+
}
183+
184+
Context.Respond($"The rank '{data.RankName}' already has permission to use '{command}'");
185+
}
186+
187+
[Command("delperm")]
188+
[Permission(MyPromoteLevel.Admin)]
189+
public void RemovePermission(string rankName, string command) {
190+
RanksAndPermissionsModule.RankData data = new RanksAndPermissionsModule.RankData();
191+
bool found = false;
192+
foreach (var Rank in RanksAndPermissionsModule.Ranks) {
193+
if (Rank.RankName == rankName) {
194+
data = Rank;
195+
found = true;
196+
break;
197+
}
198+
}
199+
200+
if (!found) {
201+
Context.Respond($"Rank '{rankName}' does not exist!");
202+
return;
203+
}
204+
205+
if (command.Substring(0, 1) == "-") {
206+
string stringAfterChar = command.Substring(command.IndexOf("-") + 1);
207+
if (data.Permissions.Disallowed.Contains(stringAfterChar)) {
208+
data.Permissions.Disallowed.Remove(stringAfterChar);
209+
Context.Respond($"Updated rank");
210+
RanksAndPermissions.UpdateRankObject(data);
211+
return;
212+
}
213+
}
214+
215+
if (!data.Permissions.Disallowed.Contains(command)) {
216+
data.Permissions.Disallowed.Add(command);
217+
Context.Respond($"Permission to use command '{command}' has been actively revoked from the {data.RankName} rank!");
218+
RanksAndPermissions.UpdateRankObject(data);
219+
return;
220+
}
221+
222+
Context.Respond($"Permission to use command '{command}' is already being actively revoked from the {data.RankName} rank!");
223+
}
224+
225+
226+
[Command("addplayerperm")]
227+
[Permission(MyPromoteLevel.Admin)]
228+
public void AddPlayerPermission(string playerName, string command) {
229+
PlayerAccountModule.PlayerAccountData data = new PlayerAccountModule.PlayerAccountData();
230+
bool found = false;
231+
foreach (var player in PlayerAccountModule.PlayersAccounts) {
232+
if (player.Player == playerName) {
233+
data = player;
234+
found = true;
235+
break;
236+
}
237+
}
238+
239+
if (!found) {
240+
Context.Respond($"Player '{playerName}' does not have a registered account!");
241+
return;
242+
}
243+
244+
if (command.Substring(0, 1) == "-") {
245+
string stringAfterChar = command.Substring(command.IndexOf("-") + 1);
246+
if (data.Permissions.Allowed.Contains(stringAfterChar)) {
247+
data.Permissions.Allowed.Remove(stringAfterChar);
248+
Context.Respond($"Permission to use command '{command}' has been removed from {data.Player}'s account!");
249+
AccModule.UpdatePlayerAccount(data);
250+
return;
251+
}
252+
}
253+
254+
if (!data.Permissions.Allowed.Contains(command)) {
255+
data.Permissions.Allowed.Add(command);
256+
Context.Respond($"Permission to use command '{command}' has been added to {data.Player}'s account!");
257+
AccModule.UpdatePlayerAccount(data);
258+
return;
259+
}
260+
261+
Context.Respond($"The player '{data.Player}' already has permission to use '{command}'");
262+
}
263+
264+
[Command("delplayerperm")]
265+
[Permission(MyPromoteLevel.Admin)]
266+
public void RemovePlayerPermission(string playerName, string command) {
267+
PlayerAccountModule.PlayerAccountData data = new PlayerAccountModule.PlayerAccountData();
268+
bool found = false;
269+
foreach (var player in PlayerAccountModule.PlayersAccounts) {
270+
if (player.Player == playerName) {
271+
data = player;
272+
found = true;
273+
break;
274+
}
275+
}
276+
277+
if (!found) {
278+
Context.Respond($"Player '{playerName}' does not have a registered account!");
279+
return;
280+
}
281+
282+
if (command.Substring(0, 1) == "-") {
283+
string stringAfterChar = command.Substring(command.IndexOf("-") + 1);
284+
if (data.Permissions.Disallowed.Contains(stringAfterChar)) {
285+
data.Permissions.Disallowed.Remove(stringAfterChar);
286+
Context.Respond($"Updated rank");
287+
AccModule.UpdatePlayerAccount(data);
288+
return;
289+
}
290+
}
291+
292+
if (!data.Permissions.Disallowed.Contains(command)) {
293+
data.Permissions.Disallowed.Add(command);
294+
Context.Respond($"Permission to use command '{command}' has been actively revoked from {data.Player}'s account!");
295+
AccModule.UpdatePlayerAccount(data);
296+
return;
297+
}
298+
299+
Context.Respond($"Permission to use command '{command}' is already being actively revoked from {data.Player}'s account!");
300+
}
301+
302+
[Command("listranks")]
303+
[Permission(MyPromoteLevel.None)]
304+
public void ListRanks() {
305+
bool found = false;
306+
string Ranks = "Ranks: ";
307+
foreach (var rank in RanksAndPermissionsModule.Ranks) {
308+
found = true;
309+
Ranks += ($"{rank.RankName},");
310+
}
311+
if(!found) {
312+
Context.Respond("No ranks found");
313+
return;
314+
}
315+
Ranks = Ranks.TrimEnd(',');
316+
Context.Respond(Ranks);
317+
}
318+
}
319+
}

‎Essentials/Essentials.csproj‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
44
<PropertyGroup>
@@ -32,8 +32,11 @@
3232
<Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
3333
<HintPath>..\GameBinaries\netstandard.dll</HintPath>
3434
</Reference>
35+
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
36+
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
37+
</Reference>
3538
<Reference Include="NLog">
36-
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
39+
<HintPath>..\..\..\TEST SERVER\NLog.dll</HintPath>
3740
<Private>False</Private>
3841
</Reference>
3942
<Reference Include="PresentationCore" />
@@ -137,6 +140,7 @@
137140
<Compile Include="AutoCommand.cs" />
138141
<Compile Include="AutoCommands.cs" />
139142
<Compile Include="Commands\EcoModule.cs" />
143+
<Compile Include="Commands\RanksModule.cs" />
140144
<Compile Include="Commands\VotingModule.cs" />
141145
<Compile Include="Commands\AdminModule.cs" />
142146
<Compile Include="Commands\BlocksModule.cs" />
@@ -155,7 +159,9 @@
155159
<Compile Include="InfoCommand.cs" />
156160
<Compile Include="Commands\InfoModule.cs" />
157161
<Compile Include="Patches\SessionDownloadPatch.cs" />
162+
<Compile Include="PlayerAccountModule.cs" />
158163
<Compile Include="Properties\AssemblyInfo.cs" />
164+
<Compile Include="RanksAndPermissionsModule.cs" />
159165
<Compile Include="Utilities.cs" />
160166
<Compile Include="Utils\Ownership.cs" />
161167
<Compile Include="Utils\TypedObjectPool.cs" />
@@ -170,4 +176,4 @@
170176
<None Include="packages.config" />
171177
</ItemGroup>
172178
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
173-
</Project>
179+
</Project>

‎Essentials/EssentialsConfig.cs‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,22 @@ public EssentialsConfig()
3636
private string _motd;
3737
public string Motd { get => _motd; set => SetValue(ref _motd, value); }
3838

39+
public bool _enableRanks = false;
40+
[Display(Name = "Enable custom ranks", GroupName = "Custom Ranks", Order = 0, Description = "Enable the custom ranks system for this server.")]
41+
public bool EnableRanks { get => _enableRanks; set => SetValue(ref _enableRanks, value); }
42+
43+
public string _defaultRank = "Default";
44+
[Display(Name = "Default rank assignment", GroupName = "Custom Ranks", Order = 1, Description = "The rank users will get when they first join the server.")]
45+
public string DefaultRank { get => _defaultRank; set => SetValue(ref _defaultRank, value); }
46+
47+
public bool _overridePerms = false;
48+
[Display(Name = "Override vanilla Torch/Plugin Permissions", GroupName = "Custom Ranks", Order = 2, Description = "Enabling this will cause the custom rank permissions system to overide any vanilla permissions... MAKE SURE RANKS HAVE PERMS SET BEFORE ENABLING")]
49+
public bool OverrideVanillaPerms { get => _overridePerms; set => SetValue(ref _overridePerms, value); }
50+
51+
private int _maxHomes = 3;
52+
[Display(Name = "Default Max Homes", GroupName = "Custom Ranks", Order = 3, Description = "Default amount of homes a created rank will get")]
53+
public int MaxHomes { get => _maxHomes; set => SetValue(ref _maxHomes, value); }
54+
3955
private string _newUserMotd;
4056
public string NewUserMotd { get => _newUserMotd; set => SetValue(ref _newUserMotd, value); }
4157

0 commit comments

Comments
 (0)