Skip to content

Commit

Permalink
Merge pull request #167 from beanbeanjuice/164-private-messaging
Browse files Browse the repository at this point in the history
Add Private Messaging
  • Loading branch information
beanbeanjuice committed Jun 5, 2024
2 parents b9d476e + 603fd89 commit c112373
Show file tree
Hide file tree
Showing 15 changed files with 360 additions and 10 deletions.
19 changes: 17 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,14 @@ use-helper: false

update-notifications: true

commands:
whisper-aliases:
- "spc-msg"
reply-aliases:
- "spc-r"

# DO NOT TOUCH THIS
file-version: 11
file-version: 12
```

**messages.yml**
Expand Down Expand Up @@ -177,6 +183,10 @@ minecraft:
enabled: true
default: "&e%player% &7moved from &c%from% &7to &a%to%&7."
no-from: "&e%player% &7moved &7to &a%to%&7."
whisper:
send: "&8[&dyou&8] &f⇒ &8[&d%receiver%&8] &9» &e%message%"
receive: "&8[&d%sender%&8] &f⇒ &8[&dyou&8] &9» &e%message%"
error: "&c/spc-whisper (user) (message)"
discord:
enabled: true
message: "**%server%** %player% » %message%"
Expand Down Expand Up @@ -245,7 +255,7 @@ console:
update-message: "&7There is an update! You are on &c%old%. New version is &a%new%&7: &6%link%"

# DO NOT TOUCH THIS
file-version: 7
file-version: 8
```

---
Expand All @@ -256,6 +266,8 @@ file-version: 7

* `/spc-reload` - Reloads the config files.
* `/spc-chat` - Lock/unlock the chat.
* `/spc-whipser` - Send a private message to someone.
* `/spc-reply` - Reply to a private message without specifying a user.

---

Expand All @@ -272,6 +284,7 @@ file-version: 7
* `simpleproxychat.toggle.chat` - Toggle proxy chat for a single server.
* `simpleproxychat.toggle.chat.all` - Toggle proxy chat for all servers.
* `simpleproxychat.reload` - Reload the config.
* `simpleproxychat.whisper` - Private messaging permissions.

---

