mirror of
https://github.com/plexusorg/Plex.git
synced 2024-12-23 09:37:37 +00:00
merge master branch and add ayunami's delimiter code, with of course, credit to him added in the code, and fix a bug
This commit is contained in:
parent
09bc47f3fb
commit
9f7ac310d9
@ -1,22 +0,0 @@
|
|||||||
package dev.plex.command.blocker;
|
|
||||||
|
|
||||||
import dev.plex.rank.enums.Rank;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
public class BaseCommand
|
|
||||||
{
|
|
||||||
private final Rank rank;
|
|
||||||
private final String message;
|
|
||||||
|
|
||||||
public BaseCommand(Rank r, String m)
|
|
||||||
{
|
|
||||||
rank = r;
|
|
||||||
message = m;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
return "BaseCommand (Rank: " + (rank == null ? "ALL" : rank.name()) + ", Message: " + message + ")";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,122 +0,0 @@
|
|||||||
package dev.plex.command.blocker;
|
|
||||||
|
|
||||||
import dev.plex.PlexBase;
|
|
||||||
import dev.plex.rank.enums.Rank;
|
|
||||||
import dev.plex.util.PlexLog;
|
|
||||||
import dev.plex.util.PlexUtils;
|
|
||||||
import lombok.Getter;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.command.*;
|
|
||||||
import org.bukkit.plugin.Plugin;
|
|
||||||
import org.bukkit.plugin.SimplePluginManager;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
public class CommandBlockerManager extends PlexBase
|
|
||||||
{
|
|
||||||
private Set<BaseCommand> blockedCommands = new HashSet<>();
|
|
||||||
|
|
||||||
public boolean loadedYet;
|
|
||||||
|
|
||||||
private static CommandMap getCommandMap()
|
|
||||||
{
|
|
||||||
return plugin.getServer().getCommandMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void syncCommands()
|
|
||||||
{
|
|
||||||
loadedYet = false;
|
|
||||||
blockedCommands.clear();
|
|
||||||
|
|
||||||
CommandMap commandMap = getCommandMap();
|
|
||||||
|
|
||||||
List<String> raw = plugin.blockedCommands.getStringList("blockedCommands");
|
|
||||||
|
|
||||||
for (String cmd : raw)
|
|
||||||
{
|
|
||||||
int lastDelim = cmd.lastIndexOf(':');
|
|
||||||
|
|
||||||
String cmdWithoutMsg = cmd.substring(0, lastDelim);
|
|
||||||
String[] rawPieces = cmdWithoutMsg.split(":", 3);
|
|
||||||
|
|
||||||
String rawType = rawPieces[0].toLowerCase();
|
|
||||||
String rawRank = rawPieces[1].toLowerCase();
|
|
||||||
String regexOrMatch = rawPieces[2];
|
|
||||||
String message = cmd.substring(lastDelim + 1);
|
|
||||||
|
|
||||||
if (message.equals("_"))
|
|
||||||
{
|
|
||||||
message = PlexUtils.messageString("commandBlocked");
|
|
||||||
}
|
|
||||||
|
|
||||||
Rank rank = switch (rawRank)
|
|
||||||
{
|
|
||||||
case "e" -> null;
|
|
||||||
case "a" -> Rank.ADMIN;
|
|
||||||
case "s" -> Rank.SENIOR_ADMIN;
|
|
||||||
default -> null;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (rawType.equals("r"))
|
|
||||||
{
|
|
||||||
blockedCommands.add(new RegexCommand(Pattern.compile(regexOrMatch, Pattern.CASE_INSENSITIVE), rank, message));
|
|
||||||
}
|
|
||||||
else if (rawType.equals("m"))
|
|
||||||
{
|
|
||||||
int ind = regexOrMatch.indexOf(' ');
|
|
||||||
if (ind == -1 && regexOrMatch.endsWith(":"))
|
|
||||||
{
|
|
||||||
String pluginName = regexOrMatch.substring(0, regexOrMatch.length() - 1);
|
|
||||||
Plugin plugin = Arrays.stream(Bukkit.getServer().getPluginManager().getPlugins()).filter(pl -> pl.getName().equalsIgnoreCase(pluginName)).findAny().orElse(null);
|
|
||||||
if (plugin != null)
|
|
||||||
{
|
|
||||||
List<Command> commandList = PluginCommandYamlParser.parse(plugin);
|
|
||||||
for (Command command : commandList)
|
|
||||||
{
|
|
||||||
blockedCommands.add(new MatchCommand(command.getName(), rank, message));
|
|
||||||
blockedCommands.add(new MatchCommand(pluginName + ":" + command.getName(), rank, message));
|
|
||||||
for (String alias : command.getAliases())
|
|
||||||
{
|
|
||||||
blockedCommands.add(new MatchCommand(alias, rank, message));
|
|
||||||
blockedCommands.add(new MatchCommand(pluginName + ":" + alias, rank, message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String blockedArgs = ind == -1 ? "" : regexOrMatch.substring(ind + 1);
|
|
||||||
if (!blockedArgs.isEmpty())
|
|
||||||
{
|
|
||||||
blockedArgs = " " + blockedArgs; // necessary in case no args
|
|
||||||
}
|
|
||||||
String cmdForSearch = ind == -1 ? regexOrMatch : regexOrMatch.substring(0, ind);
|
|
||||||
PluginCommand pluginCommand = Bukkit.getServer().getPluginCommand(cmdForSearch);
|
|
||||||
Plugin plugin = null;
|
|
||||||
if (pluginCommand != null) plugin = pluginCommand.getPlugin();
|
|
||||||
Command command = null;
|
|
||||||
if (commandMap != null) command = commandMap.getCommand(cmdForSearch);
|
|
||||||
if (command != null)
|
|
||||||
{
|
|
||||||
String pluginName = plugin == null ? null : plugin.getName();
|
|
||||||
blockedCommands.add(new MatchCommand(command.getName() + blockedArgs, rank, message));
|
|
||||||
if (pluginName != null) blockedCommands.add(new MatchCommand(pluginName + ":" + command.getName() + blockedArgs, rank, message));
|
|
||||||
List<String> aliases = command.getAliases();
|
|
||||||
for (String alias : aliases)
|
|
||||||
{
|
|
||||||
blockedCommands.add(new MatchCommand(alias + blockedArgs, rank, message));
|
|
||||||
if (pluginName != null) blockedCommands.add(new MatchCommand(pluginName + ":" + alias + blockedArgs, rank, message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// fallback to basic blocking
|
|
||||||
blockedCommands.add(new MatchCommand(cmdForSearch + blockedArgs, rank, message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
loadedYet = true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package dev.plex.command.blocker;
|
|
||||||
|
|
||||||
import dev.plex.rank.enums.Rank;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
public class MatchCommand extends BaseCommand
|
|
||||||
{
|
|
||||||
private final String match;
|
|
||||||
|
|
||||||
public MatchCommand(String r1, Rank r2, String m1)
|
|
||||||
{
|
|
||||||
super(r2, m1);
|
|
||||||
match = r1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
return "MatchCommand (Rank: " + (getRank() == null ? "ALL" : getRank().name()) + ", Match: " + match + ", Message: " + getMessage() + ")";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
package dev.plex.command.blocker;
|
|
||||||
|
|
||||||
import dev.plex.rank.enums.Rank;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
public class RegexCommand extends BaseCommand
|
|
||||||
{
|
|
||||||
private final Pattern regex;
|
|
||||||
|
|
||||||
public RegexCommand(Pattern r1, Rank r2, String m1)
|
|
||||||
{
|
|
||||||
super(r2, m1);
|
|
||||||
regex = r1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
return "RegexCommand (Rank: " + (getRank() == null ? "ALL" : getRank().name()) + ", Regex: " + regex.toString() + ", Message: " + getMessage() + ")";
|
|
||||||
}
|
|
||||||
}
|
|
@ -51,8 +51,8 @@ public class PlexCMD extends PlexCommand
|
|||||||
plugin.indefBans.load(false);
|
plugin.indefBans.load(false);
|
||||||
plugin.getPunishmentManager().mergeIndefiniteBans();
|
plugin.getPunishmentManager().mergeIndefiniteBans();
|
||||||
send(sender, "Reloaded indefinite bans");
|
send(sender, "Reloaded indefinite bans");
|
||||||
plugin.blockedCommands.load();
|
plugin.commands.load();
|
||||||
plugin.getCommandBlockerManager().syncCommands();
|
// plugin.getCommandBlockerManager().syncCommands();
|
||||||
send(sender, "Reloaded blocked commands file");
|
send(sender, "Reloaded blocked commands file");
|
||||||
plugin.getRankManager().importDefaultRanks();
|
plugin.getRankManager().importDefaultRanks();
|
||||||
send(sender, "Imported ranks");
|
send(sender, "Imported ranks");
|
||||||
|
@ -48,7 +48,8 @@ public class CommandListener extends PlexListener
|
|||||||
String arguments = StringUtils.normalizeSpace(event.getMessage().replace(event.getMessage().split(" ")[0], ""));
|
String arguments = StringUtils.normalizeSpace(event.getMessage().replace(event.getMessage().split(" ")[0], ""));
|
||||||
PlexLog.debug("Checking Command: {0} with args {1}", commandName, arguments);
|
PlexLog.debug("Checking Command: {0} with args {1}", commandName, arguments);
|
||||||
AtomicReference<BlockedCommand> cmdRef = new AtomicReference<>();
|
AtomicReference<BlockedCommand> cmdRef = new AtomicReference<>();
|
||||||
CommandBlockerService.getBLOCKED_COMMANDS().stream().filter(blockedCommand -> blockedCommand.getCommand() != null).findFirst().ifPresent(blockedCommand ->
|
PlexLog.debug("Blocked Commands List: " + CommandBlockerService.getBLOCKED_COMMANDS().size());
|
||||||
|
CommandBlockerService.getBLOCKED_COMMANDS().stream().filter(blockedCommand -> blockedCommand.getCommand() != null).forEach(blockedCommand ->
|
||||||
{
|
{
|
||||||
if (event.getMessage().replace("/", "").toLowerCase(Locale.ROOT).startsWith(blockedCommand.getCommand().toLowerCase(Locale.ROOT)))
|
if (event.getMessage().replace("/", "").toLowerCase(Locale.ROOT).startsWith(blockedCommand.getCommand().toLowerCase(Locale.ROOT)))
|
||||||
{
|
{
|
||||||
|
@ -27,14 +27,18 @@ public class CommandBlockerService extends AbstractService
|
|||||||
{
|
{
|
||||||
BLOCKED_COMMANDS.clear();
|
BLOCKED_COMMANDS.clear();
|
||||||
PlexLog.debug("RUNNING COMMAND BLOCKING SERVICE");
|
PlexLog.debug("RUNNING COMMAND BLOCKING SERVICE");
|
||||||
plugin.commands.getStringList("commands").forEach(s -> {
|
plugin.commands.getStringList("commands").forEach(s ->
|
||||||
|
{
|
||||||
BlockedCommand command = new BlockedCommand();
|
BlockedCommand command = new BlockedCommand();
|
||||||
String[] args = s.split(";");
|
int lastDelim = s.lastIndexOf(':');
|
||||||
|
|
||||||
|
String cmdWithoutMsg = s.substring(0, lastDelim);
|
||||||
|
String[] args = cmdWithoutMsg.split(":", 3); // Delimiter code by ayunami
|
||||||
if (s.toLowerCase(Locale.ROOT).startsWith("r"))
|
if (s.toLowerCase(Locale.ROOT).startsWith("r"))
|
||||||
{
|
{
|
||||||
command.setRequiredLevel(args[1]);
|
command.setRequiredLevel(args[1]);
|
||||||
command.setRegex(args[2]);
|
command.setRegex(args[2]);
|
||||||
command.setMessage(StringUtils.join(args, ";", 3, args.length));
|
command.setMessage(s.substring(lastDelim + 1));
|
||||||
PlexLog.debug("=Found regex blocked=");
|
PlexLog.debug("=Found regex blocked=");
|
||||||
PlexLog.debug(" Regex: " + command.getRegex());
|
PlexLog.debug(" Regex: " + command.getRegex());
|
||||||
PlexLog.debug(" Message: " + command.getMessage());
|
PlexLog.debug(" Message: " + command.getMessage());
|
||||||
@ -43,7 +47,7 @@ public class CommandBlockerService extends AbstractService
|
|||||||
{
|
{
|
||||||
command.setRequiredLevel(args[1]);
|
command.setRequiredLevel(args[1]);
|
||||||
command.setCommand(args[2]);
|
command.setCommand(args[2]);
|
||||||
command.setMessage(StringUtils.join(args, ";", 3, args.length));
|
command.setMessage(s.substring(lastDelim + 1));
|
||||||
Command cmd = plugin.getServer().getCommandMap().getCommand(command.getCommand().split(" ")[0]);
|
Command cmd = plugin.getServer().getCommandMap().getCommand(command.getCommand().split(" ")[0]);
|
||||||
if (cmd == null)
|
if (cmd == null)
|
||||||
{
|
{
|
||||||
@ -59,6 +63,10 @@ public class CommandBlockerService extends AbstractService
|
|||||||
PlexLog.debug(" Aliases: " + Arrays.toString(command.getCommandAliases().toArray(new String[0])));
|
PlexLog.debug(" Aliases: " + Arrays.toString(command.getCommandAliases().toArray(new String[0])));
|
||||||
PlexLog.debug("====================");
|
PlexLog.debug("====================");
|
||||||
}
|
}
|
||||||
|
if (command.getMessage().equalsIgnoreCase("_"))
|
||||||
|
{
|
||||||
|
command.setMessage("This command is blocked.");
|
||||||
|
}
|
||||||
BLOCKED_COMMANDS.add(command);
|
BLOCKED_COMMANDS.add(command);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,25 @@
|
|||||||
# Plex Command Blocking File
|
#
|
||||||
# For documentation, please visit: https://plex.us.org
|
# Command Blocker
|
||||||
|
#
|
||||||
# Format:
|
# Format:
|
||||||
# - "<regex or match>:<rank>:command name no slash:Block message"
|
# - "<regex or match>:<rank>:command name no slash:Block message"
|
||||||
#
|
#
|
||||||
# Symbols to use:
|
# Symbols to use:
|
||||||
# - r for RegEx
|
# - r for RegEx
|
||||||
# - m for matching
|
# - m for matching
|
||||||
# - The ranks are "e" for everyone, "a" for admin and "s" for senior admin
|
# - The ranks are "e" for everyone, "s" for senior admin, and "a" for admin
|
||||||
# - The command is just the command without slashes. Optional arguments are specified as well
|
# - MATCHING MODE: The command is just the command without slashes. Optional arguments are specified as well. It also accepts full plugins via specifying the plugin name followed by a ":" (e.g. "viaversion:")
|
||||||
|
# - REGEX MODE: The command is regex that matches the desired command. It matches case insensitively.
|
||||||
# - Finally the block message. MUST NOT CONTAIN ":". Use _ to use the default command blocked message as specified in messages.yml, or you can optionally put your own in
|
# - Finally the block message. MUST NOT CONTAIN ":". Use _ to use the default command blocked message as specified in messages.yml, or you can optionally put your own in
|
||||||
#
|
#
|
||||||
# So these would be valid:
|
# So these would be valid:
|
||||||
# - "m:e:mail sendall:You cannot send messages to everyone on the server"
|
# - "m:e:mail sendall:You cannot send messages to everyone on the server"
|
||||||
# - "r:e:(.*:):Plugin specific commands are disabled"
|
# - "r:e:^[^ :]+::Plugin specific commands are disabled"
|
||||||
|
commands:
|
||||||
|
# Plugin specific commands (might not be necessary anymore!!)
|
||||||
|
|
||||||
commands: # Regexes and commands can't contain ';'. Don't try, commands can't contain ';' by default.
|
- "r:e:^[^ :]+::Plugin specific commands are disabled."
|
||||||
- "r;(^\w+:);"Plugin specific commands are disabled
|
# Disabled commands
|
||||||
- 'm;e;mail sendall;You cannot send messages to everyone on the server'
|
|
||||||
|
- "m:e:time:Server-side time changing is disabled. Please use /ptime to set your own personal time."
|
||||||
|
- "m:e:pardon:_"
|
||||||
|
Loading…
Reference in New Issue
Block a user