/
SpongeRootCommand.java
126 lines (107 loc) · 4.52 KB
/
SpongeRootCommand.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
/*
* Copyright (c) 2016-2017 Daniel Ennis (Aikar) - MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package co.aikar.commands;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.SetMultimap;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.api.command.CommandCallable;
import org.spongepowered.api.command.CommandException;
import org.spongepowered.api.command.CommandResult;
import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class SpongeRootCommand implements CommandCallable, RootCommand {
private final SpongeCommandManager manager;
private final String name;
private BaseCommand defCommand;
private SetMultimap<String, RegisteredCommand> subCommands = HashMultimap.create();
private List<BaseCommand> children = new ArrayList<>();
boolean isRegistered = false;
SpongeRootCommand(SpongeCommandManager manager, String name) {
this.manager = manager;
this.name = name;
}
@Override
public String getCommandName() {
return name;
}
@Override
public CommandResult process(@NotNull CommandSource source, @NotNull String arguments) throws CommandException {
String[] args = arguments.isEmpty() ? new String[0] : arguments.split(" ");
return this.executeSponge(manager.getCommandIssuer(source), this.name, args);
}
@Override
public List<String> getSuggestions(@NotNull CommandSource source, @NotNull String arguments, @Nullable Location<World> location) throws CommandException {
String[] args = arguments.isEmpty() ? new String[]{""} : arguments.split(" ");
return getTabCompletions(manager.getCommandIssuer(source), this.name, args);
}
@Override
public boolean testPermission(@NotNull CommandSource source) {
return this.hasAnyPermission(manager.getCommandIssuer(source));
}
@Override
public Optional<Text> getShortDescription(@NotNull CommandSource source) {
String description = getDescription();
return description != null ? Optional.of(Text.of(description)) : Optional.empty();
}
@Override
public Optional<Text> getHelp(@NotNull CommandSource source) {
return Optional.empty();
}
@Override
public Text getUsage(@NotNull CommandSource source) {
String usage = getUsage();
return usage != null ? Text.of(usage) : Text.of();
}
private CommandResult executeSponge(CommandIssuer sender, String commandLabel, String[] args) {
BaseCommand cmd = execute(sender, commandLabel, args);
return ((SpongeCommandOperationContext) cmd.lastCommandOperationContext).getResult();
}
public void addChild(BaseCommand command) {
if (this.defCommand == null || !command.subCommands.get(BaseCommand.DEFAULT).isEmpty()) {
this.defCommand = command;
}
addChildShared(this.children, this.subCommands, command);
}
@Override
public BaseCommand getDefCommand() {
return defCommand;
}
@Override
public CommandManager getManager() {
return manager;
}
@Override
public SetMultimap<String, RegisteredCommand> getSubCommands() {
return subCommands;
}
@Override
public List<BaseCommand> getChildren() {
return children;
}
}