diff --git a/pom.xml b/pom.xml index a5f29eb..55efbe9 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ simplexity SimplePMs - 2.4.3 + 2.5.4-SNAPSHOT jar SimplePMs diff --git a/src/main/java/adhdmc/simplepms/SimplePMs.java b/src/main/java/adhdmc/simplepms/SimplePMs.java new file mode 100644 index 0000000..563ae86 --- /dev/null +++ b/src/main/java/adhdmc/simplepms/SimplePMs.java @@ -0,0 +1,66 @@ +package adhdmc.simplepms; + +import adhdmc.simplepms.commands.PrivateMessage; +import adhdmc.simplepms.commands.ReloadCommand; +import adhdmc.simplepms.commands.ReplyCommand; +import adhdmc.simplepms.commands.SocialSpyCommand; +import adhdmc.simplepms.config.LocaleConfig; +import adhdmc.simplepms.listeners.LoginListener; +import adhdmc.simplepms.listeners.MessageRegexListener; +import adhdmc.simplepms.listeners.QuitListener; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashSet; +import java.util.Objects; + +public final class SimplePMs extends JavaPlugin { + + private static Plugin instance; + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + private static boolean papiEnabled = false; + + @Override + public void onEnable() { + instance = this; + registerCommands(); + this.getServer().getPluginManager().registerEvents(new LoginListener(), this); + this.getServer().getPluginManager().registerEvents(new QuitListener(), this); + this.getServer().getPluginManager().registerEvents(new MessageRegexListener(), this); + if (this.getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) { + papiEnabled = true; + } else { + this.getLogger().info("You do not have PlaceholderAPI loaded on your server. Any PlaceholderAPI placeholders used in this plugin's messages, will not work."); + } + LocaleConfig.getInstance().reloadLocale(); + } + + public static MiniMessage getMiniMessage() { + return miniMessage; + } + + public static Plugin getInstance() { + return instance; + } + + public static boolean isPapiEnabled() { + return papiEnabled; + } + + private void registerCommands() { + Objects.requireNonNull(this.getCommand("msg")).setExecutor(new PrivateMessage()); + Objects.requireNonNull(this.getCommand("reply")).setExecutor(new ReplyCommand()); + Objects.requireNonNull(this.getCommand("socialspy")).setExecutor(new SocialSpyCommand()); + Objects.requireNonNull(this.getCommand("spmreload")).setExecutor(new ReloadCommand()); + } + + + private static final HashSet spyingPlayers = new HashSet<>(); + + public static HashSet getSpyingPlayers() { + return spyingPlayers; + } + +} diff --git a/src/main/java/adhdmc/simplepms/handling/MessageHandling.java b/src/main/java/adhdmc/simplepms/handling/MessageHandling.java new file mode 100644 index 0000000..2c9efe7 --- /dev/null +++ b/src/main/java/adhdmc/simplepms/handling/MessageHandling.java @@ -0,0 +1,118 @@ +package adhdmc.simplepms.handling; + +import adhdmc.simplepms.SimplePMs; +import adhdmc.simplepms.events.PrivateMessageEvent; +import adhdmc.simplepms.utils.Message; +import adhdmc.simplepms.utils.Perm; +import adhdmc.simplepms.utils.SPMKey; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataType; + +import java.util.HashSet; + +public class MessageHandling { + private static MessageHandling instance; + private MessageHandling(){} + + public static MessageHandling getInstance() { + if (instance == null) instance = new MessageHandling(); + return instance; + } + HashSet spyingPlayers = SimplePMs.getSpyingPlayers(); + NamespacedKey lastMessaged = SPMKey.LAST_MESSAGED.getKey(); + Component consoleChatComponent = SimplePMs.getMiniMessage().deserialize(Message.CONSOLE_FORMAT.getMessage()); + Component consoleSpyComponent = SimplePMs.getMiniMessage().deserialize(Message.CONSOLE_FORMAT_SPY.getMessage()); + + /** + * Calls the message event and handles socialspy for a message between 2 players. + *
Sends messageContent to Resolvers. + *
Uses Message keys: + *
  • RECEIVING_FORMAT + *
  • SENDING_FORMAT + *
  • SPY_FORMAT
+ * @param initiator Player + * @param recipient Player + * @param messageContent String + */ + public void playerSenderAndReceiver(Player initiator, Player recipient, String messageContent) { + // Calls private message event so other plugins can interact with this + PrivateMessageEvent event = new PrivateMessageEvent(initiator, recipient, messageContent, spyingPlayers); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) return; + initiator.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, recipient.getName()); + recipient.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, initiator.getName()); + initiator.sendMessage(Resolvers.getInstance().parseMessagePlayerToPlayer(Message.SENDING_FORMAT.getMessage(), initiator, recipient, event.getMessageContent())); + recipient.sendMessage(Resolvers.getInstance().parseMessagePlayerToPlayer(Message.RECEIVING_FORMAT.getMessage(), initiator, recipient, event.getMessageContent())); + for (Player spy : spyingPlayers) { + if (!spy.isOnline()) continue; + if (spy.equals(initiator) || spy.equals(recipient)) continue; + spy.sendMessage(Resolvers.getInstance().parseMessagePlayerToPlayer(Message.SPY_FORMAT.getMessage(), initiator, recipient, event.getMessageContent())); + } + } + + /** + * Calls the message event and handles socialspy for a message sent by the console, and received by a player + *
Sends messageContent to Resolvers. + *
Uses Message keys: + *
  • RECEIVING_FORMAT + *
  • SENDING_FORMAT + *
  • CONSOLE_FORMAT + *
  • SPY_FORMAT + *
  • CONSOLE_FORMAT_SPY
+ * @param initiator CommandSender + * @param recipient Player + * @param messageContent String + */ + public void consoleSenderPlayerReceiver(CommandSender initiator, Player recipient, String messageContent) { + // Call Event + PrivateMessageEvent event = new PrivateMessageEvent(initiator, recipient, messageContent, spyingPlayers); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) return; + recipient.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, Message.PDC_CONSOLE.getMessage()); + recipient.sendMessage(Resolvers.getInstance().parseMessageConsoleToPlayer(Message.RECEIVING_FORMAT.getMessage(), consoleChatComponent, recipient, event.getMessageContent())); + initiator.sendMessage(Resolvers.getInstance().parseMessageConsoleToPlayer(Message.SENDING_FORMAT.getMessage(), consoleChatComponent, recipient, event.getMessageContent())); + for (Player spy : spyingPlayers) { + if (!spy.isOnline()) continue; + if (spy.equals(initiator) || spy.equals(recipient)) continue; + if (!spy.hasPermission(Perm.CONSOLE_MESSAGE_SPY.getPerm())) continue; + spy.sendMessage(Resolvers.getInstance().parseMessageConsoleToPlayer(Message.SPY_FORMAT.getMessage(), consoleSpyComponent, recipient, event.getMessageContent())); + } + } + + + /** + * Calls the message event and handles socialspy for a message sent by a player to the console. + *
Sends messageContent to Resolvers. + *
Uses Message keys: + *
  • ERROR_PLAYER_COMMAND + *
  • SENDING_FORMAT + *
  • CONSOLE_FORMAT + *
  • SPY_FORMAT + *
  • CONSOLE_FORMAT_SPY
+ * @param initiator CommandSender + * @param messageContent String + */ + + public void playerSenderConsoleReceiver(CommandSender initiator, String messageContent) { + if (!(initiator instanceof Player initiatingPlayer)){ + initiator.sendMessage(Resolvers.getInstance().parsePluginPrefix(Message.ERROR_PLAYER_COMMAND.getMessage())); + return; + } + // Call Event + PrivateMessageEvent event = new PrivateMessageEvent(initiator, Bukkit.getConsoleSender(), messageContent, spyingPlayers); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) return; + initiatingPlayer.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, Message.PDC_CONSOLE.getMessage()); + initiatingPlayer.sendMessage(Resolvers.getInstance().parseMessagePlayerToConsole(Message.SENDING_FORMAT.getMessage(), initiatingPlayer, consoleChatComponent, event.getMessageContent())); + for (Player spy : spyingPlayers) { + if (!spy.isOnline()) continue; + if (spy.equals(initiator)) continue; + if (!spy.hasPermission(Perm.CONSOLE_MESSAGE_SPY.getPerm())) continue; + spy.sendMessage(Resolvers.getInstance().parseMessagePlayerToConsole(Message.SPY_FORMAT.getMessage(),initiatingPlayer, consoleSpyComponent, event.getMessageContent())); + } + } +} diff --git a/src/main/java/adhdmc/simplepms/listeners/MessageRegexListener.java b/src/main/java/adhdmc/simplepms/listeners/MessageRegexListener.java new file mode 100644 index 0000000..771dea5 --- /dev/null +++ b/src/main/java/adhdmc/simplepms/listeners/MessageRegexListener.java @@ -0,0 +1,28 @@ +package adhdmc.simplepms.listeners; + +import adhdmc.simplepms.events.PrivateMessageEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.util.HashMap; +import java.util.Map; + +public class MessageRegexListener implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onSimplePM(PrivateMessageEvent event) { + // TODO: Make Configurable, add bypass permission. + Map sampleRegexes = new HashMap<>(); + sampleRegexes.put("averysimpleregex", "Censored 1"); + sampleRegexes.put("averysimpleregex2", "Censored 2"); + sampleRegexes.put("averysimpleregex3", "Censored 3"); + + String message = event.getMessageContent(); + for (Map.Entry entry : sampleRegexes.entrySet()) { + message = message.replace(entry.getKey(), entry.getValue()); + } + event.setMessageContent(message); + } + +} diff --git a/src/main/java/simplexity/simplepms/events/PrivateMessageEvent.java b/src/main/java/simplexity/simplepms/events/PrivateMessageEvent.java index 498a913..6c82f4a 100644 --- a/src/main/java/simplexity/simplepms/events/PrivateMessageEvent.java +++ b/src/main/java/simplexity/simplepms/events/PrivateMessageEvent.java @@ -15,11 +15,10 @@ */ @SuppressWarnings("unused") public class PrivateMessageEvent extends Event implements Cancellable { - - private CommandSender initiator; - private CommandSender recipient; - private String messageContent; - private final Set spyingPlayers; + private final CommandSender initiator; + private final CommandSender recipient; + private final String messageContent; + private final HashSet spyingPlayers; private boolean cancelled; private static final HandlerList handlers = new HandlerList(); @@ -81,17 +80,6 @@ public String getMessageContent() { return messageContent; } - /** - * Sets the message that will be sent from this event. - * Note that this only affects the actual message content and not the way the message is formatted - * - * @param messageContent String - */ - - public void setMessageContent(String messageContent) { - this.messageContent = messageContent; - } - /** * Gets the list of players who currently have SocialSpy toggled on *