Skip to content

Commit 68591db

Browse files
committed
Implement a command to dump all server data for debugging
1 parent ec04348 commit 68591db

8 files changed

Lines changed: 442 additions & 11 deletions

File tree

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,44 @@
11
package xyz.invisraidinq.queryapi;
22

33
import org.bukkit.plugin.java.JavaPlugin;
4+
import xyz.invisraidinq.queryapi.commands.ServerDumpCommand;
45
import xyz.invisraidinq.queryapi.redis.JedisManager;
56
import xyz.invisraidinq.queryapi.server.ServerManager;
67
import xyz.invisraidinq.queryapi.task.ServerHeartbeatTask;
78
import xyz.invisraidinq.queryapi.thread.ServerUpdateThread;
89
import xyz.invisraidinq.queryapi.utils.CC;
910
import xyz.invisraidinq.queryapi.utils.ConfigFile;
11+
import xyz.invisraidinq.queryapi.utils.command.CommandHandler;
1012

1113
public class QueryPlugin extends JavaPlugin {
1214

13-
private ConfigFile settingsFile;
14-
private JedisManager jedisManager;
15-
private ServerManager serverManager;
16-
1715
@Override
1816
public void onEnable() {
1917
CC.log("Starting plugin");
2018

2119
long start = System.currentTimeMillis();
2220

23-
this.settingsFile = new ConfigFile(this, "settings.yml");
21+
ConfigFile settingsFile = new ConfigFile(this, "settings.yml");
22+
23+
ServerManager serverManager = new ServerManager(this);
2424

25-
this.serverManager = new ServerManager(this);
25+
JedisManager jedisManager = new JedisManager(serverManager, settingsFile);
2626

27-
this.jedisManager = new JedisManager(this.serverManager, this.settingsFile);
27+
new ServerUpdateThread(serverManager, jedisManager, settingsFile).start();
28+
new ServerHeartbeatTask(serverManager, settingsFile).runTaskTimerAsynchronously(this, 0L, 200L);
2829

29-
new ServerUpdateThread(this.serverManager, this.jedisManager, this.settingsFile).start();
30-
new ServerHeartbeatTask(this.serverManager, this.settingsFile).runTaskTimerAsynchronously(this, 0L, 200L);
30+
final CommandHandler commandHandler = new CommandHandler(this);
31+
commandHandler.setNoPermissionMessage("&cNo Permission");
3132

32-
new QueryAPI(this, this.serverManager);
33+
commandHandler.registerSimpleCommand(new ServerDumpCommand(serverManager));
34+
35+
new QueryAPI(this, serverManager);
3336

3437
CC.log("Plugin enabled in " + (System.currentTimeMillis() - start) + "ms");
3538
}
3639

3740
@Override
3841
public void onDisable() {
39-
42+
4043
}
4144
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package xyz.invisraidinq.queryapi.commands;
2+
3+
import org.bukkit.command.Command;
4+
import org.bukkit.command.CommandSender;
5+
import xyz.invisraidinq.queryapi.server.ServerManager;
6+
import xyz.invisraidinq.queryapi.utils.CC;
7+
import xyz.invisraidinq.queryapi.utils.command.SimpleCommand;
8+
9+
import java.util.Arrays;
10+
11+
public class ServerDumpCommand extends SimpleCommand {
12+
13+
private final ServerManager serverManager;
14+
15+
public ServerDumpCommand(ServerManager serverManager) {
16+
super("serverdump");
17+
18+
this.setDescription("Dump information about all servers on the network");
19+
this.setPermission("queryapi.command.serverdump");
20+
this.setAliases(Arrays.asList("serverinfodump", "infodump"));
21+
22+
this.serverManager = serverManager;
23+
}
24+
25+
@Override
26+
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
27+
this.serverManager.getServerMap().values().forEach(server -> {
28+
sender.sendMessage(new String[] {
29+
CC.colour("&e&m-------------------------------------"),
30+
CC.colour("&eServer Name: &f" + server.getServerName()),
31+
CC.colour("&eOnline Players: &f" + server.getOnlinePlayers()),
32+
CC.colour("&eMax Players: &f" + server.getMaxPlayers()),
33+
CC.colour("&eMOTD: &f" + server.getMotd()),
34+
CC.colour("&eServer Status: " + server.getServerStatus().getFormat()),
35+
CC.colour("&eBase Version: &f" + server.getBaseServerVersion()),
36+
CC.colour("&eLast Update: &f" + (System.currentTimeMillis() - server.getLastUpdate()) + "ms ago"),
37+
CC.colour("&e&m-------------------------------------")
38+
});
39+
});
40+
return false;
41+
}
42+
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package xyz.invisraidinq.queryapi.utils.command;
2+
3+
import com.google.common.base.Preconditions;
4+
import org.bukkit.ChatColor;
5+
import org.bukkit.command.*;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
public class AdvancedCommand implements CommandExecutor, TabCompleter, ICommand {
12+
13+
private final String name;
14+
private String description;
15+
private List<String> aliases;
16+
private String permission;
17+
18+
private List<SubCommand> subCommands = new ArrayList<>();
19+
private BaseCommand baseCommand;
20+
21+
public AdvancedCommand(String name) {
22+
this.name = name;
23+
}
24+
25+
@Override
26+
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
27+
if(args.length == 0) {
28+
if (this.baseCommand != null) {
29+
this.baseCommand.onCommand(sender, command, label, args);
30+
return true;
31+
}
32+
33+
sender.sendMessage(ChatColor.translateAlternateColorCodes('&',
34+
"&cInvalid Usage! Available sub-commands for &7" + label + " &care &7" +
35+
this.subCommands.stream().map(SubCommand::getName).collect(Collectors.joining("&7, "))));
36+
return false;
37+
}
38+
39+
SubCommand argument = this.getSubCommand(args[0]);
40+
41+
if (argument == null) {
42+
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cSub-command &7" + args[0] + " &cdoes not exist in command &7" + this.name));
43+
return false;
44+
}
45+
46+
argument.onCommand(sender, command, label, args);
47+
return true;
48+
}
49+
50+
@Override
51+
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args){
52+
List<String> results = new ArrayList<>();
53+
54+
if(args.length < 2) {
55+
for (SubCommand subCommand : this.subCommands) {
56+
results.add(subCommand.getName());
57+
}
58+
59+
if (results.isEmpty()) {
60+
return null;
61+
}
62+
63+
} else {
64+
SubCommand argument = this.getSubCommand(args[0]);
65+
66+
if (argument == null) {
67+
return results;
68+
}
69+
70+
results = argument.onTabComplete(sender, command, label, args);
71+
72+
if (results == null) {
73+
return null;
74+
}
75+
}
76+
77+
return this.getCompletions(args, results);
78+
}
79+
80+
public SubCommand getSubCommand(String name) {
81+
for (SubCommand subCommand : this.subCommands) {
82+
if (subCommand.getName().equalsIgnoreCase(name) || subCommand.getAliases().contains(name.toLowerCase())) {
83+
return subCommand;
84+
}
85+
}
86+
87+
return null;
88+
}
89+
90+
private List<String> getCompletions(String[] arguments, List<String> input) {
91+
Preconditions.checkNotNull(arguments);
92+
Preconditions.checkArgument(arguments.length != 0);
93+
String argument = arguments[arguments.length - 1];
94+
return input.stream().filter(string -> string.regionMatches(true, 0, argument, 0, argument.length())).limit(80).collect(Collectors.toList());
95+
}
96+
97+
public void addSubCommands(List<SubCommand> subCommands) {
98+
this.subCommands.addAll(subCommands);
99+
}
100+
101+
public void setBaseCommand(BaseCommand baseCommand) {
102+
this.baseCommand = baseCommand;
103+
}
104+
105+
@Override
106+
public String getName() {
107+
return this.name;
108+
}
109+
110+
@Override
111+
public String getDescription() {
112+
return this.description;
113+
}
114+
115+
@Override
116+
public void setDescription(String description) {
117+
this.description = description;
118+
}
119+
120+
@Override
121+
public List<String> getAliases() {
122+
return this.aliases;
123+
}
124+
125+
@Override
126+
public void setAliases(List<String> aliases) {
127+
this.aliases = aliases;
128+
}
129+
130+
@Override
131+
public String getPermission() {
132+
return this.permission;
133+
}
134+
135+
@Override
136+
public void setPermission(String permission) {
137+
this.permission = permission;
138+
}
139+
}
140+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package xyz.invisraidinq.queryapi.utils.command;
2+
3+
import org.bukkit.command.Command;
4+
import org.bukkit.command.CommandSender;
5+
6+
import java.util.List;
7+
8+
public abstract class BaseCommand {
9+
10+
public abstract boolean onCommand(CommandSender sender, Command command, String label, String[] args);
11+
12+
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
13+
return null;
14+
}
15+
16+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package xyz.invisraidinq.queryapi.utils.command;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.ChatColor;
5+
import org.bukkit.command.CommandMap;
6+
import org.bukkit.command.PluginCommand;
7+
import org.bukkit.plugin.Plugin;
8+
import org.bukkit.plugin.SimplePluginManager;
9+
import org.bukkit.plugin.java.JavaPlugin;
10+
11+
import java.lang.reflect.Constructor;
12+
import java.lang.reflect.Field;
13+
14+
public class CommandHandler {
15+
16+
private final JavaPlugin plugin;
17+
private String noPermissionMessage;
18+
19+
private CommandMap commandMap;
20+
21+
public CommandHandler(JavaPlugin plugin) {
22+
this.plugin = plugin;
23+
24+
try {
25+
Field field = SimplePluginManager.class.getDeclaredField("commandMap");
26+
field.setAccessible(true);
27+
28+
this. commandMap = (CommandMap) field.get(Bukkit.getPluginManager());
29+
} catch (Exception e) {
30+
e.printStackTrace();
31+
}
32+
33+
if (commandMap == null) {
34+
plugin.getLogger().warning("Failed to initialise the command register for " + plugin.getName());
35+
}
36+
}
37+
38+
public PluginCommand getCommand(String name, Plugin owner) {
39+
PluginCommand command = null;
40+
41+
try {
42+
Constructor<PluginCommand> constructor = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
43+
constructor.setAccessible(true);
44+
45+
command = constructor.newInstance(name, owner);
46+
} catch (Exception e) {
47+
e.printStackTrace();
48+
}
49+
50+
return command;
51+
}
52+
53+
public void registerAdvancedCommand(AdvancedCommand advancedCommand) {
54+
PluginCommand command = this.getCommand(advancedCommand.getName(), this.plugin);
55+
56+
command.setPermissionMessage(ChatColor.translateAlternateColorCodes('&', this.noPermissionMessage));
57+
58+
if (advancedCommand.getPermission() != null) {
59+
command.setPermission(advancedCommand.getPermission().toLowerCase());
60+
}
61+
62+
command.setDescription(advancedCommand.getDescription() != null ? advancedCommand.getDescription() : "This is the default description!");
63+
64+
command.setAliases(advancedCommand.getAliases());
65+
66+
command.setExecutor(advancedCommand);
67+
command.setTabCompleter(advancedCommand);
68+
69+
if (!this.commandMap.register(advancedCommand.getName(), command)) {
70+
command.unregister(this.commandMap);
71+
this.commandMap.register(advancedCommand.getName(), command);
72+
}
73+
}
74+
75+
public void registerSimpleCommand(SimpleCommand simpleCommand) {
76+
PluginCommand command = this.getCommand(simpleCommand.getName(), this.plugin);
77+
78+
command.setPermissionMessage(ChatColor.translateAlternateColorCodes('&', this.noPermissionMessage));
79+
80+
if (simpleCommand.getPermission() != null) {
81+
command.setPermission(simpleCommand.getPermission().toLowerCase());
82+
}
83+
84+
command.setDescription(simpleCommand.getDescription() != null ? simpleCommand.getDescription() : "This is the default description!");
85+
86+
command.setAliases(simpleCommand.getAliases());
87+
88+
command.setExecutor(simpleCommand);
89+
command.setTabCompleter(simpleCommand);
90+
91+
if (!this.commandMap.register(simpleCommand.getName(), command)) {
92+
command.unregister(this.commandMap);
93+
this.commandMap.register(simpleCommand.getName(), command);
94+
}
95+
}
96+
97+
public void setNoPermissionMessage(String noPermissionMessage) {
98+
this.noPermissionMessage = noPermissionMessage;
99+
}
100+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package xyz.invisraidinq.queryapi.utils.command;
2+
3+
import java.util.List;
4+
5+
public interface ICommand {
6+
7+
String getName();
8+
9+
String getDescription();
10+
void setDescription(String description);
11+
12+
List<String> getAliases();
13+
void setAliases(List<String> aliases);
14+
15+
String getPermission();
16+
void setPermission(String permission);
17+
18+
19+
}

0 commit comments

Comments
 (0)