From 65996d02073d3a8ad5b83b920544722342f47d8e Mon Sep 17 00:00:00 2001 From: SnowzNZ <98007575+SnowzNZ@users.noreply.github.com> Date: Sun, 7 Jul 2024 10:48:12 +1200 Subject: [PATCH 1/3] add /msgtoggle --- .../java/com/oskarsmc/message/Message.java | 2 + .../message/command/MessageCommand.java | 16 +++-- .../message/command/MessageToggleCommand.java | 59 +++++++++++++++++++ .../message/logic/MessageHandler.java | 1 + .../oskarsmc/message/util/MessageModule.java | 2 + src/main/resources/translations.json | 10 +++- src/main/resources/velocity-plugin.json | 3 +- 7 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java diff --git a/src/main/java/com/oskarsmc/message/Message.java b/src/main/java/com/oskarsmc/message/Message.java index a0cb216..b14d4a3 100644 --- a/src/main/java/com/oskarsmc/message/Message.java +++ b/src/main/java/com/oskarsmc/message/Message.java @@ -8,6 +8,7 @@ import com.google.inject.Key; import com.google.inject.TypeLiteral; import com.oskarsmc.message.command.MessageCommand; +import com.oskarsmc.message.command.MessageToggleCommand; import com.oskarsmc.message.command.ReplyCommand; import com.oskarsmc.message.command.SocialSpyCommand; import com.oskarsmc.message.configuration.MessageSettings; @@ -91,6 +92,7 @@ public void onProxyInitialization(ProxyInitializeEvent event) { // Commands injector.getInstance(MessageCommand.class); + injector.getInstance(MessageToggleCommand.class); injector.getInstance(SocialSpyCommand.class); injector.getInstance(ReplyCommand.class); diff --git a/src/main/java/com/oskarsmc/message/command/MessageCommand.java b/src/main/java/com/oskarsmc/message/command/MessageCommand.java index e08902e..c4d8ce9 100644 --- a/src/main/java/com/oskarsmc/message/command/MessageCommand.java +++ b/src/main/java/com/oskarsmc/message/command/MessageCommand.java @@ -13,6 +13,7 @@ import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.Component; import org.jetbrains.annotations.NotNull; /** @@ -36,12 +37,15 @@ public MessageCommand(@NotNull MessageSettings messageSettings, @NotNull Velocit .permission(new DefaultPermission("osmc.message.send")) .handler(context -> { Player receiver = context.get("player"); - - proxyServer.getEventManager().fire(new MessageEvent( - context.getSender(), - receiver, - context.get("message") - )).thenAccept(messageHandler::handleMessageEvent); + if (!messageHandler.canBeMessaged.getOrDefault(receiver, true) && !context.getSender().hasPermission("osmc.message.bypass")) { + context.getSender().sendMessage(Component.translatable("oskarsmc.messages.disabled")); + } else { + proxyServer.getEventManager().fire(new MessageEvent( + context.getSender(), + receiver, + context.get("message") + )).thenAccept(messageHandler::handleMessageEvent); + } }) ); } diff --git a/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java b/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java new file mode 100644 index 0000000..04f7e1f --- /dev/null +++ b/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java @@ -0,0 +1,59 @@ +package com.oskarsmc.message.command; + +import cloud.commandframework.Command; +import cloud.commandframework.velocity.VelocityCommandManager; +import com.google.inject.Inject; +import com.oskarsmc.message.configuration.MessageSettings; +import com.oskarsmc.message.logic.MessageHandler; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.NotNull; + +/** + * Message Toggle command + */ +public final class MessageToggleCommand { + @Inject + private MessageHandler messageHandler; + + /** + * Construct the social spy command. + * + * @param messageSettings Message Settings + * @param commandManager Command Manager + */ + @Inject + public MessageToggleCommand(@NotNull MessageSettings messageSettings, @NotNull VelocityCommandManager commandManager) { + Command.Builder builder = commandManager.commandBuilder("msgtoggle").permission("osmc.message.toggle"); + + commandManager.command(builder + .senderType(Player.class) + .literal("on") + .handler(context -> { + messageHandler.canBeMessaged.put(context.getSender(), true); + context.getSender().sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle.on")); + }) + ); + + commandManager.command(builder + .senderType(Player.class) + .literal("off") + .handler(context -> { + messageHandler.canBeMessaged.put(context.getSender(), false); + context.getSender().sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle.off")); + }) + ); + + commandManager.command(builder + .senderType(Player.class) + .handler(context -> { + boolean canBeMessaged = messageHandler.canBeMessaged.getOrDefault(context.getSender(), true); + messageHandler.canBeMessaged.put(context.getSender(), !canBeMessaged); + context.getSender().sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle." + (canBeMessaged ? "off" : "on"))); + + }) + ); + + } +} diff --git a/src/main/java/com/oskarsmc/message/logic/MessageHandler.java b/src/main/java/com/oskarsmc/message/logic/MessageHandler.java index fb1ba59..0bbef77 100644 --- a/src/main/java/com/oskarsmc/message/logic/MessageHandler.java +++ b/src/main/java/com/oskarsmc/message/logic/MessageHandler.java @@ -28,6 +28,7 @@ public final class MessageHandler { private final MessageSettings messageSettings; private final MiniMessage miniMessage = MiniMessage.miniMessage(); private final ConcurrentHashMap conversations = new ConcurrentHashMap<>(); + public final ConcurrentHashMap canBeMessaged = new ConcurrentHashMap<>(); /** * Conversation Watchers */ diff --git a/src/main/java/com/oskarsmc/message/util/MessageModule.java b/src/main/java/com/oskarsmc/message/util/MessageModule.java index abbe251..a5b6d0d 100644 --- a/src/main/java/com/oskarsmc/message/util/MessageModule.java +++ b/src/main/java/com/oskarsmc/message/util/MessageModule.java @@ -4,6 +4,7 @@ import com.google.inject.Provides; import com.google.inject.Singleton; import com.oskarsmc.message.command.MessageCommand; +import com.oskarsmc.message.command.MessageToggleCommand; import com.oskarsmc.message.command.ReplyCommand; import com.oskarsmc.message.command.SocialSpyCommand; import com.oskarsmc.message.configuration.MessageSettings; @@ -31,6 +32,7 @@ public MessageModule(MessageSettings messageSettings) { protected void configure() { bind(MessageSettings.class).toInstance(messageSettings); bind(MessageCommand.class).in(Singleton.class); + bind(MessageToggleCommand.class).in(Singleton.class); bind(ReplyCommand.class).in(Singleton.class); bind(SocialSpyCommand.class).in(Singleton.class); bind(MessageMetrics.class).in(Singleton.class); diff --git a/src/main/resources/translations.json b/src/main/resources/translations.json index 197e9f6..12acea5 100644 --- a/src/main/resources/translations.json +++ b/src/main/resources/translations.json @@ -8,7 +8,10 @@ "oskarsmc.message.command.common.argument.message-description": "The message to send to the player.", "oskarsmc.message.command.socialspy.on": "SocialSpy enabled.", "oskarsmc.message.command.socialspy.off": "SocialSpy disabled.", - "oskarsmc.message.command.common.self-sending-error": "You cannot send messages to yourself." + "oskarsmc.message.command.msgtoggle.on": "Messages enabled.", + "oskarsmc.message.command.msgtoggle.off": "Messages disabled.", + "oskarsmc.message.command.common.self-sending-error": "You cannot send messages to yourself.", + "oskarsmc.messages.disabled": "That player has messages disabled." } }, { @@ -18,7 +21,10 @@ "oskarsmc.message.command.common.argument.message-description": "El mensaje que se enviara al jugador.", "oskarsmc.message.command.socialspy.on": "SocialSpy habilitado.", "oskarsmc.message.command.socialspy.off": "SocialSpy deshabilitado.", - "oskarsmc.message.command.common.self-sending-error": "No puedes enviarte mensajes a ti mismo." + "oskarsmc.message.command.msgtoggle.on": "Mensajes habilitado.", + "oskarsmc.message.command.msgtoggle.off": "Messages deshabilitado.", + "oskarsmc.message.command.common.self-sending-error": "No puedes enviarte mensajes a ti mismo.", + "oskarsmc.messages.disabled": "Ese jugador tiene los mensajes deshabilitados." } } ] diff --git a/src/main/resources/velocity-plugin.json b/src/main/resources/velocity-plugin.json index d4e82de..e02a3af 100644 --- a/src/main/resources/velocity-plugin.json +++ b/src/main/resources/velocity-plugin.json @@ -6,7 +6,8 @@ "url": "https://software.oskarsmc.com/plugins/velocity/message/", "authors": [ "OskarsMC", - "OskarZyg" + "OskarZyg", + "SnowzNZ" ], "dependencies": [ { From 622d4c3fb4feae5e36eb0283a49fe506e47171f1 Mon Sep 17 00:00:00 2001 From: SnowzNZ <98007575+SnowzNZ@users.noreply.github.com> Date: Fri, 12 Jul 2024 18:44:17 +1200 Subject: [PATCH 2/3] Messages -> Mensajes --- src/main/resources/translations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/translations.json b/src/main/resources/translations.json index 12acea5..d8e58cd 100644 --- a/src/main/resources/translations.json +++ b/src/main/resources/translations.json @@ -22,7 +22,7 @@ "oskarsmc.message.command.socialspy.on": "SocialSpy habilitado.", "oskarsmc.message.command.socialspy.off": "SocialSpy deshabilitado.", "oskarsmc.message.command.msgtoggle.on": "Mensajes habilitado.", - "oskarsmc.message.command.msgtoggle.off": "Messages deshabilitado.", + "oskarsmc.message.command.msgtoggle.off": "Mensajes deshabilitado.", "oskarsmc.message.command.common.self-sending-error": "No puedes enviarte mensajes a ti mismo.", "oskarsmc.messages.disabled": "Ese jugador tiene los mensajes deshabilitados." } From 235cbc768c76764c18028536571176049a6b0789 Mon Sep 17 00:00:00 2001 From: SnowzNZ <98007575+SnowzNZ@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:23:26 +1200 Subject: [PATCH 3/3] Save msgtoggle state in `userdata.yml` --- .../java/com/oskarsmc/message/Message.java | 2 + .../message/command/MessageCommand.java | 6 +- .../message/command/MessageToggleCommand.java | 36 ++++--- .../message/configuration/UserData.java | 98 +++++++++++++++++++ .../message/logic/MessageHandler.java | 2 +- src/main/resources/userdata.yml | 0 6 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/oskarsmc/message/configuration/UserData.java create mode 100644 src/main/resources/userdata.yml diff --git a/src/main/java/com/oskarsmc/message/Message.java b/src/main/java/com/oskarsmc/message/Message.java index b14d4a3..72eea28 100644 --- a/src/main/java/com/oskarsmc/message/Message.java +++ b/src/main/java/com/oskarsmc/message/Message.java @@ -12,6 +12,7 @@ import com.oskarsmc.message.command.ReplyCommand; import com.oskarsmc.message.command.SocialSpyCommand; import com.oskarsmc.message.configuration.MessageSettings; +import com.oskarsmc.message.configuration.UserData; import com.oskarsmc.message.locale.CommandExceptionHandler; import com.oskarsmc.message.locale.TranslationManager; import com.oskarsmc.message.logic.MessageMetrics; @@ -51,6 +52,7 @@ public final class Message { @Subscribe public void onProxyInitialization(ProxyInitializeEvent event) { MessageSettings messageSettings = new MessageSettings(dataFolder, logger); + UserData userData = new UserData(dataFolder, logger); injector = injector.createChildInjector( new CloudInjectionModule<>( diff --git a/src/main/java/com/oskarsmc/message/command/MessageCommand.java b/src/main/java/com/oskarsmc/message/command/MessageCommand.java index c4d8ce9..3c666cc 100644 --- a/src/main/java/com/oskarsmc/message/command/MessageCommand.java +++ b/src/main/java/com/oskarsmc/message/command/MessageCommand.java @@ -7,6 +7,7 @@ import cloud.commandframework.velocity.arguments.PlayerArgument; import com.google.inject.Inject; import com.oskarsmc.message.configuration.MessageSettings; +import com.oskarsmc.message.configuration.UserData; import com.oskarsmc.message.event.MessageEvent; import com.oskarsmc.message.logic.MessageHandler; import com.oskarsmc.message.util.DefaultPermission; @@ -26,9 +27,10 @@ public final class MessageCommand { * @param commandManager Command Manager * @param proxyServer Proxy Server * @param messageHandler Message Handler + * @param userData User Data */ @Inject - public MessageCommand(@NotNull MessageSettings messageSettings, @NotNull VelocityCommandManager commandManager, ProxyServer proxyServer, MessageHandler messageHandler) { + public MessageCommand(@NotNull MessageSettings messageSettings, @NotNull VelocityCommandManager commandManager, ProxyServer proxyServer, MessageHandler messageHandler, UserData userData) { Command.Builder builder = commandManager.commandBuilder("message", messageSettings.messageAliases().toArray(new String[0])); commandManager.command(builder @@ -37,7 +39,7 @@ public MessageCommand(@NotNull MessageSettings messageSettings, @NotNull Velocit .permission(new DefaultPermission("osmc.message.send")) .handler(context -> { Player receiver = context.get("player"); - if (!messageHandler.canBeMessaged.getOrDefault(receiver, true) && !context.getSender().hasPermission("osmc.message.bypass")) { + if (!userData.getUserMessageState(receiver.getUniqueId()) && !context.getSender().hasPermission("osmc.message.bypass")) { context.getSender().sendMessage(Component.translatable("oskarsmc.messages.disabled")); } else { proxyServer.getEventManager().fire(new MessageEvent( diff --git a/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java b/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java index 04f7e1f..08e942c 100644 --- a/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java +++ b/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java @@ -3,36 +3,37 @@ import cloud.commandframework.Command; import cloud.commandframework.velocity.VelocityCommandManager; import com.google.inject.Inject; -import com.oskarsmc.message.configuration.MessageSettings; -import com.oskarsmc.message.logic.MessageHandler; +import com.oskarsmc.message.configuration.UserData; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; import net.kyori.adventure.text.Component; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + /** * Message Toggle command */ public final class MessageToggleCommand { - @Inject - private MessageHandler messageHandler; /** - * Construct the social spy command. + * Construct the message toggle command. * - * @param messageSettings Message Settings - * @param commandManager Command Manager + * @param commandManager Command Manager + * @param userData User Data */ @Inject - public MessageToggleCommand(@NotNull MessageSettings messageSettings, @NotNull VelocityCommandManager commandManager) { + public MessageToggleCommand(@NotNull VelocityCommandManager commandManager, UserData userData) { Command.Builder builder = commandManager.commandBuilder("msgtoggle").permission("osmc.message.toggle"); commandManager.command(builder .senderType(Player.class) .literal("on") .handler(context -> { - messageHandler.canBeMessaged.put(context.getSender(), true); - context.getSender().sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle.on")); + Player player = (Player) context.getSender(); + UUID playerUUID = player.getUniqueId(); + userData.saveUserMessageState(playerUUID, true); + player.sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle.on")); }) ); @@ -40,18 +41,21 @@ public MessageToggleCommand(@NotNull MessageSettings messageSettings, @NotNull V .senderType(Player.class) .literal("off") .handler(context -> { - messageHandler.canBeMessaged.put(context.getSender(), false); - context.getSender().sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle.off")); + Player player = (Player) context.getSender(); + UUID playerUUID = player.getUniqueId(); + userData.saveUserMessageState(playerUUID, false); + player.sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle.off")); }) ); commandManager.command(builder .senderType(Player.class) .handler(context -> { - boolean canBeMessaged = messageHandler.canBeMessaged.getOrDefault(context.getSender(), true); - messageHandler.canBeMessaged.put(context.getSender(), !canBeMessaged); - context.getSender().sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle." + (canBeMessaged ? "off" : "on"))); - + Player player = (Player) context.getSender(); + UUID playerId = player.getUniqueId(); + boolean canBeMessaged = userData.getUserMessageState(playerId); + userData.saveUserMessageState(playerId, !canBeMessaged); + player.sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle." + (canBeMessaged ? "off" : "on"))); }) ); diff --git a/src/main/java/com/oskarsmc/message/configuration/UserData.java b/src/main/java/com/oskarsmc/message/configuration/UserData.java new file mode 100644 index 0000000..dae245f --- /dev/null +++ b/src/main/java/com/oskarsmc/message/configuration/UserData.java @@ -0,0 +1,98 @@ +package com.oskarsmc.message.configuration; + +import com.google.inject.Inject; +import com.velocitypowered.api.plugin.annotation.DataDirectory; +import ninja.leaping.configurate.ConfigurationNode; +import ninja.leaping.configurate.yaml.YAMLConfigurationLoader; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.UUID; + +/** + * User Data class + */ +public final class UserData { + private final Path dataFolder; + private final Path file; + + /** + * Construct userdata. + * + * @param dataFolder Data Folder + * @param logger Logger + */ + @Inject + public UserData(@DataDirectory @NotNull Path dataFolder, Logger logger) { + this.dataFolder = dataFolder; + this.file = this.dataFolder.resolve("userdata.yml"); + + createUserDataFile(); + } + + /** + * Save the user message state. + * + * @param playerUUID Player UUID + * @param canBeMessaged Can be messaged + */ + public void saveUserMessageState(UUID playerUUID, boolean canBeMessaged) { + final ConfigurationNode yaml = loadConfig(); + yaml.getNode("users", playerUUID.toString(), "canBeMessaged").setValue(canBeMessaged); + saveUserData(yaml); + } + + /** + * Get the user message state. + * + * @param playerUUID Player UUID + * @return Can be messaged + */ + public boolean getUserMessageState(UUID playerUUID) { + final ConfigurationNode yaml = loadConfig(); + return yaml.getNode("users", playerUUID.toString(), "canBeMessaged").getBoolean(true); + } + + private void createUserDataFile() { + if (!Files.exists(dataFolder)) { + try { + Files.createDirectory(dataFolder); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + if (!Files.exists(file)) { + try (InputStream in = MessageSettings.class.getResourceAsStream("/userdata.yml")) { + assert in != null; + Files.copy(in, file); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + private @NotNull Path userDataFile() { + return this.file; + } + + private ConfigurationNode loadConfig() { + try { + return YAMLConfigurationLoader.builder().setPath(this.file).build().load(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void saveUserData(ConfigurationNode yaml) { + try { + YAMLConfigurationLoader.builder().setPath(this.file).build().save(yaml); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/oskarsmc/message/logic/MessageHandler.java b/src/main/java/com/oskarsmc/message/logic/MessageHandler.java index 0bbef77..f8fc607 100644 --- a/src/main/java/com/oskarsmc/message/logic/MessageHandler.java +++ b/src/main/java/com/oskarsmc/message/logic/MessageHandler.java @@ -28,7 +28,7 @@ public final class MessageHandler { private final MessageSettings messageSettings; private final MiniMessage miniMessage = MiniMessage.miniMessage(); private final ConcurrentHashMap conversations = new ConcurrentHashMap<>(); - public final ConcurrentHashMap canBeMessaged = new ConcurrentHashMap<>(); + /** * Conversation Watchers */ diff --git a/src/main/resources/userdata.yml b/src/main/resources/userdata.yml new file mode 100644 index 0000000..e69de29