From 5f05cc55e3c5c7f51a5e48477affb35dab77cddd Mon Sep 17 00:00:00 2001 From: Jared Seville Date: Wed, 19 Nov 2025 23:44:01 -0600 Subject: [PATCH 1/5] Enable version bump check on pull requests Add pull request trigger for version bump check --- .../minecraft-maven-version-bump.yml | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/minecraft-maven-version-bump.yml diff --git a/.github/workflows/minecraft-maven-version-bump.yml b/.github/workflows/minecraft-maven-version-bump.yml new file mode 100644 index 0000000..2bdf779 --- /dev/null +++ b/.github/workflows/minecraft-maven-version-bump.yml @@ -0,0 +1,52 @@ +##### +# Minecraft Maven Version Bump Check +##### +# Ensures that maven version is bumped or changed before merging. +##### +on: + pull_request: + branches: [ "main" ] + +jobs: + ensure-version-bump: + if: ${{ github.base_ref == 'main' || github.base_ref == 'master' }} + runs-on: ubuntu-latest + + steps: + - name: Checkout PR branch + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Extract version from PR branch + id: pr_ver + run: | + PR_VERSION=$(grep -m1 '' pom.xml | sed -E 's/.*(.*)<\/version>.*/\1/') + echo "value=$PR_VERSION" >> $GITHUB_OUTPUT + + - name: Extract version from base branch + id: base_ver + run: | + git fetch origin ${{ github.base_ref }} --depth=1 + git checkout origin/${{ github.base_ref }} -- pom.xml + BASE_VERSION=$(grep -m1 '' pom.xml | sed -E 's/.*(.*)<\/version>.*/\1/') + echo "value=$BASE_VERSION" >> $GITHUB_OUTPUT + + - name: Compare versions + run: | + echo "PR version: ${{ steps.pr_ver.outputs.value }}" + echo "Base version: ${{ steps.base_ver.outputs.value }}" + + if [ "${{ steps.pr_ver.outputs.value }}" = "${{ steps.base_ver.outputs.value }}" ]; then + echo "❌ Version has NOT been bumped!" + exit 1 + fi + + echo "✅ Version has been changed." + + - name: Warn if version contains -SNAPSHOT + run: | + VERSION="${{ steps.pr_ver.outputs.value }}" + if [[ "$VERSION" == *"-SNAPSHOT"* ]]; then + echo "::warning title=Snapshot Version Detected::The version contains '-SNAPSHOT'. Consider removing it before release." + fi From 2139d603d5bfa81d06032441d8967accc0325cf7 Mon Sep 17 00:00:00 2001 From: Peashooter101 Date: Mon, 8 May 2023 12:50:46 -0700 Subject: [PATCH 2/5] Regex Test, added Setter to PrivateMessageEvent This has been purposefully borkden --- .../listeners/MessageRegexListener.java | 28 +++++++++++++++++++ .../simplepms/events/PrivateMessageEvent.java | 20 +++---------- 2 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 src/main/java/adhdmc/simplepms/listeners/MessageRegexListener.java 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 * From ec2fd0b20169b1e5db3e78142fc51caca559c366 Mon Sep 17 00:00:00 2001 From: Peashooter101 Date: Mon, 8 May 2023 13:37:42 -0700 Subject: [PATCH 3/5] That's what we call a memory leak, pt2 Changed MessageHandling to use event's message content. Registered MessageRegexListener and QuitListener event listeners. This has been purosefully borked --- src/main/java/adhdmc/simplepms/SimplePMs.java | 66 ++++++++++ .../simplepms/handling/MessageHandling.java | 118 ++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 src/main/java/adhdmc/simplepms/SimplePMs.java create mode 100644 src/main/java/adhdmc/simplepms/handling/MessageHandling.java 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())); + } + } +} From 0db9e5c2bb2447176686f85ca893c327afd23fd9 Mon Sep 17 00:00:00 2001 From: Peashooter101 Date: Thu, 20 Nov 2025 00:07:24 -0600 Subject: [PATCH 4/5] Bumping version for test --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5f29eb..2b5fbb7 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ simplexity SimplePMs - 2.4.3 + 2.5.4 jar SimplePMs From f281606702147579cc605715b5f1bc8cae6cc34b Mon Sep 17 00:00:00 2001 From: Peashooter101 Date: Thu, 20 Nov 2025 00:19:27 -0600 Subject: [PATCH 5/5] update pomxml to snapshot ye --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2b5fbb7..55efbe9 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ simplexity SimplePMs - 2.5.4 + 2.5.4-SNAPSHOT jar SimplePMs