From cd2dbc081395ec39bda43ca56741bf1e2ac44ccb Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Wed, 1 Aug 2018 00:28:13 +0200 Subject: [PATCH] Integrate Questioner into Logblock You do not need the extra plugin any more. If you want no questions asked, just disable it in the config. --- LogBlockQuestioner.jar | Bin 5575 -> 0 bytes pom.xml | 7 -- .../de/diddiz/LogBlock/CommandsHandler.java | 15 ++-- .../java/de/diddiz/LogBlock/LogBlock.java | 7 ++ .../diddiz/LogBlock/questioner/Question.java | 73 +++++++++++++++++ .../LogBlock/questioner/Questioner.java | 75 ++++++++++++++++++ 6 files changed, 161 insertions(+), 16 deletions(-) delete mode 100644 LogBlockQuestioner.jar create mode 100644 src/main/java/de/diddiz/LogBlock/questioner/Question.java create mode 100644 src/main/java/de/diddiz/LogBlock/questioner/Questioner.java diff --git a/LogBlockQuestioner.jar b/LogBlockQuestioner.jar deleted file mode 100644 index aa16a489761db39aeb3caf470aaf7decfb4761ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5575 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 nY?TtaPmrS1.13-R0.1-SNAPSHOT provided - - ${project.groupId} - questioner - ${project.version} - system - ${project.basedir}/LogBlockQuestioner.jar - com.sk89q.worldedit worldedit-core diff --git a/src/main/java/de/diddiz/LogBlock/CommandsHandler.java b/src/main/java/de/diddiz/LogBlock/CommandsHandler.java index 9ffc124..fa37d8b 100755 --- a/src/main/java/de/diddiz/LogBlock/CommandsHandler.java +++ b/src/main/java/de/diddiz/LogBlock/CommandsHandler.java @@ -5,7 +5,6 @@ import de.diddiz.LogBlock.QueryParams.Order; import de.diddiz.LogBlock.QueryParams.SummarizationMode; import de.diddiz.LogBlock.config.Config; import de.diddiz.LogBlock.config.WorldConfig; -import de.diddiz.LogBlockQuestioner.LogBlockQuestioner; import de.diddiz.util.Utils; import org.bukkit.ChatColor; @@ -40,12 +39,10 @@ import static de.diddiz.util.Utils.listing; public class CommandsHandler implements CommandExecutor { private final LogBlock logblock; private final BukkitScheduler scheduler; - private final LogBlockQuestioner questioner; CommandsHandler(LogBlock logblock) { this.logblock = logblock; scheduler = logblock.getServer().getScheduler(); - questioner = (LogBlockQuestioner) logblock.getServer().getPluginManager().getPlugin("LogBlockQuestioner"); } @Override @@ -691,16 +688,16 @@ public class CommandsHandler implements CommandExecutor { } return; } - if (!params.silent && askRollbacks && questioner != null && sender instanceof Player && !questioner.ask((Player) sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { + if (!params.silent && askRollbacks && sender instanceof Player && !logblock.getQuestioner().ask((Player) sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { sender.sendMessage(ChatColor.RED + "Rollback aborted"); return; } editor.start(); getSession(sender).lookupCache = editor.errors; sender.sendMessage(ChatColor.GREEN + "Rollback finished successfully (" + editor.getElapsedTime() + " ms, " + editor.getSuccesses() + "/" + changes + " blocks" + (editor.getErrors() > 0 ? ", " + ChatColor.RED + editor.getErrors() + " errors" + ChatColor.GREEN : "") + (editor.getBlacklistCollisions() > 0 ? ", " + editor.getBlacklistCollisions() + " blacklist collisions" : "") + ")"); - if (!params.silent && askClearLogAfterRollback && logblock.hasPermission(sender, "logblock.clearlog") && questioner != null && sender instanceof Player) { + if (!params.silent && askClearLogAfterRollback && logblock.hasPermission(sender, "logblock.clearlog") && sender instanceof Player) { Thread.sleep(1000); - if (questioner.ask((Player) sender, "Do you want to delete the rollbacked log?", "yes", "no").equals("yes")) { + if (logblock.getQuestioner().ask((Player) sender, "Do you want to delete the rollbacked log?", "yes", "no").equals("yes")) { params.silent = true; new CommandClearLog(sender, params, false); } else { @@ -774,7 +771,7 @@ public class CommandsHandler implements CommandExecutor { } return; } - if (!params.silent && askRedos && questioner != null && sender instanceof Player && !questioner.ask((Player) sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { + if (!params.silent && askRedos && sender instanceof Player && !logblock.getQuestioner().ask((Player) sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { sender.sendMessage(ChatColor.RED + "Redo aborted"); return; } @@ -817,10 +814,10 @@ public class CommandsHandler implements CommandExecutor { rs = state.executeQuery("SELECT count(*) FROM `" + table + "-blocks` " + join + params.getWhere()); rs.next(); if ((deleted = rs.getInt(1)) > 0) { - if (!params.silent && askClearLogs && sender instanceof Player && questioner != null) { + if (!params.silent && askClearLogs && sender instanceof Player) { sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":"); sender.sendMessage(ChatColor.GREEN.toString() + deleted + " blocks found."); - if (!questioner.ask((Player) sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { + if (!logblock.getQuestioner().ask((Player) sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) { sender.sendMessage(ChatColor.RED + "ClearLog aborted"); return; } diff --git a/src/main/java/de/diddiz/LogBlock/LogBlock.java b/src/main/java/de/diddiz/LogBlock/LogBlock.java index 7d816fb..358cd5c 100644 --- a/src/main/java/de/diddiz/LogBlock/LogBlock.java +++ b/src/main/java/de/diddiz/LogBlock/LogBlock.java @@ -2,6 +2,7 @@ package de.diddiz.LogBlock; import de.diddiz.LogBlock.config.Config; import de.diddiz.LogBlock.listeners.*; +import de.diddiz.LogBlock.questioner.Questioner; import de.diddiz.util.BukkitUtils; import de.diddiz.util.MySQLConnectionPool; import de.diddiz.worldedit.WorldEditLoggingHook; @@ -38,6 +39,7 @@ public class LogBlock extends JavaPlugin { private Timer timer = null; private boolean errorAtLoading = false, noDb = false, connected = true; private PlayerInfoLogging playerInfoLogging; + private Questioner questioner; public static LogBlock getInstance() { return logblock; @@ -137,6 +139,7 @@ public class LogBlock extends JavaPlugin { pm.addPermission(perm); } } + questioner = new Questioner(this); try { Metrics metrics = new Metrics(this); metrics.start(); @@ -343,4 +346,8 @@ public class LogBlock extends JavaPlugin { public File getFile() { return super.getFile(); } + + public Questioner getQuestioner() { + return questioner; + } } diff --git a/src/main/java/de/diddiz/LogBlock/questioner/Question.java b/src/main/java/de/diddiz/LogBlock/questioner/Question.java new file mode 100644 index 0000000..1c63c74 --- /dev/null +++ b/src/main/java/de/diddiz/LogBlock/questioner/Question.java @@ -0,0 +1,73 @@ +package de.diddiz.LogBlock.questioner; + +import org.bukkit.entity.Player; + +public class Question { + private String answer; + private final String[] answers; + private final String questionMessage; + private final Player respondent; + private final long start; + + public Question(Player respondent, String questionMessage, String[] answers) { + this.start = System.currentTimeMillis(); + this.respondent = respondent; + this.questionMessage = questionMessage; + this.answers = answers; + } + + public synchronized String ask() { + StringBuilder options = new StringBuilder(); + for (String ans : this.answers) { + options.append("/" + ans + ", "); + } + options.delete(options.length() - 2, options.length()); + this.respondent.sendMessage(this.questionMessage); + this.respondent.sendMessage("- " + options + "?"); + while (answer == null) { + try { + wait(); + } catch (InterruptedException ex) { + if (answer == null) { + answer = "interrupted"; + } + } + } + return this.answer; + } + + public synchronized boolean isExpired(boolean forceExpire) { + if (forceExpire || System.currentTimeMillis() - this.start > 120000L || this.answer != null) { + if (answer == null) { + answer = "timed out"; + } + notifyAll(); + return true; + } + return false; + } + + public boolean returnAnswer(String answer) { + return returnAnswer(answer, false); + } + + public synchronized boolean returnAnswer(String answer, boolean forceReturn) { + if (forceReturn) { + if (this.answer == null) { + this.answer = answer; + } + notifyAll(); + return true; + } + for (String s : answers) { + if (s.equalsIgnoreCase(answer)) { + if (this.answer == null) { + this.answer = s; + } + notifyAll(); + return true; + } + } + return false; + } +} diff --git a/src/main/java/de/diddiz/LogBlock/questioner/Questioner.java b/src/main/java/de/diddiz/LogBlock/questioner/Questioner.java new file mode 100644 index 0000000..f4746ec --- /dev/null +++ b/src/main/java/de/diddiz/LogBlock/questioner/Questioner.java @@ -0,0 +1,75 @@ +package de.diddiz.LogBlock.questioner; + +import java.util.Iterator; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map.Entry; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +import de.diddiz.LogBlock.LogBlock; + +public class Questioner { + private final LogBlock logBlock; + private final ConcurrentHashMap questions = new ConcurrentHashMap(); + + public Questioner(LogBlock logBlock) { + this.logBlock = logBlock; + logBlock.getServer().getPluginManager().registerEvents(new QuestionerListener(), logBlock); + logBlock.getServer().getScheduler().scheduleSyncRepeatingTask(logBlock, new QuestionsReaper(), 600, 600); + } + + public String ask(Player respondent, String questionMessage, String... answers) { + if (Bukkit.isPrimaryThread()) { + throw new IllegalStateException("This method may not be called from the primary thread"); + } + Question question = new Question(respondent, questionMessage, answers); + Question oldQuestion = this.questions.put(respondent.getUniqueId(), question); + if (oldQuestion != null) { + oldQuestion.returnAnswer("no", true); + // wait a little time to let the other thread continue + try { + Thread.sleep(10); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + return question.ask(); + } + + private class QuestionsReaper implements Runnable { + public void run() { + if (questions.isEmpty()) { + return; + } + Iterator> it = questions.entrySet().iterator(); + while (it.hasNext()) { + Entry e = it.next(); + Question question = e.getValue(); + if (question.isExpired(logBlock.getServer().getPlayer(e.getKey()) == null)) { + it.remove(); + } + } + } + } + + private class QuestionerListener implements Listener { + @EventHandler(ignoreCancelled = true) + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { + UUID player = event.getPlayer().getUniqueId(); + Question question; + question = questions.get(player); + if (question != null) { + String answer = event.getMessage().substring(1).toLowerCase(); + if (question.returnAnswer(answer)) { + questions.remove(player, question); + event.setCancelled(true); + } + } + } + } +}