diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index dd986d3..f7735b1 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -229,7 +229,7 @@ com.comphenix.protocol ProtocolLib - 3.3.1 + 3.4.0 compile @@ -280,6 +280,12 @@ 1.9.2 compile + + me.botsko + Prism + 2.0.1 + compile + diff --git a/pom.xml b/pom.xml index d41bb80..c2fe24c 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,7 @@ com.comphenix.protocol ProtocolLib - 3.3.1 + 3.4.0 @@ -257,6 +257,13 @@ DynmapAPI 1.9.2 + + + + me.botsko + Prism + 2.0.1 + diff --git a/src/main/java/com/cnaude/purpleirc/GameListeners/PrismListener.java b/src/main/java/com/cnaude/purpleirc/GameListeners/PrismListener.java new file mode 100644 index 0000000..8b427a3 --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/GameListeners/PrismListener.java @@ -0,0 +1,77 @@ +package com.cnaude.purpleirc.GameListeners; + +import com.cnaude.purpleirc.PurpleBot; +import com.cnaude.purpleirc.PurpleIRC; +import com.cnaude.purpleirc.TemplateName; +import me.botsko.prism.events.PrismBlocksDrainEvent; +import me.botsko.prism.events.PrismBlocksExtinguishEvent; +import me.botsko.prism.events.PrismBlocksRollbackEvent; +import me.botsko.prism.events.PrismCustomPlayerActionEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +/** + * + * @author cnaude + */ +public class PrismListener implements Listener { + + private final PurpleIRC plugin; + + /** + * + * @param plugin + */ + public PrismListener(PurpleIRC plugin) { + this.plugin = plugin; + } + + /** + * + * @param event + */ + @EventHandler + public void onPrismBlocksRollbackEvent(PrismBlocksRollbackEvent event) { + plugin.logDebug("onPrismBlocksRollbackEvent caught"); + for (PurpleBot ircBot : plugin.ircBots.values()) { + ircBot.gamePrismRollback(event.onBehalfOf(), event.getQueryParameters()); + } + } + + /** + * + * @param event + */ + @EventHandler + public void onPrismBlocksDrainEvent(PrismBlocksDrainEvent event) { + plugin.logDebug("onPrismBlocksDrainEvent caught"); + for (PurpleBot ircBot : plugin.ircBots.values()) { + ircBot.gamePrismDrainOrExtinguish(TemplateName.PRISM_DRAIN, event.onBehalfOf(), event.getRadius(), event.getBlockStateChanges()); + } + } + + /** + * + * @param event + */ + @EventHandler + public void onPrismBlocksExtinguishEvent(PrismBlocksExtinguishEvent event) { + plugin.logDebug("onPrismBlocksExtinguishEvent caught"); + for (PurpleBot ircBot : plugin.ircBots.values()) { + ircBot.gamePrismDrainOrExtinguish(TemplateName.PRISM_EXTINGUISH, event.onBehalfOf(), event.getRadius(), event.getBlockStateChanges()); + } + } + + /** + * + * @param event + */ + @EventHandler + public void onPrismCustomPlayerActionEvent(PrismCustomPlayerActionEvent event) { + plugin.logDebug("onPrismCustomPlayerActionEvent caught"); + for (PurpleBot ircBot : plugin.ircBots.values()) { + ircBot.gamePrismCustom(event.getPlayer(), event.getActionTypeName(), + event.getMessage(), event.getPluginName()); + } + } +} diff --git a/src/main/java/com/cnaude/purpleirc/PurpleBot.java b/src/main/java/com/cnaude/purpleirc/PurpleBot.java index ab53870..5628f29 100644 --- a/src/main/java/com/cnaude/purpleirc/PurpleBot.java +++ b/src/main/java/com/cnaude/purpleirc/PurpleBot.java @@ -1,12 +1,5 @@ package com.cnaude.purpleirc; -import com.dthielke.herochat.Chatter; -import java.io.File; -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; import com.cnaude.purpleirc.IRCListeners.ActionListener; import com.cnaude.purpleirc.IRCListeners.ConnectListener; import com.cnaude.purpleirc.IRCListeners.DisconnectListener; @@ -25,6 +18,7 @@ import com.cnaude.purpleirc.IRCListeners.VersionListener; import com.cnaude.purpleirc.IRCListeners.WhoisListener; import com.cnaude.purpleirc.Utilities.CaseInsensitiveMap; +import com.dthielke.herochat.Chatter; import com.dthielke.herochat.Herochat; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSortedSet; @@ -32,12 +26,18 @@ import com.massivecraft.factions.entity.UPlayer; import com.nyancraft.reportrts.data.HelpRequest; import com.titankingdoms.dev.titanchat.core.participant.Participant; +import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.charset.Charset; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import me.botsko.prism.actionlibs.QueryParameters; +import me.botsko.prism.events.BlockStateChange; import org.bukkit.Achievement; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -2607,4 +2607,62 @@ public void setConnected(boolean connected) { public String getFileName() { return fileName; } + + public void gamePrismRollback(Player player, QueryParameters queryParams) { + if (!this.isConnected()) { + return; + } + for (String channelName : botChannels) { + if (isMessageEnabled(channelName, TemplateName.PRISM_ROLLBACK)) { + asyncIRCMessage(channelName, plugin.tokenizer + .playerTokenizer(player, plugin.getMsgTemplate(botNick, TemplateName.PRISM_ROLLBACK)) + .replace("%COMMAND%", queryParams.getOriginalCommand()) + .replace("%KEYWORD%", queryParams.getKeyword()) + .replace("%SORTDIRECTION%", queryParams.getSortDirection()) + .replace("%PARAMWORLD%", queryParams.getWorld()) + .replace("%ID%", String.valueOf(queryParams.getId())) + .replace("%RADIUS%", String.valueOf(queryParams.getRadius())) + .replace("%X%", String.valueOf(queryParams.getSpecificBlockLocations().get(0).getX())) + .replace("%Y%", String.valueOf(queryParams.getSpecificBlockLocations().get(0).getY())) + .replace("%Z%", String.valueOf(queryParams.getSpecificBlockLocations().get(0).getZ())) + ); + } + } + } + + public void gamePrismDrainOrExtinguish(String template, Player player, int radius, ArrayList blockStateChange) { + if (!this.isConnected()) { + return; + } + for (String channelName : botChannels) { + if (isMessageEnabled(channelName, template)) { + asyncIRCMessage(channelName, plugin.tokenizer + .playerTokenizer(player, plugin.getMsgTemplate(botNick, template)) + .replace("%RADIUS%", String.valueOf(radius)) + .replace("%ORIGINALBLOCK%", String.valueOf(blockStateChange.get(0).getOriginalBlock().getType().name())) + .replace("%NEWBLOCK%", String.valueOf(blockStateChange.get(0).getNewBlock().getType().name())) + .replace("%X%", String.valueOf(blockStateChange.get(0).getNewBlock().getX())) + .replace("%Y%", String.valueOf(blockStateChange.get(0).getNewBlock().getY())) + .replace("%Z%", String.valueOf(blockStateChange.get(0).getNewBlock().getZ())) + .replace("%BLOCKWORLD%", String.valueOf(blockStateChange.get(0).getNewBlock().getWorld().getName())) + ); + } + } + } + + public void gamePrismCustom(Player player, String actionName, String message, String pluginName) { + if (!this.isConnected()) { + return; + } + for (String channelName : botChannels) { + if (isMessageEnabled(channelName, TemplateName.PRISM_CUSTOM)) { + asyncIRCMessage(channelName, plugin.tokenizer + .playerTokenizer(player, plugin.getMsgTemplate(botNick, TemplateName.PRISM_CUSTOM)) + .replace("%ACTION%", actionName) + .replace("%MESSAGE%", message) + .replace("%PLUGIN%", pluginName) + ); + } + } + } } diff --git a/src/main/java/com/cnaude/purpleirc/PurpleIRC.java b/src/main/java/com/cnaude/purpleirc/PurpleIRC.java index d23bbd6..b461b05 100644 --- a/src/main/java/com/cnaude/purpleirc/PurpleIRC.java +++ b/src/main/java/com/cnaude/purpleirc/PurpleIRC.java @@ -16,44 +16,45 @@ import com.cnaude.purpleirc.GameListeners.HeroChatListener; import com.cnaude.purpleirc.GameListeners.McMMOChatListener; import com.cnaude.purpleirc.GameListeners.OreBroadcastListener; +import com.cnaude.purpleirc.GameListeners.PrismListener; import com.cnaude.purpleirc.GameListeners.ReportRTSListener; import com.cnaude.purpleirc.GameListeners.TitanChatListener; import com.cnaude.purpleirc.GameListeners.TownyChatListener; import com.cnaude.purpleirc.Hooks.DynmapHook; -import com.cnaude.purpleirc.Hooks.VaultHook; -import com.cnaude.purpleirc.Utilities.ColorConverter; -import com.cnaude.purpleirc.Utilities.RegexGlobber; -import com.google.common.base.Joiner; -import com.onarandombox.MultiverseCore.api.MVPlugin; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.management.ManagementFactory; -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Map; -import java.util.TreeMap; -import java.util.logging.Level; -import java.util.logging.Logger; import com.cnaude.purpleirc.Hooks.FactionChatHook; import com.cnaude.purpleirc.Hooks.JobsHook; import com.cnaude.purpleirc.Hooks.ShortifyHook; import com.cnaude.purpleirc.Hooks.TownyChatHook; import com.cnaude.purpleirc.Hooks.VanishHook; +import com.cnaude.purpleirc.Hooks.VaultHook; import com.cnaude.purpleirc.Utilities.CaseInsensitiveMap; import com.cnaude.purpleirc.Utilities.ChatTokenizer; +import com.cnaude.purpleirc.Utilities.ColorConverter; import com.cnaude.purpleirc.Utilities.IRCMessageHandler; import com.cnaude.purpleirc.Utilities.NetPackets; import com.cnaude.purpleirc.Utilities.Query; +import com.cnaude.purpleirc.Utilities.RegexGlobber; +import com.google.common.base.Joiner; +import com.onarandombox.MultiverseCore.api.MVPlugin; import com.onarandombox.MultiverseCore.api.MultiverseWorld; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.management.ManagementFactory; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.configuration.InvalidConfigurationException; @@ -146,7 +147,7 @@ public class PurpleIRC extends JavaPlugin { public VaultHook vaultHelpers; public VanishHook vanishHook; private YamlConfiguration heroConfig; - private File cacheFile; + private final File cacheFile; public PurpleIRC() { this.MAINCONFIG = "MAIN-CONFIG"; @@ -194,7 +195,7 @@ public void onEnable() { getServer().getPluginManager().registerEvents(new GamePlayerJoinListener(this), this); getServer().getPluginManager().registerEvents(new GamePlayerKickListener(this), this); getServer().getPluginManager().registerEvents(new GamePlayerQuitListener(this), this); - getServer().getPluginManager().registerEvents(new GameServerCommandListener(this), this); + getServer().getPluginManager().registerEvents(new GameServerCommandListener(this), this); if (isPluginEnabled("Herochat")) { logInfo("Enabling HeroChat support."); getServer().getPluginManager().registerEvents(new HeroChatListener(this), this); @@ -216,6 +217,12 @@ public void onEnable() { } else { logInfo("TitanChat not detected."); } + if (isPluginEnabled("Prism")) { + logInfo("Enabling Prism support."); + getServer().getPluginManager().registerEvents(new PrismListener(this), this); + } else { + logInfo("Prism not detected."); + } if (isPluginEnabled("TownyChat")) { logInfo("Enabling TownyChat support."); getServer().getPluginManager().registerEvents(new TownyChatListener(this), this); diff --git a/src/main/java/com/cnaude/purpleirc/TemplateName.java b/src/main/java/com/cnaude/purpleirc/TemplateName.java index 972e3a2..7d8e6bb 100644 --- a/src/main/java/com/cnaude/purpleirc/TemplateName.java +++ b/src/main/java/com/cnaude/purpleirc/TemplateName.java @@ -96,5 +96,10 @@ public class TemplateName { public final static String DEATH_MESSAGES = "death-messages"; public final static String ORE_BROADCAST = "ore-broadcast"; + + public final static String PRISM_ROLLBACK = "prism-rollback"; + public final static String PRISM_DRAIN = "prism-drain"; + public final static String PRISM_EXTINGUISH = "prism-extinguish"; + public final static String PRISM_CUSTOM = "prism-custom"; } diff --git a/src/main/resources/SampleBot.yml b/src/main/resources/SampleBot.yml index d8ffc96..fd991b4 100644 --- a/src/main/resources/SampleBot.yml +++ b/src/main/resources/SampleBot.yml @@ -98,6 +98,11 @@ channels: - game-mode # Essentials helpop messages (/helpop /amsg /ac) - ess-helpop + # Prism + #- prism-rollback + #- prism-drain + #- prism-extinguish + #- prism-custom # The game-afk message type is not functional yet. #- game-afk # These messages are sent from IRC to game (see permissions) @@ -163,7 +168,7 @@ channels: hero-channel: admin # Towny channel destination for IRC messages towny-channel: irc - # Log all messages from IRC to HeroChat + # Log all messages from IRC to HeroChat log-irc-to-hero-chat: false # ops - IRC hostname mask styled ops list ops: diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b2b0114..8be684a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -39,6 +39,29 @@ channel-check-interval: 100 # %TOWNYMSGCOLOR% - Towny message color # %JOBS% - Player jobs # %JOBS% - Player jobs shortened +# Prism custom tokens: +# prism-rollback: +# %COMMAND% +# %KEYWORD% +# %SORTDIRECTION% +# %PARAMWORLD% +# %ID% +# %RADIUS% +# %X% +# %Y% +# %Z% +# prism-drain and prism-extinguish: +# %RADIUS% +# %ORIGINALBLOCK% +# %NEWBLOCK% +# %X% +# %Y% +# %Z% +# %BLOCKWORLD% +# prism-custom: +# %ACTION% +# %MESSAGE% +# %PLUGIN% message-format: # Message templates for game to IRC messages console-chat: '[&dServer&r] %MESSAGE%' @@ -141,6 +164,11 @@ message-format: irc: '[IRC]%PLAYERPREFIX%%NAME% %MESSAGE%' broadcast-message: '[Broadcast] <%NAME%> %MESSAGE%' broadcast-console-message: '[Broadcast] %MESSAGE%' + # Prism templates. See above for token names. + prism-rollback: '[PrismRollback] [Player: %NAME%] [Radius: %RADIUS%] [Command: %COMMAND%] [Keyword: %KEYWORD%] [X,Y,Z: %X%,%Y%,%Z%] [World: %PARAMWORLD%]' + prism-drain: '[PrismDrain] [Player: %NAME%] [Radius: %RADIUS%] [OrigBlock: %ORIGINALBLOCK%] [NewBlock: %NEWBLOCK%] [X,Y,Z: %X%,%Y%,%Z%] [World: %BLOCKWORLD%]' + prism-extinguish: '[PrismExtinguish] [Player: %NAME%] [Radius%: %RADIUS] [OrigBlock: %ORIGINALBLOCK%] [NewBlock: %NEWBLOCK%] [X,Y,Z: %X%,%Y%,%Z%] [World: %BLOCKWORLD%]' + prism-custom: '[PrismCustom] [Player: %NAME%] [Action: %ACTION%] [Message: %MESSAGE%] [Plugin: %PLUGIN%]' # Defaults below take effect when user joins IRC and matching player is offline default-player-suffix: '' default-player-prefix: ''