extras/src/main/java/pw/kaboom/extras/modules/server/ServerCommand.java

141 lines
4 KiB
Java
Raw Normal View History

2019-12-17 12:37:59 +00:00
package pw.kaboom.extras.modules.server;
2019-07-30 17:14:24 +00:00
2020-02-26 22:42:17 +00:00
import org.bukkit.block.CommandBlock;
2019-08-02 21:19:56 +00:00
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.Command;
2019-12-14 18:47:26 +00:00
import org.bukkit.command.CommandSender;
2019-07-30 17:14:24 +00:00
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.server.ServerCommandEvent;
2019-12-21 14:12:26 +00:00
public final class ServerCommand implements Listener {
public static String checkCommand(final CommandSender sender, final String command, final boolean isConsoleCommand) {
2019-12-14 18:47:26 +00:00
final String[] arr = command.split(" ");
String commandName = arr[0].toLowerCase();
2019-12-17 18:23:24 +00:00
2019-12-14 18:47:26 +00:00
if (isConsoleCommand) {
commandName = "/" + arr[0].toLowerCase();
2019-09-21 23:46:15 +00:00
}
2019-12-17 18:23:24 +00:00
2019-12-15 17:26:25 +00:00
try {
switch (commandName) {
case "/minecraft:execute":
case "/execute":
if (arr.length >= 2) {
int asAtCount = 0;
2019-12-17 18:23:24 +00:00
2019-12-15 17:26:25 +00:00
for (int i = 1; i < arr.length; i++) {
if ("run".equalsIgnoreCase(arr[i])) {
2019-12-21 14:12:26 +00:00
if (i + 1 < arr.length) {
if ("execute".equalsIgnoreCase(arr[i + 1])
2020-01-04 21:17:55 +00:00
|| "clone".equalsIgnoreCase(arr[i + 1])
|| "fill".equalsIgnoreCase(arr[i + 1])
2019-12-21 14:12:26 +00:00
|| "particle".equalsIgnoreCase(arr[i + 1])
2020-01-05 20:11:57 +00:00
|| "say".equalsIgnoreCase(arr[i + 1])
2019-12-21 14:12:26 +00:00
|| "spreadplayers".equalsIgnoreCase(arr[i + 1])
2020-01-05 20:11:57 +00:00
|| "stop".equalsIgnoreCase(arr[i + 1])
|| "tellraw".equalsIgnoreCase(arr[i + 1])) {
2019-12-15 17:26:25 +00:00
Command.broadcastCommandMessage(sender, "Forbidden execute command detected");
return "cancel";
2019-12-21 14:12:26 +00:00
} else if (i + 3 < arr.length
&& "gamerule".equalsIgnoreCase(arr[i + 1])) {
if ("randomTickSpeed".equalsIgnoreCase(arr[i + 2])
&& Double.parseDouble(arr[i + 3]) > 6) {
return command.replaceFirst("(?i)" + "randomTickSpeed " + arr[i + 3], "randomTickSpeed 6");
2019-12-14 18:47:26 +00:00
}
2019-12-21 14:12:26 +00:00
} else if ("give".equalsIgnoreCase(arr[i + 1])) {
if (Double.parseDouble(arr[arr.length - 1]) > 64) {
arr[arr.length - 1] = "64";
2019-12-15 17:26:25 +00:00
return String.join(" ", arr);
2019-12-14 18:47:26 +00:00
}
}
}
2019-12-15 17:26:25 +00:00
break;
}
2019-12-17 18:23:24 +00:00
2019-12-21 14:12:26 +00:00
if ("as".equalsIgnoreCase(arr[i])
|| "at".equalsIgnoreCase(arr[i])) {
2019-12-15 17:26:25 +00:00
asAtCount++;
2019-12-14 18:47:26 +00:00
}
2019-09-21 23:46:15 +00:00
}
2019-12-17 18:23:24 +00:00
2019-12-15 17:26:25 +00:00
if (asAtCount >= 2) {
Command.broadcastCommandMessage(sender, "Forbidden execute pattern detected");
return "cancel";
2019-12-14 18:47:26 +00:00
}
2019-09-21 23:46:15 +00:00
}
2019-12-15 17:26:25 +00:00
break;
case "/minecraft:gamerule":
case "/gamerule":
if (arr.length >= 3) {
2019-12-21 14:12:26 +00:00
if ("randomTickSpeed".equalsIgnoreCase(arr[1])
&& Double.parseDouble(arr[2]) > 6) {
2019-12-15 17:26:25 +00:00
return command.replaceFirst(arr[2], "6");
}
}
break;
case "/minecraft:give":
case "/give":
2019-12-21 14:12:26 +00:00
if (Double.parseDouble(arr[arr.length - 1]) > 64) {
arr[arr.length - 1] = "64";
2019-12-15 17:26:25 +00:00
return String.join(" ", arr);
}
break;
case "/minecraft:particle":
case "/particle":
2019-12-21 14:12:26 +00:00
if (arr.length >= 10
&& Double.parseDouble(arr[9]) > 10) {
2019-12-15 17:26:25 +00:00
arr[9] = "10";
return String.join(" ", arr);
}
break;
case "/minecraft:spreadplayers":
case "/spreadplayers":
if (arr.length >= 5) {
2019-12-21 14:12:26 +00:00
if (Double.parseDouble(arr[3]) > 0) {
2019-12-15 17:26:25 +00:00
arr[3] = "0";
2019-12-21 14:12:26 +00:00
}
if (Double.parseDouble(arr[4]) < 8) {
2019-12-15 17:26:25 +00:00
arr[4] = "8";
2019-12-21 14:12:26 +00:00
}
if (Double.parseDouble(arr[4]) > 50) {
2019-12-15 17:26:25 +00:00
arr[4] = "50";
2019-12-21 14:12:26 +00:00
}
2019-12-15 17:26:25 +00:00
return String.join(" ", arr);
2019-12-14 18:47:26 +00:00
}
2019-12-15 17:26:25 +00:00
break;
2019-12-21 14:12:26 +00:00
default:
break;
2019-12-15 17:26:25 +00:00
}
} catch (NumberFormatException exception) {
// Do nothing
2019-12-14 18:47:26 +00:00
}
return null;
}
2019-07-30 17:14:24 +00:00
2019-12-14 18:47:26 +00:00
@EventHandler
2019-12-21 14:12:26 +00:00
void onServerCommand(final ServerCommandEvent event) {
2019-12-14 18:47:26 +00:00
final CommandSender sender = event.getSender();
if (sender instanceof BlockCommandSender) {
2020-02-26 22:42:17 +00:00
final CommandBlock commandBlock = (CommandBlock) ((BlockCommandSender) sender).getBlock().getState();
2020-02-27 15:08:10 +00:00
2020-02-26 22:42:17 +00:00
commandBlock.setCommand("");
commandBlock.update();
2019-12-14 18:47:26 +00:00
}
final String command = event.getCommand();
final boolean isConsoleCommand = true;
final String checkedCommand = checkCommand(sender, command, isConsoleCommand);
2019-12-17 18:23:24 +00:00
2019-12-14 20:33:55 +00:00
if (checkedCommand != null) {
2020-02-14 21:44:00 +00:00
if ("cancel".equals(checkedCommand)) {
2019-12-14 20:33:55 +00:00
event.setCancelled(true);
} else {
event.setCommand(checkedCommand);
}
2019-07-30 17:14:24 +00:00
}
}
}