diff --git a/src/main/java/com/oskarsmc/message/Message.java b/src/main/java/com/oskarsmc/message/Message.java index a0cb216..72eea28 100644 --- a/src/main/java/com/oskarsmc/message/Message.java +++ b/src/main/java/com/oskarsmc/message/Message.java @@ -8,9 +8,11 @@ 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; +import com.oskarsmc.message.configuration.UserData; import com.oskarsmc.message.locale.CommandExceptionHandler; import com.oskarsmc.message.locale.TranslationManager; import com.oskarsmc.message.logic.MessageMetrics; @@ -50,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<>( @@ -91,6 +94,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..3c666cc 100644 --- a/src/main/java/com/oskarsmc/message/command/MessageCommand.java +++ b/src/main/java/com/oskarsmc/message/command/MessageCommand.java @@ -7,12 +7,14 @@ 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; 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; /** @@ -25,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 @@ -36,12 +39,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 (!userData.getUserMessageState(receiver.getUniqueId()) && !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..08e942c --- /dev/null +++ b/src/main/java/com/oskarsmc/message/command/MessageToggleCommand.java @@ -0,0 +1,63 @@ +package com.oskarsmc.message.command; + +import cloud.commandframework.Command; +import cloud.commandframework.velocity.VelocityCommandManager; +import com.google.inject.Inject; +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 { + + /** + * Construct the message toggle command. + * + * @param commandManager Command Manager + * @param userData User Data + */ + @Inject + 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 -> { + Player player = (Player) context.getSender(); + UUID playerUUID = player.getUniqueId(); + userData.saveUserMessageState(playerUUID, true); + player.sendMessage(Component.translatable("oskarsmc.message.command.msgtoggle.on")); + }) + ); + + commandManager.command(builder + .senderType(Player.class) + .literal("off") + .handler(context -> { + 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 -> { + 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 fb1ba59..f8fc607 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<>(); + /** * 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..d8e58cd 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": "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." } } ] diff --git a/src/main/resources/userdata.yml b/src/main/resources/userdata.yml new file mode 100644 index 0000000..e69de29 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": [ {