Expand All @@ -287,6 +300,8 @@ file-version: 7
* `%from%` - The server the player just disconnected from. Uses the alias if one is specified.
* `%original_from%` - Same as `%from%`, but does not use the alias.
* `%player%` - The player's Minecraft username.
* `%sender%` - (PRIVATE MESSAGING ONLY) The person sending the private message.
* `%receiver%` - (PRIVATE MESSAGING ONLY) The person receiving the private message.
* `%user%` - The player's Discord username.
* `%nick%` - The player's Discord nickname.
* `%role%` - The player's Discord role.
Expand Down
4 changes: 0 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -237,13 +237,9 @@ hangarPublish {

tasks.withType<ShadowJar> {
minimize()
relocate("net.kyori", "com.beanbeanjuice.simpleproxychat.libs.net.kyori")
relocate("net.dv8tion", "com.beanbeanjuice.simpleproxychat.libs.net.dv8tion")
relocate("dev.dejvokep", "com.beanbeanjuice.simpleproxychat.libs.dev.dejvokep")
relocate("org.bstats", "com.beanbeanjuice.simpleproxychat.libs.org.bstats")
relocate("joda-time", "com.beanbeanjuice.simpleproxychat.libs.joda-time")
relocate("org.apache.maven", "com.beanbeanjuice.simpleproxychat.libs.org.apache.maven")
relocate("kotlin", "com.beanbeanjuice.simpleproxychat.kotlin.libs")
archiveBaseName.set(rootProject.name)
archiveClassifier.set("")
archiveVersion.set(version as String)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import com.beanbeanjuice.simpleproxychat.commands.bungee.BungeeChatToggleCommand;
import com.beanbeanjuice.simpleproxychat.commands.bungee.BungeeReloadCommand;
import com.beanbeanjuice.simpleproxychat.commands.bungee.BungeeReplyCommand;
import com.beanbeanjuice.simpleproxychat.commands.bungee.BungeeWhisperCommand;
import com.beanbeanjuice.simpleproxychat.socket.bungee.BungeeCordPluginMessagingListener;
import com.beanbeanjuice.simpleproxychat.utility.Helper;
import com.beanbeanjuice.simpleproxychat.utility.WhisperHandler;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import com.beanbeanjuice.simpleproxychat.utility.epoch.EpochHelper;
import com.beanbeanjuice.simpleproxychat.utility.listeners.bungee.BungeeServerListener;
Expand Down Expand Up @@ -34,6 +37,7 @@ public final class SimpleProxyChatBungee extends Plugin {
@Getter private Bot discordBot;
@Getter private Metrics metrics;
@Getter private BungeeServerListener serverListener;
@Getter private WhisperHandler whisperHandler;

@Override
public void onEnable() {
Expand Down Expand Up @@ -164,11 +168,15 @@ private void registerListeners() {

serverListener = new BungeeServerListener(this, chatHandler);
this.getProxy().getPluginManager().registerListener(this, serverListener);

whisperHandler = new WhisperHandler();
}

private void registerCommands() {
this.getProxy().getPluginManager().registerCommand(this, new BungeeReloadCommand(this, config));
this.getProxy().getPluginManager().registerCommand(this, new BungeeChatToggleCommand(this, config));
this.getProxy().getPluginManager().registerCommand(this, new BungeeWhisperCommand(this, config, config.getAsArrayList(ConfigDataKey.WHISPER_ALIASES).toArray(new String[0])));
this.getProxy().getPluginManager().registerCommand(this, new BungeeReplyCommand(this, config, config.getAsArrayList(ConfigDataKey.REPLY_ALIASES).toArray(new String[0])));
}

private void startPluginMessaging() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import com.beanbeanjuice.simpleproxychat.commands.velocity.VelocityChatToggleCommand;
import com.beanbeanjuice.simpleproxychat.commands.velocity.VelocityReloadCommand;
import com.beanbeanjuice.simpleproxychat.commands.velocity.VelocityReplyCommand;
import com.beanbeanjuice.simpleproxychat.commands.velocity.VelocityWhisperCommand;
import com.beanbeanjuice.simpleproxychat.socket.velocity.VelocityPluginMessagingListener;
import com.beanbeanjuice.simpleproxychat.utility.UpdateChecker;
import com.beanbeanjuice.simpleproxychat.utility.WhisperHandler;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import com.beanbeanjuice.simpleproxychat.utility.epoch.EpochHelper;
import com.beanbeanjuice.simpleproxychat.utility.status.ServerStatusManager;
Expand Down Expand Up @@ -42,6 +45,7 @@ public class SimpleProxyChatVelocity {
@Getter private final Config config;
@Getter private final EpochHelper epochHelper;
@Getter private Bot discordBot;
@Getter private WhisperHandler whisperHandler;
private Metrics metrics;
private VelocityServerListener serverListener;

Expand Down Expand Up @@ -197,6 +201,8 @@ private void registerListeners() {

this.proxyServer.getEventManager().register(this, new VelocityPluginMessagingListener(this, serverListener));
this.proxyServer.getChannelRegistrar().register(VelocityPluginMessagingListener.IDENTIFIER);

whisperHandler = new WhisperHandler();
}

private void registerCommands() {
Expand All @@ -212,8 +218,20 @@ private void registerCommands() {
.plugin(this)
.build();

CommandMeta whisperCommand = commandManager.metaBuilder("spc-whisper")
.aliases(config.getAsArrayList(ConfigDataKey.WHISPER_ALIASES).toArray(new String[0]))
.plugin(this)
.build();

CommandMeta replyCommand = commandManager.metaBuilder("spc-reply")
.aliases(config.getAsArrayList(ConfigDataKey.REPLY_ALIASES).toArray(new String[0]))
.plugin(this)
.build();

commandManager.register(reloadCommand, new VelocityReloadCommand(this, config));
commandManager.register(chatToggleCommand, new VelocityChatToggleCommand(this, config));
commandManager.register(whisperCommand, new VelocityWhisperCommand(this, config));
commandManager.register(replyCommand, new VelocityReplyCommand(this, config));
}

@Subscribe(order = PostOrder.LAST)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.beanbeanjuice.simpleproxychat.commands.bungee;

import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
import com.beanbeanjuice.simpleproxychat.utility.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.Command;

import java.util.ArrayList;
import java.util.List;

public class BungeeReplyCommand extends Command {

private final SimpleProxyChatBungee plugin;
private final Config config;

public BungeeReplyCommand(SimpleProxyChatBungee plugin, Config config, String... aliases) {
super("Spc-reply", Permission.USE_WHISPER.getPermissionNode(), aliases);
this.plugin = plugin;;
this.config = config;
}

@Override
public void execute(CommandSender sender, String[] args) {
plugin.getWhisperHandler().getLink(sender.getName()).map((playerName) -> plugin.getProxy().getPlayer(playerName)).ifPresentOrElse(
(receiver) -> {
String message = Helper.translateLegacyCodes(String.join(" ", args));

String senderString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_SEND);
String receiverString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_RECEIVE);

List<Tuple<String, String>> replacements = new ArrayList<>();
replacements.add(Tuple.of("sender", sender.getName()));
replacements.add(Tuple.of("receiver", receiver.getName()));
replacements.add(Tuple.of("message", message));
replacements.add(Tuple.of("plugin-prefix", config.getAsString(ConfigDataKey.PLUGIN_PREFIX)));

senderString = Helper.replaceKeys(senderString, replacements);
receiverString = Helper.replaceKeys(receiverString, replacements);

sender.sendMessage(Helper.convertToBungee(senderString));
receiver.sendMessage(Helper.convertToBungee(receiverString));

plugin.getWhisperHandler().set(sender.getName(), receiver.getName());
},
() -> sender.sendMessage(Helper.convertToBungee(config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_ERROR)))
);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.beanbeanjuice.simpleproxychat.commands.bungee;

import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
import com.beanbeanjuice.simpleproxychat.utility.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.TabExecutor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class BungeeWhisperCommand extends Command implements TabExecutor {

private final SimpleProxyChatBungee plugin;
private final Config config;

public BungeeWhisperCommand(SimpleProxyChatBungee plugin, Config config, String... aliases) {
super("Spc-whisper", Permission.USE_WHISPER.getPermissionNode(), aliases);
this.plugin = plugin;
this.config = config;
}

@Override
public void execute(CommandSender sender, String[] args) {
if (args.length < 2) {
sender.sendMessage(Helper.convertToBungee(config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_ERROR)));
return;
}

ProxiedPlayer receiver = plugin.getProxy().getPlayer(args[0]);
if (receiver == null) {
sender.sendMessage(Helper.convertToBungee(config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_ERROR)));
return;
}

String message = Helper.translateLegacyCodes(Arrays.stream(args).skip(1).collect(Collectors.joining(" ")));

String senderString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_SEND);
String receiverString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_RECEIVE);

List<Tuple<String, String>> replacements = new ArrayList<>();
replacements.add(Tuple.of("sender", sender.getName()));
replacements.add(Tuple.of("receiver", receiver.getName()));
replacements.add(Tuple.of("message", message));
replacements.add(Tuple.of("plugin-prefix", config.getAsString(ConfigDataKey.PLUGIN_PREFIX)));

senderString = Helper.replaceKeys(senderString, replacements);
receiverString = Helper.replaceKeys(receiverString, replacements);

sender.sendMessage(Helper.convertToBungee(senderString));
receiver.sendMessage(Helper.convertToBungee(receiverString));

plugin.getWhisperHandler().set(sender.getName(), receiver.getName());
}

@Override
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
if (args.length <= 1)
return plugin.getProxy().getPlayers().stream().map(ProxiedPlayer::getName).filter((username) -> {
if (args.length == 1) {
return username.toLowerCase().startsWith(args[0].toLowerCase());
}
return true;
}).toList();

return List.of();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import com.velocitypowered.api.command.SimpleCommand;
import com.velocitypowered.api.proxy.Player;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.beanbeanjuice.simpleproxychat.commands.velocity;

import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
import com.beanbeanjuice.simpleproxychat.utility.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import com.velocitypowered.api.command.SimpleCommand;
import com.velocitypowered.api.proxy.Player;

import java.util.ArrayList;
import java.util.List;

public class VelocityReplyCommand implements SimpleCommand {

private final SimpleProxyChatVelocity plugin;
private final Config config;

public VelocityReplyCommand(SimpleProxyChatVelocity plugin, Config config) {
this.plugin = plugin;
this.config = config;
}

@Override
public void execute(Invocation invocation) {
plugin.getProxyServer().getPlayer(plugin.getWhisperHandler().getLink(((Player) invocation.source()).getUsername()).orElse("")).ifPresentOrElse(
(receiver) -> {
String message = Helper.translateLegacyCodes(String.join(" ", invocation.arguments()));

String senderString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_SEND);
String receiverString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_RECEIVE);

List<Tuple<String, String>> replacements = new ArrayList<>();
replacements.add(Tuple.of("sender", ((Player) invocation.source()).getUsername()));
replacements.add(Tuple.of("receiver", receiver.getUsername()));
replacements.add(Tuple.of("message", message));
replacements.add(Tuple.of("plugin-prefix", config.getAsString(ConfigDataKey.PLUGIN_PREFIX)));

senderString = Helper.replaceKeys(senderString, replacements);
receiverString = Helper.replaceKeys(receiverString, replacements);

invocation.source().sendMessage(Helper.stringToComponent(senderString));
receiver.sendMessage(Helper.stringToComponent(receiverString));

plugin.getWhisperHandler().set(((Player) invocation.source()).getUsername(), receiver.getUsername());
},
() -> invocation.source().sendMessage(Helper.stringToComponent(config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_ERROR)))
);
}

@Override
public boolean hasPermission(Invocation invocation) {
return invocation.source().hasPermission(Permission.USE_WHISPER.getPermissionNode());
}

}
Loading

0 comments on commit c112373

Please sign in to comment.