-
-
Notifications
You must be signed in to change notification settings - Fork 103
/
PermissionCommand.java
157 lines (138 loc) · 6.81 KB
/
PermissionCommand.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package net.aufdemrand.denizen.scripts.commands.player;
import net.aufdemrand.denizen.BukkitScriptEntryData;
import net.aufdemrand.denizen.objects.dWorld;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizen.utilities.depends.Depends;
import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException;
import net.aufdemrand.denizencore.objects.Element;
import net.aufdemrand.denizencore.objects.aH;
import net.aufdemrand.denizencore.scripts.ScriptEntry;
import net.aufdemrand.denizencore.scripts.commands.AbstractCommand;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
public class PermissionCommand extends AbstractCommand {
// <--[command]
// @Name Permission
// @Syntax permission [add/remove] [permission] (group:<name>) (<world>)
// @Required 2
// @Short Gives or takes a permission node to/from the player or group.
// @Group player
// @Plugin Vault
//
// @Description
// Adds or removes a permission node from a player or group. Accepts a world for world-based permissions
// plugins. By default changes the attached player's permissions. Accepts the 'group:<name>' argument to change
// a group's permission nodes rather than a player's.
// Note: This requires a permissions plugin.
//
// @Tags
// <p@player.has_permission[permission.node]>
// <p@player.has_permission[permission.node].global>
// <p@player.has_permission[permission.node].world[<world>]>
// <server.has_permissions>
//
// @Usage
// Use to give the player a permissions node.
// - permission add bukkit.version
//
// @Usage
// Use to remove a permissions node from a player.
// - permission remove bukkit.version
//
// @Usage
// Use to give the group 'Members' a permission node.
// - permission add bukkit.version group:Members
//
// @Usage
// Use to remove a permissions node from the group 'Members' in the Creative world.
// - permission remove bukkit.version group:Members w@Creative
// -->
private enum Action {ADD, REMOVE}
@Override
public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException {
if (Depends.permissions == null) {
throw new InvalidArgumentsException("Permissions not linked - is Vault improperly installed, or is there no permissions plugin?");
}
for (aH.Argument arg : aH.interpretArguments(scriptEntry.aHArgs)) {
if (!scriptEntry.hasObject("action")
&& arg.matchesEnum(Action.values())) {
scriptEntry.addObject("action", arg.asElement());
}
else if (!scriptEntry.hasObject("group")
&& arg.matchesPrefix("group")) {
scriptEntry.addObject("group", arg.asElement());
}
else if (!scriptEntry.hasObject("world")
&& arg.matchesArgumentType(dWorld.class)) {
scriptEntry.addObject("world", arg.asType(dWorld.class));
}
else if (!scriptEntry.hasObject("permission")) {
scriptEntry.addObject("permission", arg.asElement());
}
}
if (!scriptEntry.hasObject("group") && (!((BukkitScriptEntryData) scriptEntry.entryData).hasPlayer() || !((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().isValid())) {
throw new InvalidArgumentsException("Must have player context or a valid group!");
}
if (!scriptEntry.hasObject("action")) {
throw new InvalidArgumentsException("Must specify a valid action!");
}
if (!scriptEntry.hasObject("permission")) {
throw new InvalidArgumentsException("Must specify a permission!");
}
}
@Override
public void execute(ScriptEntry scriptEntry) {
Element action = scriptEntry.getElement("action");
Element permission = scriptEntry.getElement("permission");
Element group = scriptEntry.getElement("group");
dWorld world = (dWorld) scriptEntry.getObject("world");
// Report to dB
if (scriptEntry.dbCallShouldDebug()) {
dB.report(scriptEntry, getName(), action.debug() + permission.debug()
+ (group != null ? group.debug() : "") + (world != null ? world.debug() : ""));
}
World bukkitWorld = null;
if (world != null) {
bukkitWorld = world.getWorld();
}
OfflinePlayer player = ((BukkitScriptEntryData) scriptEntry.entryData).hasPlayer() ? ((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().getOfflinePlayer() : null;
switch (Action.valueOf(action.asString().toUpperCase())) {
case ADD:
if (group != null) {
if (Depends.permissions.groupHas(bukkitWorld, group.asString(), permission.asString())) {
dB.echoDebug(scriptEntry, "Group " + group + " already has permission " + permission);
}
else {
Depends.permissions.groupAdd(bukkitWorld, group.asString(), permission.asString());
}
}
else {
if (Depends.permissions.playerHas(bukkitWorld == null ? null : bukkitWorld.getName(), player, permission.asString())) {
dB.echoDebug(scriptEntry, "Player " + player.getName() + " already has permission " + permission);
}
else {
Depends.permissions.playerAdd(bukkitWorld == null ? null : bukkitWorld.getName(), player, permission.asString());
}
}
return;
case REMOVE:
if (group != null) {
if (!Depends.permissions.groupHas(bukkitWorld, group.asString(), permission.asString())) {
dB.echoDebug(scriptEntry, "Group " + group + " does not have access to permission " + permission);
}
else {
Depends.permissions.groupRemove(bukkitWorld, group.asString(), permission.asString());
}
}
else {
if (!Depends.permissions.playerHas(bukkitWorld == null ? null : bukkitWorld.getName(), player, permission.asString())) {
dB.echoDebug(scriptEntry, "Player " + player.getName() + " does not have access to permission " + permission);
}
else {
Depends.permissions.playerRemove(bukkitWorld == null ? null : bukkitWorld.getName(), player, permission.asString());
}
}
return;
}
}
}