diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 51de1ed..ca95161 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,10 +29,16 @@ jobs: uses: actions/setup-java@v3 with: java-version: '17' - distribution: 'corretto' - + distribution: 'temurin' + + - name: Set release version + run: | + TAG=${{ github.event.release.tag_name }} + echo "VERSION=${TAG#v}" >> $GITHUB_OUTPUT + id: version + - name: Set project version - run: mvn -B versions:set -DnewVersion=${{ github.event.release.tag_name }} -DgenerateBackupPoms=false + run: mvn -B versions:set -DnewVersion=${{ steps.version.outputs.VERSION }} -DgenerateBackupPoms=false - name: Build and package Maven project run: mvn clean package @@ -40,7 +46,7 @@ jobs: - name: Upload to release uses: JasonEtco/upload-to-release@master with: - args: target/CloudnodeMSG-${{ github.event.release.tag_name }}.jar application/java-archive + args: target/CloudnodeMSG-${{ steps.version.outputs.VERSION }}.jar application/java-archive env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -49,7 +55,7 @@ jobs: with: token: ${{ secrets.MODRINTH_TOKEN }} project: 5Ce4fxJB - file: target/CloudnodeMSG-${{ github.event.release.tag_name }}.jar + file: target/CloudnodeMSG-${{ steps.version.outputs.VERSION }}.jar changelog: ${{ github.event.release.body }} loaders: paper diff --git a/README.md b/README.md index 0304d9d..8488150 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,6 @@ Enable or disable receiving private messages of another player. Reload the plugin configuration.
-
Aliases:
/toggledms, /togglepms
Permission:
cloudnodemsg.reload
diff --git a/src/main/java/pro/cloudnode/smp/cloudnodemsg/Message.java b/src/main/java/pro/cloudnode/smp/cloudnodemsg/Message.java index 6f489b2..7d1f555 100644 --- a/src/main/java/pro/cloudnode/smp/cloudnodemsg/Message.java +++ b/src/main/java/pro/cloudnode/smp/cloudnodemsg/Message.java @@ -1,5 +1,6 @@ package pro.cloudnode.smp.cloudnodemsg; +import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; @@ -12,6 +13,7 @@ import pro.cloudnode.smp.cloudnodemsg.error.InvalidPlayerError; import pro.cloudnode.smp.cloudnodemsg.error.PlayerHasIncomingDisabledError; import pro.cloudnode.smp.cloudnodemsg.error.PlayerNotFoundError; +import pro.cloudnode.smp.cloudnodemsg.error.ReplyOfflineError; import java.util.Arrays; import java.util.HashSet; @@ -35,19 +37,27 @@ public Message(@NotNull OfflinePlayer sender, @NotNull OfflinePlayer recipient, } public void send() throws InvalidPlayerError { - send(false); + send(Context.REGULAR); } - public void send(final boolean channel) throws InvalidPlayerError { + public void send(final @NotNull Context context) throws InvalidPlayerError { + final @NotNull String senderUsername = playerOrServerUsername(this.sender); + final @NotNull String recipientUsername = playerOrServerUsername(this.recipient); + final @NotNull Optional<@NotNull Player> senderPlayer = Optional.ofNullable(this.sender.getPlayer()); final @NotNull Optional<@NotNull Player> recipientPlayer = Optional.ofNullable(this.recipient.getPlayer()); - if (senderPlayer.isPresent() && (recipientPlayer.isEmpty() || (CloudnodeMSG.isVanished(recipientPlayer.get()) && !senderPlayer - .get().hasPermission(Permission.SEND_VANISHED)))) { - if (!channel) new PlayerNotFoundError(senderPlayer.get().getName()).send(senderPlayer.get()); + if (!recipient.getUniqueId().equals(console.getUniqueId()) && recipientPlayer.isEmpty() || (recipientPlayer.isPresent() && senderPlayer.isPresent() && CloudnodeMSG.isVanished(recipientPlayer.get()) && !senderPlayer.get().hasPermission(Permission.SEND_VANISHED))) { + if (context == Context.CHANNEL) { + final @NotNull Player player = Objects.requireNonNull(sender.getPlayer()); + Message.exitChannel(player); + new ChannelOfflineError(player.getName(), Optional.ofNullable(recipient.getName()) + .orElse("Unknown Player")).send(player); + } else { - Message.exitChannel(senderPlayer.get()); - new ChannelOfflineError(senderPlayer.get(), recipient).send(senderPlayer.get()); + final @NotNull Audience senderAudience = senderPlayer.isPresent() ? senderPlayer.get() : CloudnodeMSG.getInstance().getServer().getConsoleSender(); + if (context == Context.REPLY) new ReplyOfflineError(recipientUsername).send(senderAudience); + else new PlayerNotFoundError(recipientUsername).send(senderAudience); } return; } @@ -58,17 +68,16 @@ public void send(final boolean channel) throws InvalidPlayerError { return; } - sendMessage(sender, CloudnodeMSG.getInstance().config().outgoing(sender, recipient, message)); - if (senderPlayer.isPresent() && !Message.hasChannel(senderPlayer.get(), recipient)) - setReplyTo(sender, recipient); - sendSpyMessage(sender, recipient, message); - + sendMessage(sender, CloudnodeMSG.getInstance().config().outgoing(senderUsername, recipientUsername, message)); if ((recipientPlayer.isPresent() && Message.isIgnored(recipientPlayer.get(), sender)) && (senderPlayer.isPresent() && !senderPlayer .get().hasPermission(Permission.IGNORE_BYPASS))) return; sendMessage(recipient, CloudnodeMSG.getInstance().config() - .incoming(sender, recipient, message)); - if (recipientPlayer.isPresent() && !Message.hasChannel(recipientPlayer.get(), sender)) + .incoming(senderUsername, recipientUsername, message)); + + if (sender.getUniqueId().equals(console.getUniqueId()) || (senderPlayer.isPresent() && !Message.hasChannel(senderPlayer.get(), recipient))) + setReplyTo(sender, recipient); + if (recipient.getUniqueId().equals(console.getUniqueId()) || (recipientPlayer.isPresent() && !Message.hasChannel(recipientPlayer.get(), sender))) setReplyTo(recipient, sender); } @@ -289,4 +298,24 @@ public static void exitTeamChannel(final @NotNull Player player) { public static boolean hasTeamChannel(final @NotNull Player player) { return player.getPersistentDataContainer().getOrDefault(CHANNEL_TEAM, PersistentDataType.BOOLEAN, false); } + + /** + * The context in which this message is sent + */ + public static enum Context { + /** + * Message sent via command (i.e. no special context) + */ + REGULAR, + + /** + * Message sent via messaging channel + */ + CHANNEL, + + /** + * Message sent as a reply + */ + REPLY; + } } diff --git a/src/main/java/pro/cloudnode/smp/cloudnodemsg/command/ReplyCommand.java b/src/main/java/pro/cloudnode/smp/cloudnodemsg/command/ReplyCommand.java index e1fe128..2b7c353 100644 --- a/src/main/java/pro/cloudnode/smp/cloudnodemsg/command/ReplyCommand.java +++ b/src/main/java/pro/cloudnode/smp/cloudnodemsg/command/ReplyCommand.java @@ -4,17 +4,14 @@ import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG; +import pro.cloudnode.smp.cloudnodemsg.Message; import pro.cloudnode.smp.cloudnodemsg.Permission; import pro.cloudnode.smp.cloudnodemsg.error.InvalidPlayerError; import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError; import pro.cloudnode.smp.cloudnodemsg.error.NobodyReplyError; -import pro.cloudnode.smp.cloudnodemsg.error.ReplyOfflineError; -import pro.cloudnode.smp.cloudnodemsg.error.PlayerHasIncomingDisabledError; -import pro.cloudnode.smp.cloudnodemsg.Message; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; public final class ReplyCommand extends Command { @@ -27,17 +24,9 @@ public boolean run(final @NotNull CommandSender sender, final @NotNull String la final @NotNull Optional<@NotNull OfflinePlayer> recipient = Message.getReplyTo(Message.offlinePlayer(sender)); if (recipient.isEmpty()) return new NobodyReplyError().send(sender); - if ( - !recipient.get().getUniqueId().equals(Message.console.getUniqueId()) - && ( - !recipient.get().isOnline() - || (CloudnodeMSG.isVanished(Objects.requireNonNull(recipient.get().getPlayer())) && !sender.hasPermission(Permission.SEND_VANISHED)) - ) - ) - return new ReplyOfflineError(recipient.get()).send(sender); try { - new Message(Message.offlinePlayer(sender), recipient.get(), String.join(" ", args)).send(); + new Message(Message.offlinePlayer(sender), recipient.get(), String.join(" ", args)).send(Message.Context.REPLY); return true; } catch (final @NotNull InvalidPlayerError e) { diff --git a/src/main/java/pro/cloudnode/smp/cloudnodemsg/listener/AsyncChatListener.java b/src/main/java/pro/cloudnode/smp/cloudnodemsg/listener/AsyncChatListener.java index d3a55dd..d2cebca 100644 --- a/src/main/java/pro/cloudnode/smp/cloudnodemsg/listener/AsyncChatListener.java +++ b/src/main/java/pro/cloudnode/smp/cloudnodemsg/listener/AsyncChatListener.java @@ -48,7 +48,7 @@ public void channels(final @NotNull AsyncChatEvent event) { if (channelRecipient.isEmpty()) return; event.setCancelled(true); try { - new Message(sender, channelRecipient.get(), event.message()).send(true); + new Message(sender, channelRecipient.get(), event.message()).send(Message.Context.CHANNEL); } catch (final @NotNull InvalidPlayerError e) { e.log().send(sender);