diff --git a/pom.xml b/pom.xml index bb0a96a5e..345b8d48c 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ CoreProtect 23.1 - + development UTF-8 true 11 diff --git a/src/main/java/net/coreprotect/command/CommandParser.java b/src/main/java/net/coreprotect/command/CommandParser.java index 56e855df9..2b2697df2 100644 --- a/src/main/java/net/coreprotect/command/CommandParser.java +++ b/src/main/java/net/coreprotect/command/CommandParser.java @@ -315,9 +315,20 @@ protected static List parseUsers(String[] inputArguments) { return UserParser.parseUsers(inputArguments); } + /** + * Parse message filter from command arguments (m:, msg:, message:) + * + * @param inputArguments + * The command arguments + * @return The message filter string, or empty string if not present + */ + protected static String parseMessageFilter(String[] inputArguments) { + return ActionParser.parseMessageFilter(inputArguments); + } + /** * Helper method for formatting BigDecimal values - * + * * @param input * The BigDecimal value to format * @return The formatted string diff --git a/src/main/java/net/coreprotect/command/LookupCommand.java b/src/main/java/net/coreprotect/command/LookupCommand.java index 9d454bb85..6ed1db585 100755 --- a/src/main/java/net/coreprotect/command/LookupCommand.java +++ b/src/main/java/net/coreprotect/command/LookupCommand.java @@ -49,6 +49,7 @@ public static void runCommand(CommandSender player, Command command, boolean per boolean count = CommandParser.parseCount(args); boolean worldedit = CommandParser.parseWorldEdit(args); boolean forceglobal = CommandParser.parseForceGlobal(args); + String messageFilter = CommandParser.parseMessageFilter(args); boolean pageLookup = false; if (argBlocks == null || argExclude == null || argExcludeUsers == null) { @@ -249,6 +250,11 @@ else if (resultc > 1) { } } + if (messageFilter.length() > 0 && !argAction.contains(6) && !argAction.contains(7)) { + Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.INCOMPATIBLE_ACTION, "m:")); + return; + } + if (startTime <= 0 && !pageLookup && type == 4 && (argBlocks.size() > 0 || argUsers.size() > 0)) { Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.MISSING_LOOKUP_TIME, Selector.FIRST)); return; @@ -519,6 +525,9 @@ else if (type == 4 || type == 5) { argAction = ConfigHandler.lookupAlist.get(player.getName()); argRadius = ConfigHandler.lookupRadius.get(player.getName()); ts = ConfigHandler.lookupTime.get(player.getName()); + if (ConfigHandler.lookupMessageFilter.get(player.getName()) != null) { + messageFilter = ConfigHandler.lookupMessageFilter.get(player.getName()); + } startTime = 1; endTime = 0; } @@ -595,7 +604,7 @@ else if (lookupType == 5) { } } - Runnable runnable = new StandardLookupThread(player, command, rollbackusers, argBlocks, argExclude, argExcludeUsers, argAction, argRadius, lo, x, y, z, wid, argWid, timeStart, timeEnd, argNoisy, argExcluded, argRestricted, pa, re, type, ts, count); + Runnable runnable = new StandardLookupThread(player, command, rollbackusers, argBlocks, argExclude, argExcludeUsers, argAction, argRadius, lo, x, y, z, wid, argWid, timeStart, timeEnd, argNoisy, argExcluded, argRestricted, pa, re, type, ts, count, messageFilter); Thread thread = new Thread(runnable); thread.start(); } diff --git a/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java b/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java index f6540ff07..b05908ac2 100644 --- a/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java +++ b/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java @@ -61,8 +61,13 @@ public class StandardLookupThread implements Runnable { private final int typeLookup; private final String rtime; private final boolean count; + private final String messageFilter; public StandardLookupThread(CommandSender player, Command command, List rollbackUsers, List blockList, Map excludedBlocks, List excludedUsers, List actions, Integer[] radius, Location location, int x, int y, int z, int worldId, int argWorldId, long timeStart, long timeEnd, int noisy, int excluded, int restricted, int page, int displayResults, int typeLookup, String rtime, boolean count) { + this(player, command, rollbackUsers, blockList, excludedBlocks, excludedUsers, actions, radius, location, x, y, z, worldId, argWorldId, timeStart, timeEnd, noisy, excluded, restricted, page, displayResults, typeLookup, rtime, count, ""); + } + + public StandardLookupThread(CommandSender player, Command command, List rollbackUsers, List blockList, Map excludedBlocks, List excludedUsers, List actions, Integer[] radius, Location location, int x, int y, int z, int worldId, int argWorldId, long timeStart, long timeEnd, int noisy, int excluded, int restricted, int page, int displayResults, int typeLookup, String rtime, boolean count, String messageFilter) { this.player = player; this.command = command; this.rollbackUsers = rollbackUsers; @@ -87,6 +92,7 @@ public StandardLookupThread(CommandSender player, Command command, List this.typeLookup = typeLookup; this.rtime = rtime; this.count = count; + this.messageFilter = messageFilter; } @Override @@ -101,6 +107,7 @@ public void run() { ConfigHandler.lookupCommand.put(player.getName(), bc); ConfigHandler.lookupPage.put(player.getName(), page); ConfigHandler.lookupTime.put(player.getName(), rtime); + ConfigHandler.lookupMessageFilter.put(player.getName(), messageFilter); ConfigHandler.lookupType.put(player.getName(), 5); ConfigHandler.lookupElist.put(player.getName(), excludedBlocks); ConfigHandler.lookupEUserlist.put(player.getName(), excludedUsers); @@ -184,7 +191,7 @@ else if (finalLocation != null) { } if (checkRows) { - rows = Lookup.countLookupRows(statement, player, uuidList, userList, blockList, excludedBlocks, excludedUsers, actions, finalLocation, radius, rowData, timeStart, timeEnd, restrict_world, true); + rows = Lookup.countLookupRows(statement, player, uuidList, userList, blockList, excludedBlocks, excludedUsers, actions, finalLocation, radius, rowData, timeStart, timeEnd, restrict_world, true, messageFilter); rowData[3] = rows; ConfigHandler.lookupRows.put(player.getName(), rowData); } @@ -193,7 +200,7 @@ else if (finalLocation != null) { Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.LOOKUP_ROWS_FOUND, row_format, (rows == 1 ? Selector.FIRST : Selector.SECOND))); } else if (pageStart < rows) { - List lookupList = Lookup.performPartialLookup(statement, player, uuidList, userList, blockList, excludedBlocks, excludedUsers, actions, finalLocation, radius, rowData, timeStart, timeEnd, (int) pageStart, displayResults, restrict_world, true); + List lookupList = Lookup.performPartialLookup(statement, player, uuidList, userList, blockList, excludedBlocks, excludedUsers, actions, finalLocation, radius, rowData, timeStart, timeEnd, (int) pageStart, displayResults, restrict_world, true, messageFilter); Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_HEADER, "CoreProtect" + Color.WHITE + " | " + Color.DARK_AQUA) + Color.WHITE + " -----"); if (actions.contains(6) || actions.contains(7)) { // Chat/command diff --git a/src/main/java/net/coreprotect/command/parser/ActionParser.java b/src/main/java/net/coreprotect/command/parser/ActionParser.java index 7b52ffe05..5de111702 100644 --- a/src/main/java/net/coreprotect/command/parser/ActionParser.java +++ b/src/main/java/net/coreprotect/command/parser/ActionParser.java @@ -199,9 +199,38 @@ else if (argument.equals("#silent")) { return noisy; } + /** + * Parse message filter from command arguments (m:, msg:, message:) + * + * @param inputArguments + * The command arguments + * @return The message filter string, or empty string if not present + */ + public static String parseMessageFilter(String[] inputArguments) { + String[] argumentArray = inputArguments.clone(); + String result = ""; + int count = 0; + for (String argument : argumentArray) { + if (count > 0) { + argument = argument.trim(); + String lower = argument.toLowerCase(Locale.ROOT); + if (lower.startsWith("message:") || lower.startsWith("msg:") || lower.startsWith("m:")) { + String filter = argument.replaceAll("(?i)^message:", "").replaceAll("(?i)^msg:", "").replaceAll("(?i)^m:", ""); + filter = filter.replaceAll("\\\\", ""); + filter = filter.replaceAll("'", ""); + if (filter.length() > 0) { + result = filter; + } + } + } + count++; + } + return result; + } + /** * Parse preview flag from command arguments - * + * * @param inputArguments * The command arguments * @return 1 for preview, 2 for preview cancel, 0 otherwise diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java index 0275d0d61..a35d93fc2 100644 --- a/src/main/java/net/coreprotect/config/ConfigHandler.java +++ b/src/main/java/net/coreprotect/config/ConfigHandler.java @@ -130,6 +130,7 @@ private static Map syncMap() { public static Map> lookupAlist = syncMap(); public static Map lookupRadius = syncMap(); public static Map lookupTime = syncMap(); + public static Map lookupMessageFilter = syncMap(); public static Map lookupRows = syncMap(); public static Map uuidCache = syncMap(); public static Map uuidCacheReversed = syncMap(); diff --git a/src/main/java/net/coreprotect/database/Lookup.java b/src/main/java/net/coreprotect/database/Lookup.java index 800dbca4e..25769a5dc 100755 --- a/src/main/java/net/coreprotect/database/Lookup.java +++ b/src/main/java/net/coreprotect/database/Lookup.java @@ -17,6 +17,10 @@ public class Lookup extends Queue { public static long countLookupRows(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, boolean restrictWorld, boolean lookup) { + return countLookupRows(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, restrictWorld, lookup, ""); + } + + public static long countLookupRows(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, boolean restrictWorld, boolean lookup, String messageFilter) { Long rows = 0L; try { @@ -25,7 +29,7 @@ public static long countLookupRows(Statement statement, CommandSender user, List } Consumer.isPaused = true; - ResultSet results = LookupRaw.rawLookupResultSet(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, null, startTime, endTime, -1, -1, restrictWorld, lookup, true); + ResultSet results = LookupRaw.rawLookupResultSet(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, null, startTime, endTime, -1, -1, restrictWorld, lookup, messageFilter, true); while (results.next()) { int resultTable = results.getInt("tbl"); long count = results.getLong("count"); @@ -58,10 +62,14 @@ public static List performLookup(Statement statement, CommandSender us } public static List performPartialLookup(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, int limitOffset, int limitCount, boolean restrictWorld, boolean lookup) { + return performPartialLookup(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, limitOffset, limitCount, restrictWorld, lookup, ""); + } + + public static List performPartialLookup(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, int limitOffset, int limitCount, boolean restrictWorld, boolean lookup, String messageFilter) { List newList = new ArrayList<>(); try { - List lookupList = LookupRaw.performLookupRaw(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, limitOffset, limitCount, restrictWorld, lookup); + List lookupList = LookupRaw.performLookupRaw(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, limitOffset, limitCount, restrictWorld, lookup, messageFilter); newList = LookupConverter.convertRawLookup(statement, lookupList); } catch (Exception e) { diff --git a/src/main/java/net/coreprotect/database/LookupRaw.java b/src/main/java/net/coreprotect/database/LookupRaw.java index cda6d9a3a..b4a0703a7 100644 --- a/src/main/java/net/coreprotect/database/LookupRaw.java +++ b/src/main/java/net/coreprotect/database/LookupRaw.java @@ -28,6 +28,10 @@ public class LookupRaw extends Queue { protected static List performLookupRaw(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, int limitOffset, int limitCount, boolean restrictWorld, boolean lookup) { + return performLookupRaw(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, limitOffset, limitCount, restrictWorld, lookup, ""); + } + + protected static List performLookupRaw(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, int limitOffset, int limitCount, boolean restrictWorld, boolean lookup, String messageFilter) { List list = new ArrayList<>(); List invalidRollbackActions = new ArrayList<>(); invalidRollbackActions.add(2); @@ -47,7 +51,7 @@ protected static List performLookupRaw(Statement statement, CommandSen Consumer.isPaused = true; - ResultSet results = rawLookupResultSet(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, limitOffset, limitCount, restrictWorld, lookup, false); + ResultSet results = rawLookupResultSet(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, limitOffset, limitCount, restrictWorld, lookup, messageFilter, false); while (results.next()) { if (actionList.contains(6) || actionList.contains(7)) { @@ -220,6 +224,10 @@ else if (actionList.contains(10)) { } static ResultSet rawLookupResultSet(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, int limitOffset, int limitCount, boolean restrictWorld, boolean lookup, boolean count) { + return rawLookupResultSet(statement, user, checkUuids, checkUsers, restrictList, excludeList, excludeUserList, actionList, location, radius, rowData, startTime, endTime, limitOffset, limitCount, restrictWorld, lookup, "", count); + } + + static ResultSet rawLookupResultSet(Statement statement, CommandSender user, List checkUuids, List checkUsers, List restrictList, Map excludeList, List excludeUserList, List actionList, Location location, Integer[] radius, Long[] rowData, long startTime, long endTime, int limitOffset, int limitCount, boolean restrictWorld, boolean lookup, String messageFilter, boolean count) { ResultSet results = null; try { @@ -519,6 +527,10 @@ else if (inventoryQuery || actionExclude.length() > 0 || includeBlock.length() > queryBlock = queryBlock + " action = '1' AND (LENGTH(line_1) > 0 OR LENGTH(line_2) > 0 OR LENGTH(line_3) > 0 OR LENGTH(line_4) > 0 OR LENGTH(line_5) > 0 OR LENGTH(line_6) > 0 OR LENGTH(line_7) > 0 OR LENGTH(line_8) > 0) AND"; } + if (messageFilter != null && messageFilter.length() > 0 && (actionList.contains(6) || actionList.contains(7))) { + queryBlock = queryBlock + " message LIKE '%" + messageFilter + "%' AND"; + } + if (queryBlock.length() > 0) { queryBlock = queryBlock.substring(0, queryBlock.length() - 4); }