From b31d335b840e8571128c8b3d54fd954fa1db266a Mon Sep 17 00:00:00 2001 From: Taah Date: Sun, 24 Apr 2022 07:43:55 -0700 Subject: [PATCH] add messaging and replying --- .../java/dev/plex/messaging/MessageData.java | 32 +++++++++++ .../java/dev/plex/player/ISunburstPlayer.java | 5 ++ server/src/main/java/dev/plex/Sunburst.java | 4 ++ .../dev/plex/command/impl/MessageCMD.java | 48 ++++++++++++++++ .../java/dev/plex/command/impl/ReplyCMD.java | 55 +++++++++++++++++++ .../java/dev/plex/player/SunburstPlayer.java | 15 +++++ server/src/main/resources/messages.yml | 14 ++++- 7 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/dev/plex/messaging/MessageData.java create mode 100644 server/src/main/java/dev/plex/command/impl/MessageCMD.java create mode 100644 server/src/main/java/dev/plex/command/impl/ReplyCMD.java diff --git a/api/src/main/java/dev/plex/messaging/MessageData.java b/api/src/main/java/dev/plex/messaging/MessageData.java new file mode 100644 index 0000000..7132dbe --- /dev/null +++ b/api/src/main/java/dev/plex/messaging/MessageData.java @@ -0,0 +1,32 @@ +package dev.plex.messaging; + +import java.util.UUID; + +public class MessageData +{ + private final UUID sender; + private final UUID receiver; + private final String message; + + public MessageData(UUID sender, UUID receiver, String message) + { + this.sender = sender; + this.receiver = receiver; + this.message = message; + } + + public UUID getSender() + { + return sender; + } + + public UUID getReceiver() + { + return receiver; + } + + public String getMessage() + { + return message; + } +} diff --git a/api/src/main/java/dev/plex/player/ISunburstPlayer.java b/api/src/main/java/dev/plex/player/ISunburstPlayer.java index 79cc6ca..6eed7cc 100644 --- a/api/src/main/java/dev/plex/player/ISunburstPlayer.java +++ b/api/src/main/java/dev/plex/player/ISunburstPlayer.java @@ -1,6 +1,7 @@ package dev.plex.player; import com.google.gson.*; +import dev.plex.messaging.MessageData; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -27,6 +28,8 @@ public interface ISunburstPlayer boolean socialSpy(); + MessageData messageData(); + void displayName(Component displayName); void godMode(boolean godMode); @@ -39,6 +42,8 @@ public interface ISunburstPlayer void socialSpy(boolean socialSpy); + void messageData(MessageData messageData); + default String toJSON() { return new GsonBuilder().setPrettyPrinting().registerTypeAdapter(Component.class, (JsonSerializer) (src, typeOfSrc, context) -> new JsonPrimitive(MiniMessage.miniMessage().serialize(src))).disableHtmlEscaping().create().toJson(this); diff --git a/server/src/main/java/dev/plex/Sunburst.java b/server/src/main/java/dev/plex/Sunburst.java index bc64dfa..7bb36e9 100644 --- a/server/src/main/java/dev/plex/Sunburst.java +++ b/server/src/main/java/dev/plex/Sunburst.java @@ -1,6 +1,8 @@ package dev.plex; +import dev.plex.command.impl.MessageCMD; import dev.plex.command.impl.NicknameCMD; +import dev.plex.command.impl.ReplyCMD; import dev.plex.command.impl.SunburstCMD; import dev.plex.listener.impl.player.ChatListener; import dev.plex.listener.impl.player.JoinListener; @@ -53,6 +55,8 @@ public final class Sunburst extends SunburstPlugin new ChatListener(); new NicknameCMD(); new SunburstCMD(); + new MessageCMD(); + new ReplyCMD(); Bukkit.getOnlinePlayers().forEach(player -> { diff --git a/server/src/main/java/dev/plex/command/impl/MessageCMD.java b/server/src/main/java/dev/plex/command/impl/MessageCMD.java new file mode 100644 index 0000000..b5bc7b2 --- /dev/null +++ b/server/src/main/java/dev/plex/command/impl/MessageCMD.java @@ -0,0 +1,48 @@ +package dev.plex.command.impl; + +import dev.plex.command.SunburstCommand; +import dev.plex.command.util.CommandInfo; +import dev.plex.command.util.CommandPerms; +import dev.plex.messaging.MessageData; +import dev.plex.player.ISunburstPlayer; +import dev.plex.util.ComponentUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@CommandInfo(name = "message", description = "Sends a message to a player", usage = "/ ", aliases = {"msg", "tell", "whisper"}) +@CommandPerms(permission = "sunburst.command.message") +public class MessageCMD extends SunburstCommand +{ + @Override + public Component execute(@NotNull CommandSender sender, @Nullable Player player, String[] args) + { + if (args.length < 2) + { + return usage(); + } + + Player target = Bukkit.getPlayer(args[0]); + if (target == null) + { + return confMsg("playerNotFound"); + } + String message = StringUtils.join(args, " ", 1, args.length); + MessageData data = new MessageData(sender instanceof ConsoleCommandSender ? null : player.getUniqueId(), target.getUniqueId(), message); + if (sender instanceof Player) + { + ISunburstPlayer sunburstPlayer = plugin.getObjectHolder().getStorageSystem().getPlayer(player.getUniqueId()); + sunburstPlayer.messageData(data); + } + ISunburstPlayer sunburstPlayer = plugin.getObjectHolder().getStorageSystem().getPlayer(target.getUniqueId()); + sunburstPlayer.messageData(data); + target.sendMessage(confMsg("messageReceived", sender.getName(), target.getName(), message)); + return confMsg("messageSent", sender.getName(), target.getName(), message); + } +} diff --git a/server/src/main/java/dev/plex/command/impl/ReplyCMD.java b/server/src/main/java/dev/plex/command/impl/ReplyCMD.java new file mode 100644 index 0000000..73dd2c6 --- /dev/null +++ b/server/src/main/java/dev/plex/command/impl/ReplyCMD.java @@ -0,0 +1,55 @@ +package dev.plex.command.impl; + +import dev.plex.command.SunburstCommand; +import dev.plex.command.util.CommandInfo; +import dev.plex.command.util.CommandPerms; +import dev.plex.command.util.RequiredSource; +import dev.plex.messaging.MessageData; +import dev.plex.player.ISunburstPlayer; +import net.kyori.adventure.text.Component; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +@CommandInfo(name = "reply", description = "Replies to a player", usage = "/ ", aliases = {"r", "respond"}) +@CommandPerms(permission = "sunburst.command.reply", source = RequiredSource.PLAYER) +public class ReplyCMD extends SunburstCommand +{ + @Override + public Component execute(@NotNull CommandSender sender, @Nullable Player player, String[] args) + { + if (args.length < 1) + { + return usage(); + } + ISunburstPlayer sunburstPlayer = plugin.getObjectHolder().getStorageSystem().getPlayer(player.getUniqueId()); + + String message = StringUtils.join(args, " "); + MessageData data = sunburstPlayer.messageData(); + if (data == null) + { + return confMsg("messengerNotFound"); + } + UUID uuid = data.getSender() != null && data.getSender().equals(player.getUniqueId()) ? data.getReceiver() : data.getSender(); + CommandSender target; + if (uuid == null) + { + target = Bukkit.getConsoleSender(); + Bukkit.getConsoleSender().sendMessage(confMsg("messageReceived", target.getName(), "CONSOLE", message)); + } else + { + target = Bukkit.getPlayer(uuid); + if (target == null) + { + return confMsg("playerNotFound"); + } + target.sendMessage(confMsg("messageReceived", sender.getName(), target.getName(), message)); + } + return confMsg("messageSent", sender.getName(), target.getName(), message); + } +} diff --git a/server/src/main/java/dev/plex/player/SunburstPlayer.java b/server/src/main/java/dev/plex/player/SunburstPlayer.java index 1707398..e4b0d26 100644 --- a/server/src/main/java/dev/plex/player/SunburstPlayer.java +++ b/server/src/main/java/dev/plex/player/SunburstPlayer.java @@ -1,5 +1,6 @@ package dev.plex.player; +import dev.plex.messaging.MessageData; import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -16,6 +17,8 @@ public class SunburstPlayer implements ISunburstPlayer private Component displayName; + private transient MessageData messageData; + private boolean godMode; private boolean muted; private boolean teleportToggled; @@ -76,6 +79,12 @@ public class SunburstPlayer implements ISunburstPlayer return socialSpy; } + @Override + public MessageData messageData() + { + return messageData; + } + @Override public void displayName(Component displayName) { @@ -116,4 +125,10 @@ public class SunburstPlayer implements ISunburstPlayer { this.socialSpy = socialSpy; } + + @Override + public void messageData(MessageData messageData) + { + this.messageData = messageData; + } } diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index 5774a9d..eec0292 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -8,6 +8,7 @@ noPermission: "You lack the permission node {0}" consoleOnly: "This command may only be used from console" playerOnly: "This command may only be used in-game" +playerNotFound: "This player is not online" # 0 - The command usage commandCheckPlayer: "This command can only be used from console. The usage is {0}" @@ -30,4 +31,15 @@ nicknameSetOther: "You have set {0}'s nickname to {1}" # 0 - Player username # 1 - Message -chatFormat: "{0}: {1}" \ No newline at end of file +chatFormat: "{0}: {1}" + +# 0 - The sender +# 1 - The player who received +# 2 - The message +messageReceived: "{0} ---> ME: {2}" + +# 0 - The sender +# 1 - The player who received +# 2 - The message +messageSent: "ME ---> {1}: {2}" +messengerNotFound: "You have not messaged anyone!" \ No newline at end of file