Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/com/oskarsmc/message/Message.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<>(
Expand Down Expand Up @@ -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);

Expand Down
20 changes: 13 additions & 7 deletions src/main/java/com/oskarsmc/message/command/MessageCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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<CommandSource> commandManager, ProxyServer proxyServer, MessageHandler messageHandler) {
public MessageCommand(@NotNull MessageSettings messageSettings, @NotNull VelocityCommandManager<CommandSource> commandManager, ProxyServer proxyServer, MessageHandler messageHandler, UserData userData) {
Command.Builder<CommandSource> builder = commandManager.commandBuilder("message", messageSettings.messageAliases().toArray(new String[0]));

commandManager.command(builder
Expand All @@ -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);
}
})
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<CommandSource> commandManager, UserData userData) {
Command.Builder<CommandSource> 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")));
})
);

}
}
98 changes: 98 additions & 0 deletions src/main/java/com/oskarsmc/message/configuration/UserData.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public final class MessageHandler {
private final MessageSettings messageSettings;
private final MiniMessage miniMessage = MiniMessage.miniMessage();
private final ConcurrentHashMap<Player, Player> conversations = new ConcurrentHashMap<>();

/**
* Conversation Watchers
*/
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/oskarsmc/message/util/MessageModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 8 additions & 2 deletions src/main/resources/translations.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
},
{
Expand All @@ -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."
}
}
]
Expand Down
Empty file added src/main/resources/userdata.yml
Empty file.
3 changes: 2 additions & 1 deletion src/main/resources/velocity-plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"url": "https://software.oskarsmc.com/plugins/velocity/message/",
"authors": [
"OskarsMC",
"OskarZyg"
"OskarZyg",
"SnowzNZ"
],
"dependencies": [
{
Expand Down