diff --git a/README.md b/README.md
index c7b91ed..195601a 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
- A simple plugin to allow global cross-server communication and messaging with support for PlaceholderAPI, LuckPerms, LiteBans, AdvancedBan, NetworkManager, and Discord.
+ This is a Bungeecord Chat Sync, Velocity Chat Sync, and Proxy Chat Sync plugin. It is a simple plugin to allow global cross-server communication and messaging with support for PlaceholderAPI, LuckPerms, LiteBans, AdvancedBan, NetworkManager, and Discord.
---
@@ -90,9 +90,11 @@ BOT-TOKEN: "TOKEN_HERE"
CHANNEL-ID: "GLOBAL_CHANNEL_ID"
bot-activity:
- # Valid Types: PLAYING, STREAMING, LISTENING, WATCHING, COMPETING
- type: "COMPETING"
- text: "SimpleProxyChat by beanbeanjuice"
+ # Valid Types: ONLINE, DO_NOT_DISTURB, IDLE, INVISIBLE
+ status: ONLINE
+ # Valid Types: PLAYING, STREAMING, LISTENING, WATCHING, COMPETING
+ type: "COMPETING"
+ text: "SimpleProxyChat by beanbeanjuice"
# The amount of seconds to check if a server is online/offline.
# Smaller numbers can cause errors. Beware.
@@ -102,9 +104,9 @@ server-update-interval: 3
# It MUST be the same name you have in your bungee/velocity config.
# Simply set it to disabled: disabled to disable it.
aliases:
- ServerInConfigExample: ServerAliasExample
- hub: Hub1
- smp: smp1
+ ServerInConfigExample: ServerAliasExample
+ hub: Hub1
+ smp: smp1
# Whether to use the permission system.
# Some permissions (denoted with ➕) are always active even if this is false.
@@ -117,6 +119,9 @@ aliases:
# 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.ban - Ban a player from the proxy. ➕
+# simpleproxychat.unban - Unban a player from the proxy. ➕
+# simpleproxychat.whisper - Whisper to another player on the proxy. ➕
use-permissions: false
# Only messages that start with this character will be sent through the plugin.
@@ -134,18 +139,32 @@ use-fake-messages: true
# Format: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
# Timezone: https://www.joda.org/joda-time/timezones.html
timestamp:
- # If your server is prone to getting off-sync on the time you can use an API.
- # WARNING: Using the API will make messages somewhat longer to send.
- # Additionally, the maximum accuracy will only be up to 1 minute, rather than seconds.
- use-api: false
- format: "hh:mm a"
- timezone: "America/Los_Angeles"
+ # If your server is prone to getting off-sync on the time you can use an API.
+ # WARNING: Using the API will make messages somewhat longer to send.
+ # Additionally, the maximum accuracy will only be up to 1 minute, rather than seconds.
+ use-api: false
+ format: "hh:mm a"
+ timezone: "America/Los_Angeles"
# True if you will be using the helper plugin.
use-helper: false
+update-notifications: true
+
+# It is HIGHLY recommended to use a more robust proxy-wide banning system such as LiteBans or AdvancedBan.
+# However, if you would rather a light-weight, simple, banning system. You can enable it here.
+# A FULL PROXY RESTART IS REQUIRED TO USE THIS.
+use-simple-proxy-chat-banning-system: false
+
+# These require a restart in order to take place.
+commands:
+ whisper-aliases:
+ - "spc-msg"
+ reply-aliases:
+ - "spc-r"
+
# DO NOT TOUCH THIS
-file-version: 10
+file-version: 12
```
**messages.yml**
@@ -171,10 +190,15 @@ minecraft:
chat:
enabled: true
message: "&8[&3%server%&8] &e%player% &9» &7%message%"
+ vanished: "&cYou cannot send proxy messages while vanished. Your message must end with a '&e/&c' to speak."
switch:
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%"
@@ -197,6 +221,11 @@ minecraft:
all:
locked: "%plugin-prefix% &cAll servers will no longer send proxy chat messages."
unlocked: "%plugin-prefix% &aAll servers will now send proxy chat messages."
+ proxy-ban:
+ usage: "%plugin-prefix% &c/(un)ban (player)"
+ banned: "%plugin-prefix% &c%player% &7has been banned."
+ unbanned: "%plugin-prefix% &c%player% &7has been unbanned."
+ login-message: "&cYou have been banned from the proxy."
# Discord Stuff
discord:
@@ -243,7 +272,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
```
---
@@ -254,6 +283,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.
---
@@ -270,6 +301,9 @@ 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.ban` - Ban someone.
+* `simpleproxychat.unban` - Unban someone.
+* `simpleproxychat.whisper` - Private messaging permissions.
---
@@ -285,6 +319,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.
diff --git a/SimpleProxyChatHelper/build.gradle.kts b/SimpleProxyChatHelper/build.gradle.kts
index 4fbb63d..bc57ba9 100644
--- a/SimpleProxyChatHelper/build.gradle.kts
+++ b/SimpleProxyChatHelper/build.gradle.kts
@@ -6,7 +6,7 @@ plugins {
}
group = "com.beanbeanjuice"
-version = "0.0.1"
+version = "0.0.2"
java {
sourceCompatibility = JavaVersion.VERSION_1_8
@@ -47,6 +47,12 @@ dependencies {
// Lombok
compileOnly("org.projectlombok", "lombok", "1.18.32")
annotationProcessor("org.projectlombok", "lombok", "1.18.32")
+
+ // bStats
+ implementation("org.bstats", "bstats-bukkit", "3.0.2")
+
+ // Artifact Version Comparison
+ implementation("org.apache.maven", "maven-artifact", "3.9.7")
}
configure("processResources") {
@@ -61,6 +67,8 @@ inline fun Project.configure(name: String, configuration: C.() -> Un
tasks.withType {
minimize()
+ relocate("org.bstats", "com.beanbeanjuice.simpleproxychathelper.libs.org.bstats")
+ relocate("org.apache.maven", "com.beanbeanjuice.simpleproxychathelper.libs.org.apache.maven")
archiveBaseName.set(rootProject.name)
archiveClassifier.set("")
archiveVersion.set(version as String)
diff --git a/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/SimpleProxyChatHelper.java b/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/SimpleProxyChatHelper.java
index bf8010e..40bae55 100644
--- a/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/SimpleProxyChatHelper.java
+++ b/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/SimpleProxyChatHelper.java
@@ -5,14 +5,13 @@
import com.beanbeanjuice.simpleproxychathelper.utility.UpdateChecker;
import lombok.Getter;
-import net.md_5.bungee.api.ChatMessageType;
+import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
-import java.util.concurrent.TimeUnit;
-
public final class SimpleProxyChatHelper extends JavaPlugin {
+ private Metrics metrics;
@Getter private Config options;
@Getter private static final String subChannel = "SimpleProxyChat";
@@ -28,6 +27,7 @@ public void onEnable() {
this.getLogger().info("The plugin has been enabled!");
+ metrics = new Metrics(this, 22052);
startUpdateChecker();
}
@@ -46,7 +46,7 @@ private void startUpdateChecker() {
(message) -> this.getLogger().info(message)
);
- Bukkit.getScheduler().runTaskTimerAsynchronously(this, updateChecker::checkUpdate, 0, 20 * 60 * 12);
+ Bukkit.getScheduler().runTaskTimerAsynchronously(this, updateChecker::checkUpdate, 0, 864000); // 864000 ticks = 12 hours
}
private void setupPluginMessaging() {
diff --git a/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/utility/UpdateChecker.java b/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/utility/UpdateChecker.java
index fd2b299..5fe142c 100644
--- a/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/utility/UpdateChecker.java
+++ b/SimpleProxyChatHelper/src/main/java/com/beanbeanjuice/simpleproxychathelper/utility/UpdateChecker.java
@@ -1,5 +1,7 @@
package com.beanbeanjuice.simpleproxychathelper.utility;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@@ -27,9 +29,9 @@ public Optional getUpdate() {
public void checkUpdate() {
getUpdate().ifPresent((spigotVersion) -> {
- if (currentVersion.equalsIgnoreCase(spigotVersion)) return;
+ if (compare(currentVersion, spigotVersion) >= 0) return;
- String message = String.format("[SimpleProxyChat] There is an update! You are on %s. The new one is %s! %s",
+ String message = String.format("There is an update! You are on %s. The new one is %s! %s",
currentVersion,
spigotVersion,
"https://www.spigotmc.org/resources/116966/");
@@ -38,4 +40,11 @@ public void checkUpdate() {
});
}
+ public static int compare(final String version1, final String version2) {
+ DefaultArtifactVersion v1 = new DefaultArtifactVersion(version1);
+ DefaultArtifactVersion v2 = new DefaultArtifactVersion(version2);
+
+ return v1.compareTo(v2);
+ }
+
}
diff --git a/SimpleProxyChatHelper/src/main/resources/plugin.yml b/SimpleProxyChatHelper/src/main/resources/plugin.yml
index 4f08346..ab13213 100644
--- a/SimpleProxyChatHelper/src/main/resources/plugin.yml
+++ b/SimpleProxyChatHelper/src/main/resources/plugin.yml
@@ -7,3 +7,4 @@ depend: [PlaceholderAPI]
authors: [beanbeanjuice]
description: A helper plugin for the SimpleProxyChat proxy plugin.
website: https://www.github.com/beanbeanjuice/SimpleProxyChat
+api-version: 1.20
diff --git a/build.gradle.kts b/build.gradle.kts
index 354d229..04f9480 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -10,7 +10,7 @@ plugins {
}
group = "com.beanbeanjuice"
-version = "0.4.2"
+version = "0.5.0"
java {
sourceCompatibility = JavaVersion.VERSION_17
@@ -101,6 +101,9 @@ dependencies {
// Timestamp
implementation("joda-time", "joda-time", "2.12.7")
+
+ // Artifact Version Comparison
+ implementation("org.apache.maven", "maven-artifact", "3.9.7")
}
configure("processResources") {
@@ -234,9 +237,9 @@ hangarPublish {
tasks.withType {
minimize()
- relocate("dev.dejvokep.boostedyaml", "com.beanbeanjuice.simpleproxychat.libs.dev.dejvokep.boostedyaml")
- relocate("org.bstats", "com.beanbeanjuice.simpleproxychat.libs.org.bstats")
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")
archiveBaseName.set(rootProject.name)
archiveClassifier.set("")
archiveVersion.set(version as String)
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatBungee.java b/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatBungee.java
index cad3595..7d3a5ce 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatBungee.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatBungee.java
@@ -1,9 +1,12 @@
package com.beanbeanjuice.simpleproxychat;
-import com.beanbeanjuice.simpleproxychat.commands.bungee.BungeeChatToggleCommand;
-import com.beanbeanjuice.simpleproxychat.commands.bungee.BungeeReloadCommand;
+import com.beanbeanjuice.simpleproxychat.commands.bungee.*;
+import com.beanbeanjuice.simpleproxychat.commands.bungee.ban.BungeeBanCommand;
+import com.beanbeanjuice.simpleproxychat.commands.bungee.ban.BungeeUnbanCommand;
import com.beanbeanjuice.simpleproxychat.socket.bungee.BungeeCordPluginMessagingListener;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.WhisperHandler;
+import com.beanbeanjuice.simpleproxychat.utility.BanHelper;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import com.beanbeanjuice.simpleproxychat.utility.epoch.EpochHelper;
import com.beanbeanjuice.simpleproxychat.utility.listeners.bungee.BungeeServerListener;
@@ -34,6 +37,8 @@ public final class SimpleProxyChatBungee extends Plugin {
@Getter private Bot discordBot;
@Getter private Metrics metrics;
@Getter private BungeeServerListener serverListener;
+ @Getter private WhisperHandler whisperHandler;
+ @Getter private BanHelper banHelper;
@Override
public void onEnable() {
@@ -73,8 +78,7 @@ public void onEnable() {
// bStats Stuff
this.getLogger().info("Starting bStats... (IF ENABLED)");
- int pluginId = 21146;
- this.metrics = new Metrics(this, pluginId);
+ this.metrics = new Metrics(this, 21146);
startPluginMessaging();
@@ -103,6 +107,8 @@ private void startUpdateChecker() {
config,
currentVersion,
(message) -> {
+ if (!config.getAsBoolean(ConfigDataKey.UPDATE_NOTIFICATIONS)) return;
+
this.getLogger().info(Helper.sanitize(message));
Component minimessage = MiniMessage.miniMessage().deserialize(config.getAsString(ConfigDataKey.PLUGIN_PREFIX) + message);
@@ -149,6 +155,15 @@ private void hookPlugins() {
config.overwrite(ConfigDataKey.NETWORKMANAGER_ENABLED, true);
getLogger().info("NetworkManager support has been enabled.");
}
+
+ // Registering the Simple Ban System
+ if (!config.getAsBoolean(ConfigDataKey.LITEBANS_ENABLED) && !config.getAsBoolean(ConfigDataKey.ADVANCEDBAN_ENABLED) && config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ getLogger().info("LiteBans and AdvancedBan not found. Using the built-in banning system for SimpleProxyChat...");
+ banHelper = new BanHelper(this.getDataFolder());
+ banHelper.initialize();
+ } else {
+ config.overwrite(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM, false);
+ }
}
private void registerListeners() {
@@ -163,11 +178,21 @@ 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])));
+
+ // Only enable when needed.
+ if (config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ this.getProxy().getPluginManager().registerCommand(this, new BungeeBanCommand(this));
+ this.getProxy().getPluginManager().registerCommand(this, new BungeeUnbanCommand(this));
+ }
}
private void startPluginMessaging() {
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatVelocity.java b/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatVelocity.java
index f63afdc..82682b9 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatVelocity.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/SimpleProxyChatVelocity.java
@@ -2,8 +2,15 @@
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.commands.velocity.ban.VelocityBanCommand;
+import com.beanbeanjuice.simpleproxychat.commands.velocity.ban.VelocityUnbanCommand;
+import com.beanbeanjuice.simpleproxychat.commands.velocity.*;
import com.beanbeanjuice.simpleproxychat.socket.velocity.VelocityPluginMessagingListener;
+import com.beanbeanjuice.simpleproxychat.utility.BanHelper;
import com.beanbeanjuice.simpleproxychat.utility.UpdateChecker;
+import com.beanbeanjuice.simpleproxychat.utility.helper.WhisperHandler;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import com.beanbeanjuice.simpleproxychat.utility.epoch.EpochHelper;
import com.beanbeanjuice.simpleproxychat.utility.status.ServerStatusManager;
@@ -11,7 +18,7 @@
import com.beanbeanjuice.simpleproxychat.chat.ChatHandler;
import com.beanbeanjuice.simpleproxychat.utility.listeners.velocity.VelocityServerListener;
import com.beanbeanjuice.simpleproxychat.discord.Bot;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
import com.velocitypowered.api.command.CommandManager;
@@ -30,6 +37,7 @@
import org.bstats.velocity.Metrics;
import org.slf4j.Logger;
+import java.io.File;
import java.nio.file.Path;
import java.util.concurrent.TimeUnit;
@@ -42,9 +50,13 @@ public class SimpleProxyChatVelocity {
@Getter private final Config config;
@Getter private final EpochHelper epochHelper;
@Getter private Bot discordBot;
+ @Getter private WhisperHandler whisperHandler;
+ @Getter private BanHelper banHelper;
private Metrics metrics;
private VelocityServerListener serverListener;
+ private final File dataDirectory;
+
@Inject
public SimpleProxyChatVelocity(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataDirectory, Metrics.Factory metricsFactory) {
this.proxyServer = proxyServer;
@@ -52,6 +64,7 @@ public SimpleProxyChatVelocity(ProxyServer proxyServer, Logger logger, @DataDire
this.metricsFactory = metricsFactory;
this.getLogger().info("The plugin is starting.");
+ this.dataDirectory = dataDirectory.toFile();
this.config = new Config(dataDirectory.toFile());
this.config.initialize();
@@ -98,8 +111,7 @@ public void onProxyInitialization(ProxyInitializeEvent event) {
// bStats Stuff
this.getLogger().info("Starting bStats... (IF ENABLED)");
- int pluginId = 21147;
- this.metrics = metricsFactory.make(this, pluginId);
+ this.metrics = metricsFactory.make(this, 21147);
// Plugin has started.
this.getLogger().info("The plugin has been started.");
@@ -130,6 +142,7 @@ private void startUpdateChecker() {
config,
currentVersion,
(message) -> {
+ if (!config.getAsBoolean(ConfigDataKey.UPDATE_NOTIFICATIONS)) return;
this.getLogger().info(Helper.sanitize(message));
this.proxyServer.getAllPlayers()
.stream()
@@ -176,6 +189,15 @@ private void hookPlugins() {
config.overwrite(ConfigDataKey.NETWORKMANAGER_ENABLED, true);
this.getLogger().info("NetworkManager support has been enabled.");
}
+
+ // Registering the Simple Banning System
+ if (!config.getAsBoolean(ConfigDataKey.LITEBANS_ENABLED) && !config.getAsBoolean(ConfigDataKey.ADVANCEDBAN_ENABLED) && config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ getLogger().info("LiteBans and AdvancedBan not found. Using the built-in banning system for SimpleProxyChat...");
+ banHelper = new BanHelper(dataDirectory);
+ banHelper.initialize();
+ } else {
+ config.overwrite(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM, false);
+ }
}
private void registerListeners() {
@@ -197,6 +219,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() {
@@ -212,8 +236,36 @@ private void registerCommands() {
.plugin(this)
.build();
- commandManager.register(reloadCommand, new VelocityReloadCommand(this, config));
- commandManager.register(chatToggleCommand, new VelocityChatToggleCommand(this, config));
+ 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();
+
+ CommandMeta banCommand = commandManager.metaBuilder("spc-ban")
+ .aliases("spcban")
+ .plugin(this)
+ .build();
+
+ CommandMeta unbanCommand = commandManager.metaBuilder("spc-unban")
+ .aliases("spcunban")
+ .plugin(this)
+ .build();
+
+ commandManager.register(reloadCommand, new VelocityReloadCommand(this));
+ commandManager.register(chatToggleCommand, new VelocityChatToggleCommand(this));
+ commandManager.register(whisperCommand, new VelocityWhisperCommand(this));
+ commandManager.register(replyCommand, new VelocityReplyCommand(this));
+
+ // Only enable if the Simple Banning System is enabled.
+ if (config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ commandManager.register(banCommand, new VelocityBanCommand(this));
+ commandManager.register(unbanCommand, new VelocityUnbanCommand(this));
+ }
}
@Subscribe(order = PostOrder.LAST)
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/chat/ChatHandler.java b/src/main/java/com/beanbeanjuice/simpleproxychat/chat/ChatHandler.java
index 3e31aba..7fd1e79 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/chat/ChatHandler.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/chat/ChatHandler.java
@@ -3,7 +3,7 @@
import com.beanbeanjuice.simpleproxychat.discord.Bot;
import com.beanbeanjuice.simpleproxychat.discord.DiscordChatHandler;
import com.beanbeanjuice.simpleproxychat.socket.ChatMessageData;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeChatToggleCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeChatToggleCommand.java
index 071bd8e..bf44c00 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeChatToggleCommand.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeChatToggleCommand.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.commands.bungee;
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeReloadCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeReloadCommand.java
index 7d6d68a..2b7a853 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeReloadCommand.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeReloadCommand.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.commands.bungee;
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeReplyCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeReplyCommand.java
new file mode 100644
index 0000000..0a83cc0
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeReplyCommand.java
@@ -0,0 +1,54 @@
+package com.beanbeanjuice.simpleproxychat.commands.bungee;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
+import com.beanbeanjuice.simpleproxychat.utility.helper.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.COMMAND_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> 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)))
+ );
+
+ }
+
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeWhisperCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeWhisperCommand.java
new file mode 100644
index 0000000..15948cd
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/BungeeWhisperCommand.java
@@ -0,0 +1,75 @@
+package com.beanbeanjuice.simpleproxychat.commands.bungee;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
+import com.beanbeanjuice.simpleproxychat.utility.helper.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.COMMAND_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> 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 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();
+ }
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/ban/BungeeBanCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/ban/BungeeBanCommand.java
new file mode 100644
index 0000000..c303fc0
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/ban/BungeeBanCommand.java
@@ -0,0 +1,65 @@
+package com.beanbeanjuice.simpleproxychat.commands.bungee.ban;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
+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.beanbeanjuice.simpleproxychat.utility.helper.Helper;
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.plugin.Command;
+import net.md_5.bungee.api.plugin.TabExecutor;
+
+import java.util.List;
+
+public class BungeeBanCommand extends Command implements TabExecutor {
+
+ private final SimpleProxyChatBungee plugin;
+ private final Config config;
+
+ public BungeeBanCommand(final SimpleProxyChatBungee plugin) {
+ super("Spc-ban", Permission.COMMAND_BAN.getPermissionNode());
+ this.plugin = plugin;
+ this.config = plugin.getConfig();
+ }
+
+ @Override
+ public void execute(CommandSender sender, String[] args) {
+ if (!config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ sender.sendMessage(Helper.convertToBungee("&cThe banning system is disabled..."));
+ return;
+ }
+
+ if (args.length != 1) {
+ String errorMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_USAGE);
+ sender.sendMessage(Helper.convertToBungee(errorMessage));
+ return;
+ }
+
+ String playerName = args[0];
+ plugin.getBanHelper().addBan(playerName);
+ plugin.getProxy().getPlayer(playerName).disconnect(Helper.convertToBungee("&cYou have been banned from the proxy."));
+
+ String bannedMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_BANNED);
+ bannedMessage = Helper.replaceKeys(
+ bannedMessage,
+ Tuple.of("plugin-prefix", config.getAsString(ConfigDataKey.PLUGIN_PREFIX)),
+ Tuple.of("player", playerName)
+ );
+
+ sender.sendMessage(Helper.convertToBungee(bannedMessage));
+ }
+
+ @Override
+ public Iterable onTabComplete(CommandSender sender, String[] args) {
+ if (args.length == 1) {
+ return plugin.getProxy().getPlayers()
+ .stream()
+ .map(CommandSender::getName)
+ .filter((bannedPlayer) -> bannedPlayer.toLowerCase().startsWith(args[0].toLowerCase()))
+ .toList();
+ }
+
+ return List.of();
+ }
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/ban/BungeeUnbanCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/ban/BungeeUnbanCommand.java
new file mode 100644
index 0000000..01cca39
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/bungee/ban/BungeeUnbanCommand.java
@@ -0,0 +1,63 @@
+package com.beanbeanjuice.simpleproxychat.commands.bungee.ban;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
+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.beanbeanjuice.simpleproxychat.utility.helper.Helper;
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.plugin.Command;
+import net.md_5.bungee.api.plugin.TabExecutor;
+
+import java.util.List;
+
+public class BungeeUnbanCommand extends Command implements TabExecutor {
+
+ private final SimpleProxyChatBungee plugin;
+ private final Config config;
+
+ public BungeeUnbanCommand(final SimpleProxyChatBungee plugin) {
+ super("Spc-unban", Permission.COMMAND_UNBAN.getPermissionNode());
+ this.plugin = plugin;
+ this.config = plugin.getConfig();
+ }
+
+ @Override
+ public void execute(CommandSender sender, String[] args) {
+ if (!config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ sender.sendMessage(Helper.convertToBungee("&cThe banning system is disabled..."));
+ return;
+ }
+
+ if (args.length != 1) {
+ String errorMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_USAGE);
+ sender.sendMessage(Helper.convertToBungee(errorMessage));
+ return;
+ }
+
+ String playerName = args[0];
+ plugin.getBanHelper().removeBan(playerName);
+
+ String unbannedMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_UNBANNED);
+ unbannedMessage = Helper.replaceKeys(
+ unbannedMessage,
+ Tuple.of("plugin-prefix", config.getAsString(ConfigDataKey.PLUGIN_PREFIX)),
+ Tuple.of("player", playerName)
+ );
+
+ sender.sendMessage(Helper.convertToBungee(unbannedMessage));
+ }
+
+ @Override
+ public Iterable onTabComplete(CommandSender sender, String[] args) {
+ if (args.length == 1) {
+ return plugin.getBanHelper().getBannedPlayers()
+ .stream()
+ .filter((bannedPlayer) -> bannedPlayer.toLowerCase().startsWith(args[0].toLowerCase()))
+ .toList();
+ }
+
+ return List.of();
+ }
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityChatToggleCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityChatToggleCommand.java
index c775576..768fa7b 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityChatToggleCommand.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityChatToggleCommand.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.commands.velocity;
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
@@ -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;
@@ -19,9 +18,9 @@ public class VelocityChatToggleCommand implements SimpleCommand {
private final SimpleProxyChatVelocity plugin;
private final Config config;
- public VelocityChatToggleCommand(SimpleProxyChatVelocity plugin, Config config) {
+ public VelocityChatToggleCommand(final SimpleProxyChatVelocity plugin) {
this.plugin = plugin;
- this.config = config;
+ this.config = plugin.getConfig();
}
@Override
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityReloadCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityReloadCommand.java
index 22ba8d4..8e80cd8 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityReloadCommand.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityReloadCommand.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.commands.velocity;
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.Tuple;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
@@ -14,9 +14,9 @@ public class VelocityReloadCommand implements SimpleCommand {
private final SimpleProxyChatVelocity plugin;
private final Config config;
- public VelocityReloadCommand(SimpleProxyChatVelocity plugin, Config config) {
+ public VelocityReloadCommand(final SimpleProxyChatVelocity plugin) {
this.plugin = plugin;
- this.config = config;
+ this.config = plugin.getConfig();
}
@Override
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityReplyCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityReplyCommand.java
new file mode 100644
index 0000000..aa73ce8
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityReplyCommand.java
@@ -0,0 +1,57 @@
+package com.beanbeanjuice.simpleproxychat.commands.velocity;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
+import com.beanbeanjuice.simpleproxychat.utility.helper.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(final SimpleProxyChatVelocity plugin) {
+ this.plugin = plugin;
+ this.config = plugin.getConfig();
+ }
+
+ @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> 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.COMMAND_WHISPER.getPermissionNode());
+ }
+
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityWhisperCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityWhisperCommand.java
new file mode 100644
index 0000000..b05de4a
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/VelocityWhisperCommand.java
@@ -0,0 +1,74 @@
+package com.beanbeanjuice.simpleproxychat.commands.velocity;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
+import com.beanbeanjuice.simpleproxychat.utility.helper.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.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class VelocityWhisperCommand implements SimpleCommand {
+
+ private final SimpleProxyChatVelocity plugin;
+ private final Config config;
+
+ public VelocityWhisperCommand(final SimpleProxyChatVelocity plugin) {
+ this.plugin = plugin;
+ this.config = plugin.getConfig();
+ }
+
+ @Override
+ public void execute(Invocation invocation) {
+ if (invocation.arguments().length < 2) {
+ invocation.source().sendMessage(Helper.stringToComponent(config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_ERROR)));
+ return;
+ }
+
+ plugin.getProxyServer().getPlayer(invocation.arguments()[0]).ifPresentOrElse(
+ (receiver) -> {
+ String message = Helper.translateLegacyCodes(Arrays.stream(invocation.arguments()).skip(1).collect(Collectors.joining(" ")));
+
+ String senderString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_SEND);
+ String receiverString = config.getAsString(ConfigDataKey.MINECRAFT_WHISPER_RECEIVE);
+
+ List> 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 List suggest(Invocation invocation) {
+ if (invocation.arguments().length <= 1) return plugin.getProxyServer().getAllPlayers().stream().map((Player::getUsername)).filter((username) -> {
+ if (invocation.arguments().length == 1) {
+ return username.toLowerCase().startsWith(invocation.arguments()[0].toLowerCase());
+ }
+ return true;
+ }).toList();
+ return List.of();
+ }
+
+ @Override
+ public boolean hasPermission(Invocation invocation) {
+ return invocation.source().hasPermission(Permission.COMMAND_WHISPER.getPermissionNode());
+ }
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/ban/VelocityBanCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/ban/VelocityBanCommand.java
new file mode 100644
index 0000000..ce6e14a
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/ban/VelocityBanCommand.java
@@ -0,0 +1,73 @@
+package com.beanbeanjuice.simpleproxychat.commands.velocity.ban;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
+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.beanbeanjuice.simpleproxychat.utility.helper.Helper;
+import com.velocitypowered.api.command.SimpleCommand;
+import com.velocitypowered.api.proxy.Player;
+
+import java.util.List;
+
+public class VelocityBanCommand implements SimpleCommand {
+
+ private final SimpleProxyChatVelocity plugin;
+ private final Config config;
+
+ public VelocityBanCommand(final SimpleProxyChatVelocity plugin) {
+ this.plugin = plugin;
+ this.config = plugin.getConfig();
+ }
+
+ @Override
+ public void execute(Invocation invocation) {
+ if (!config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ invocation.source().sendMessage(Helper.stringToComponent("&cThe banning system is disabled..."));
+ return;
+ }
+
+ if (invocation.arguments().length != 1) {
+ String errorMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_USAGE);
+ invocation.source().sendMessage(Helper.stringToComponent(errorMessage));
+ return;
+ }
+
+ String playerName = invocation.arguments()[0];
+ plugin.getBanHelper().addBan(playerName);
+ plugin.getProxyServer().getPlayer(playerName).ifPresent(player -> player.disconnect(Helper.stringToComponent("&cYou have been banned from the proxy.")));
+
+ String bannedMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_BANNED);
+ bannedMessage = Helper.replaceKeys(
+ bannedMessage,
+ Tuple.of("plugin-prefix", config.getAsString(ConfigDataKey.PLUGIN_PREFIX)),
+ Tuple.of("player", playerName)
+ );
+
+ invocation.source().sendMessage(Helper.stringToComponent(bannedMessage));
+ }
+
+ @Override
+ public List suggest(Invocation invocation) {
+ if (invocation.arguments().length == 0) {
+ return plugin.getProxyServer().getAllPlayers().stream().map(Player::getUsername).toList();
+ }
+
+ if (invocation.arguments().length == 1) {
+ return plugin.getProxyServer().getAllPlayers()
+ .stream()
+ .map(Player::getUsername)
+ .filter((bannedPlayer) -> bannedPlayer.toLowerCase().startsWith(invocation.arguments()[0].toLowerCase()))
+ .toList();
+ }
+
+ return List.of();
+ }
+
+ @Override
+ public boolean hasPermission(Invocation invocation) {
+ return invocation.source().hasPermission(Permission.COMMAND_BAN.getPermissionNode());
+ }
+
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/ban/VelocityUnbanCommand.java b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/ban/VelocityUnbanCommand.java
new file mode 100644
index 0000000..3ef0aa3
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/commands/velocity/ban/VelocityUnbanCommand.java
@@ -0,0 +1,70 @@
+package com.beanbeanjuice.simpleproxychat.commands.velocity.ban;
+
+import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
+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.beanbeanjuice.simpleproxychat.utility.helper.Helper;
+import com.velocitypowered.api.command.SimpleCommand;
+
+import java.util.List;
+
+public class VelocityUnbanCommand implements SimpleCommand {
+
+ private final SimpleProxyChatVelocity plugin;
+ private final Config config;
+
+ public VelocityUnbanCommand(final SimpleProxyChatVelocity plugin) {
+ this.plugin = plugin;
+ this.config = plugin.getConfig();
+ }
+
+ @Override
+ public void execute(Invocation invocation) {
+ if (!config.getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) {
+ invocation.source().sendMessage(Helper.stringToComponent("&cThe banning system is disabled..."));
+ return;
+ }
+
+ if (invocation.arguments().length != 1) {
+ String errorMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_USAGE);
+ invocation.source().sendMessage(Helper.stringToComponent(errorMessage));
+ return;
+ }
+
+ String playerName = invocation.arguments()[0];
+ plugin.getBanHelper().removeBan(playerName);
+
+ String unbannedMessage = config.getAsString(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_UNBANNED);
+ unbannedMessage = Helper.replaceKeys(
+ unbannedMessage,
+ Tuple.of("plugin-prefix", config.getAsString(ConfigDataKey.PLUGIN_PREFIX)),
+ Tuple.of("player", playerName)
+ );
+
+ invocation.source().sendMessage(Helper.stringToComponent(unbannedMessage));
+ }
+
+ @Override
+ public List suggest(Invocation invocation) {
+ if (invocation.arguments().length == 0) {
+ return plugin.getBanHelper().getBannedPlayers();
+ }
+
+ if (invocation.arguments().length == 1) {
+ return plugin.getBanHelper().getBannedPlayers()
+ .stream()
+ .filter((bannedPlayer) -> bannedPlayer.toLowerCase().startsWith(invocation.arguments()[0].toLowerCase()))
+ .toList();
+ }
+
+ return List.of();
+ }
+
+ @Override
+ public boolean hasPermission(Invocation invocation) {
+ return invocation.source().hasPermission(Permission.COMMAND_BAN.getPermissionNode());
+ }
+
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/discord/Bot.java b/src/main/java/com/beanbeanjuice/simpleproxychat/discord/Bot.java
index 8b86c82..77248a6 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/discord/Bot.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/discord/Bot.java
@@ -1,11 +1,12 @@
package com.beanbeanjuice.simpleproxychat.discord;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
+import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.requests.GatewayIntent;
import net.dv8tion.jda.api.utils.ChunkingFilter;
@@ -141,6 +142,7 @@ public void start() throws InterruptedException {
sendProxyStatus(true);
this.updateActivity();
+ this.updateStatus();
runnables.forEach(Runnable::run);
}
@@ -161,6 +163,19 @@ public void updateActivity() {
});
}
+ public void updateStatus() {
+ this.getJDA().ifPresent((jda) -> {
+ OnlineStatus status;
+
+ try {
+ status = OnlineStatus.valueOf(config.getAsString(ConfigDataKey.BOT_ACTIVITY_STATUS));
+ } catch (Exception e) {
+ status = OnlineStatus.IDLE;
+ }
+ jda.getPresence().setStatus(status);
+ });
+ }
+
public void sendProxyStatus(boolean isStart) {
if (!config.getAsBoolean(ConfigDataKey.DISCORD_PROXY_STATUS_ENABLED)) return;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeChatMessageData.java b/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeChatMessageData.java
index a5c497c..1420a2a 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeChatMessageData.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeChatMessageData.java
@@ -12,7 +12,7 @@
import java.util.Collection;
-import static com.beanbeanjuice.simpleproxychat.utility.Helper.convertToBungee;
+import static com.beanbeanjuice.simpleproxychat.utility.helper.Helper.convertToBungee;
public class BungeeChatMessageData extends ChatMessageData {
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeCordPluginMessagingListener.java b/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeCordPluginMessagingListener.java
index 4b829e7..1489cc2 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeCordPluginMessagingListener.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/socket/bungee/BungeeCordPluginMessagingListener.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.socket.bungee;
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.listeners.MessageType;
import com.beanbeanjuice.simpleproxychat.utility.listeners.bungee.BungeeServerListener;
import com.google.common.io.ByteArrayDataInput;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/socket/velocity/VelocityPluginMessagingListener.java b/src/main/java/com/beanbeanjuice/simpleproxychat/socket/velocity/VelocityPluginMessagingListener.java
index c258edf..cc45902 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/socket/velocity/VelocityPluginMessagingListener.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/socket/velocity/VelocityPluginMessagingListener.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.socket.velocity;
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.listeners.MessageType;
import com.beanbeanjuice.simpleproxychat.utility.listeners.velocity.VelocityServerListener;
import com.google.common.io.ByteArrayDataInput;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/BanHelper.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/BanHelper.java
new file mode 100644
index 0000000..6997c99
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/BanHelper.java
@@ -0,0 +1,78 @@
+package com.beanbeanjuice.simpleproxychat.utility;
+
+import dev.dejvokep.boostedyaml.YamlDocument;
+import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings;
+import dev.dejvokep.boostedyaml.settings.general.GeneralSettings;
+import lombok.Getter;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Objects;
+
+public class BanHelper {
+
+ private YamlDocument yamlBans;
+ private final File configFolder;
+ @Getter private final ArrayList bannedPlayers;
+
+ public BanHelper(File configFolder) {
+ this.configFolder = configFolder;
+ this.bannedPlayers = new ArrayList<>();
+ }
+
+ public void initialize() {
+ try {
+ yamlBans = loadBans("bannedPlayers.yml");
+ yamlBans.update();
+ yamlBans.save();
+ readBans();
+ } catch (IOException ignored) { }
+ }
+
+ public void reload() {
+ try {
+ yamlBans.reload();
+ bannedPlayers.clear();
+ readBans();
+ } catch (IOException ignored) { }
+ }
+
+ public void addBan(String playerName) {
+ try {
+ bannedPlayers.add(playerName);
+
+ yamlBans.set("bannedPlayers", bannedPlayers.toArray(new String[0]));
+ yamlBans.save();
+ this.reload();
+ } catch (IOException ignored) { }
+ }
+
+ public void removeBan(String playerName) {
+ try {
+ bannedPlayers.removeIf((nameInArray) -> nameInArray.equalsIgnoreCase(playerName));
+
+ yamlBans.set("bannedPlayers", bannedPlayers.toArray(new String[0]));
+ yamlBans.save();
+ this.reload();
+ } catch (IOException ignored) { }
+ }
+
+ public boolean isBanned(String playerName) {
+ return bannedPlayers.stream().anyMatch(s -> s.equalsIgnoreCase(playerName));
+ }
+
+ private void readBans() throws IOException {
+ bannedPlayers.addAll(yamlBans.getStringList("bannedPlayers"));
+ }
+
+ private YamlDocument loadBans(String fileName) throws IOException {
+ return YamlDocument.create(
+ new File(configFolder, fileName),
+ Objects.requireNonNull(getClass().getResourceAsStream("/" + fileName)),
+ GeneralSettings.DEFAULT,
+ DumperSettings.DEFAULT
+ );
+ }
+
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/UpdateChecker.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/UpdateChecker.java
index 68db58d..4574aa4 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/UpdateChecker.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/UpdateChecker.java
@@ -2,6 +2,8 @@
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import java.io.IOException;
import java.io.InputStream;
@@ -32,7 +34,7 @@ public Optional getUpdate() {
public void checkUpdate() {
getUpdate().ifPresent((spigotVersion) -> {
- if (currentVersion.equalsIgnoreCase(spigotVersion)) return;
+ if (compare(currentVersion, spigotVersion) >= 0) return;
String message = Helper.replaceKeys(
config.getAsString(ConfigDataKey.UPDATE_MESSAGE),
@@ -46,4 +48,11 @@ public void checkUpdate() {
});
}
+ public static int compare(final String version1, final String version2) {
+ DefaultArtifactVersion v1 = new DefaultArtifactVersion(version1);
+ DefaultArtifactVersion v2 = new DefaultArtifactVersion(version2);
+
+ return v1.compareTo(v2);
+ }
+
}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Config.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Config.java
index 0cb5f79..89b549d 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Config.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Config.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.utility.config;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
-import com.beanbeanjuice.simpleproxychat.utility.ServerChatLockHelper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.ServerChatLockHelper;
import dev.dejvokep.boostedyaml.YamlDocument;
import dev.dejvokep.boostedyaml.block.implementation.Section;
import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning;
@@ -15,6 +15,7 @@
import java.awt.*;
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;
import java.util.Optional;
@@ -84,12 +85,17 @@ public HashMap getAsStringMap(ConfigDataKey key) {
return (HashMap) get(key);
}
+ @SuppressWarnings("unchecked")
+ public ArrayList getAsArrayList(ConfigDataKey key) {
+ return (ArrayList) get(key);
+ }
+
private void readConfig() throws IOException {
// config.yml
- config.put(ConfigDataKey.USE_HELPER, Boolean.valueOf(yamlConfig.getString("use-helper")));
- config.put(ConfigDataKey.USE_DISCORD, Boolean.valueOf(yamlConfig.getString("use-discord")));
+ config.put(ConfigDataKey.USE_DISCORD, yamlConfig.getBoolean("use-discord"));
config.put(ConfigDataKey.BOT_TOKEN, yamlConfig.getString("BOT-TOKEN"));
config.put(ConfigDataKey.CHANNEL_ID, yamlConfig.getString("CHANNEL-ID"));
+ config.put(ConfigDataKey.BOT_ACTIVITY_STATUS, yamlConfig.getString("bot-activity.status"));
config.put(ConfigDataKey.BOT_ACTIVITY_TYPE, yamlConfig.getString("bot-activity.type"));
config.put(ConfigDataKey.BOT_ACTIVITY_TEXT, yamlConfig.getString("bot-activity.text"));
config.put(ConfigDataKey.SERVER_UPDATE_INTERVAL, yamlConfig.getInt("server-update-interval"));
@@ -106,6 +112,14 @@ private void readConfig() throws IOException {
config.put(ConfigDataKey.TIMESTAMP_USE_API, yamlConfig.getBoolean("timestamp.use-api"));
config.put(ConfigDataKey.TIMESTAMP_FORMAT, yamlConfig.getString("timestamp.format"));
config.put(ConfigDataKey.TIMESTAMP_TIMEZONE, yamlConfig.getString("timestamp.timezone"));
+ config.put(ConfigDataKey.USE_HELPER, yamlConfig.getBoolean("use-helper"));
+ config.put(ConfigDataKey.UPDATE_NOTIFICATIONS, yamlConfig.getBoolean("update-notifications"));
+ config.put(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM, yamlConfig.getBoolean("use-simple-proxy-chat-banning-system"));
+
+ ArrayList whisperAliases = (ArrayList) yamlConfig.getStringList("commands.whisper-aliases");
+ config.put(ConfigDataKey.WHISPER_ALIASES, whisperAliases);
+ ArrayList replyAliases = (ArrayList) yamlConfig.getStringList("commands.reply-aliases");
+ config.put(ConfigDataKey.REPLY_ALIASES, replyAliases);
// Checking timezone.
try {
@@ -128,9 +142,13 @@ private void readConfig() throws IOException {
putMessage(ConfigDataKey.MINECRAFT_LEAVE, "minecraft.leave.message", false);
config.put(ConfigDataKey.MINECRAFT_CHAT_ENABLED, yamlMessages.getBoolean("minecraft.chat.enabled"));
putMessage(ConfigDataKey.MINECRAFT_CHAT_MESSAGE, "minecraft.chat.message", false);
+ putMessage(ConfigDataKey.MINECRAFT_CHAT_VANISHED_MESSAGE, "minecraft.chat.vanished", false);
config.put(ConfigDataKey.MINECRAFT_SWITCH_ENABLED, yamlMessages.getBoolean("minecraft.switch.enabled"));
putMessage(ConfigDataKey.MINECRAFT_SWITCH_DEFAULT, "minecraft.switch.default", false);
putMessage(ConfigDataKey.MINECRAFT_SWITCH_SHORT, "minecraft.switch.no-from", false);
+ putMessage(ConfigDataKey.MINECRAFT_WHISPER_SEND, "minecraft.whisper.send", false);
+ putMessage(ConfigDataKey.MINECRAFT_WHISPER_RECEIVE, "minecraft.whisper.receive", false);
+ putMessage(ConfigDataKey.MINECRAFT_WHISPER_ERROR, "minecraft.whisper.error", false);
config.put(ConfigDataKey.MINECRAFT_DISCORD_ENABLED, yamlMessages.getBoolean("minecraft.discord.enabled"));
putMessage(ConfigDataKey.MINECRAFT_DISCORD_MESSAGE, "minecraft.discord.message", true);
config.put(ConfigDataKey.MINECRAFT_DISCORD_EMBED_USE, yamlMessages.getBoolean("minecraft.discord.embed.use"));
@@ -147,6 +165,10 @@ private void readConfig() throws IOException {
putMessage(ConfigDataKey.MINECRAFT_COMMAND_CHAT_LOCK_SINGLE_UNLOCKED, "minecraft.command.chat-lock.single.unlocked", false);
putMessage(ConfigDataKey.MINECRAFT_COMMAND_CHAT_LOCK_ALL_LOCKED, "minecraft.command.chat-lock.all.locked", false);
putMessage(ConfigDataKey.MINECRAFT_COMMAND_CHAT_LOCK_ALL_UNLOCKED, "minecraft.command.chat-lock.all.unlocked", false);
+ putMessage(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_USAGE, "minecraft.command.proxy-ban.usage", false);
+ putMessage(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_BANNED, "minecraft.command.proxy-ban.banned", false);
+ putMessage(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_UNBANNED, "minecraft.command.proxy-ban.unbanned", false);
+ putMessage(ConfigDataKey.MINECRAFT_COMMAND_PROXY_BAN_LOGIN_MESSAGE, "minecraft.command.proxy-ban.login-message", false);
config.put(ConfigDataKey.DISCORD_JOIN_ENABLED, yamlMessages.getBoolean("discord.join.enabled"));
putMessage(ConfigDataKey.DISCORD_JOIN_MESSAGE, "discord.join.message", true);
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/ConfigDataKey.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/ConfigDataKey.java
index 6420dfc..303f550 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/ConfigDataKey.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/ConfigDataKey.java
@@ -2,10 +2,10 @@
public enum ConfigDataKey {
// CONFIG
- USE_HELPER,
USE_DISCORD,
BOT_TOKEN,
CHANNEL_ID,
+ BOT_ACTIVITY_STATUS,
BOT_ACTIVITY_TYPE,
BOT_ACTIVITY_TEXT,
SERVER_UPDATE_INTERVAL,
@@ -17,6 +17,11 @@ public enum ConfigDataKey {
TIMESTAMP_USE_API,
TIMESTAMP_FORMAT,
TIMESTAMP_TIMEZONE,
+ USE_HELPER,
+ UPDATE_NOTIFICATIONS,
+ USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM,
+ WHISPER_ALIASES,
+ REPLY_ALIASES,
// MESSAGES
PLUGIN_PREFIX,
@@ -27,9 +32,13 @@ public enum ConfigDataKey {
MINECRAFT_LEAVE,
MINECRAFT_CHAT_ENABLED,
MINECRAFT_CHAT_MESSAGE,
+ MINECRAFT_CHAT_VANISHED_MESSAGE,
MINECRAFT_SWITCH_ENABLED,
MINECRAFT_SWITCH_DEFAULT,
MINECRAFT_SWITCH_SHORT,
+ MINECRAFT_WHISPER_SEND,
+ MINECRAFT_WHISPER_RECEIVE,
+ MINECRAFT_WHISPER_ERROR,
MINECRAFT_DISCORD_ENABLED,
MINECRAFT_DISCORD_MESSAGE,
MINECRAFT_DISCORD_EMBED_USE,
@@ -46,6 +55,10 @@ public enum ConfigDataKey {
MINECRAFT_COMMAND_CHAT_LOCK_SINGLE_UNLOCKED,
MINECRAFT_COMMAND_CHAT_LOCK_ALL_LOCKED,
MINECRAFT_COMMAND_CHAT_LOCK_ALL_UNLOCKED,
+ MINECRAFT_COMMAND_PROXY_BAN_USAGE,
+ MINECRAFT_COMMAND_PROXY_BAN_BANNED,
+ MINECRAFT_COMMAND_PROXY_BAN_UNBANNED,
+ MINECRAFT_COMMAND_PROXY_BAN_LOGIN_MESSAGE,
DISCORD_JOIN_ENABLED,
DISCORD_JOIN_MESSAGE,
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Permission.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Permission.java
index ca9f625..b075f34 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Permission.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/config/Permission.java
@@ -12,7 +12,10 @@ public enum Permission {
READ_UPDATE_NOTIFICATION("simpleproxychat.read.update"),
COMMAND_TOGGLE_CHAT("simpleproxychat.toggle.chat"),
COMMAND_TOGGLE_CHAT_ALL("simpleproxychat.toggle.chat.all"),
- COMMAND_RELOAD("simpleproxychat.reload");
+ COMMAND_RELOAD("simpleproxychat.reload"),
+ COMMAND_BAN("simpleproxychat.ban"),
+ COMMAND_UNBAN("simpleproxychat.unban"),
+ COMMAND_WHISPER("simpleproxychat.whisper");
@Getter private final String permissionNode;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/Helper.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/Helper.java
similarity index 95%
rename from src/main/java/com/beanbeanjuice/simpleproxychat/utility/Helper.java
rename to src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/Helper.java
index 4df1f50..52ef1d0 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/Helper.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/Helper.java
@@ -1,7 +1,10 @@
-package com.beanbeanjuice.simpleproxychat.utility;
+package 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 de.myzelyam.api.vanish.BungeeVanishAPI;
+import de.myzelyam.api.vanish.VelocityVanishAPI;
import litebans.api.Database;
import me.leoko.advancedban.manager.PunishmentManager;
import me.leoko.advancedban.manager.UUIDManager;
@@ -90,11 +93,13 @@ public static String stripColor(Component input) {
}
public static BaseComponent[] convertToBungee(String message) {
+ message = translateLegacyCodes(message);
Component minimessage = MiniMessage.miniMessage().deserialize(message);
return BungeeComponentSerializer.get().serialize(minimessage);
}
public static Component stringToComponent(String string) {
+ string = translateLegacyCodes(string);
return MiniMessage.miniMessage().deserialize(string);
}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/ServerChatLockHelper.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/ServerChatLockHelper.java
similarity index 89%
rename from src/main/java/com/beanbeanjuice/simpleproxychat/utility/ServerChatLockHelper.java
rename to src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/ServerChatLockHelper.java
index a105cb1..e2236cf 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/ServerChatLockHelper.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/ServerChatLockHelper.java
@@ -1,4 +1,4 @@
-package com.beanbeanjuice.simpleproxychat.utility;
+package com.beanbeanjuice.simpleproxychat.utility.helper;
import java.util.HashSet;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/WhisperHandler.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/WhisperHandler.java
new file mode 100644
index 0000000..dd50f2f
--- /dev/null
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/helper/WhisperHandler.java
@@ -0,0 +1,23 @@
+package com.beanbeanjuice.simpleproxychat.utility.helper;
+
+import java.util.HashMap;
+import java.util.Optional;
+
+public class WhisperHandler {
+
+ private final HashMap lastMessagedPlayer;
+
+ public WhisperHandler() {
+ lastMessagedPlayer = new HashMap<>();
+ }
+
+ public void set(String player1, String player2) {
+ lastMessagedPlayer.put(player1, player2);
+ lastMessagedPlayer.put(player2, player1);
+ }
+
+ public Optional getLink(String playerName) {
+ return Optional.ofNullable(lastMessagedPlayer.get(playerName));
+ }
+
+}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/bungee/BungeeServerListener.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/bungee/BungeeServerListener.java
index 49d049a..4b133de 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/bungee/BungeeServerListener.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/bungee/BungeeServerListener.java
@@ -3,7 +3,7 @@
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatBungee;
import com.beanbeanjuice.simpleproxychat.chat.ChatHandler;
import com.beanbeanjuice.simpleproxychat.socket.bungee.BungeeChatMessageData;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import com.beanbeanjuice.simpleproxychat.utility.listeners.MessageType;
import com.beanbeanjuice.simpleproxychat.utility.status.ServerStatusManager;
@@ -42,7 +42,15 @@ public void onProxyChatEvent(ChatEvent event) {
if (event.isCommand() || event.isProxyCommand()) return;
ProxiedPlayer player = (ProxiedPlayer) event.getSender();
- if (plugin.getConfig().getAsBoolean(ConfigDataKey.VANISH_ENABLED) && BungeeVanishAPI.isInvisible(player)) return;
+ if (plugin.getConfig().getAsBoolean(ConfigDataKey.VANISH_ENABLED) && BungeeVanishAPI.isInvisible(player)) {
+ // TODO: If is allowed to speak in vanisht hen continue.
+ if (!event.getMessage().endsWith("/")) {
+ String errorMessage = plugin.getConfig().getAsString(ConfigDataKey.MINECRAFT_CHAT_VANISHED_MESSAGE);
+ player.sendMessage(ChatMessageType.SYSTEM, Helper.convertToBungee(errorMessage));
+ return;
+ }
+ event.setMessage(event.getMessage().substring(0, event.getMessage().length() - 1));
+ }
if (!Helper.playerCanChat(plugin.getConfig(), player.getUniqueId(), player.getName())) return;
Server currentServer = (Server) event.getReceiver();
@@ -94,6 +102,17 @@ void leave(ProxiedPlayer player, boolean isFake) {
}
}
+ @EventHandler
+ public void onPreLogin(PreLoginEvent event) {
+ String playerName = event.getConnection().getName();
+
+ if (!plugin.getConfig().getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) return;
+ if (!plugin.getBanHelper().isBanned(playerName)) return;
+
+ event.setCancelled(true);
+ event.setReason(Helper.convertToBungee("You are banned from the proxy.")[0]);
+ }
+
@EventHandler
public void onPlayerJoinProxy(ServerConnectedEvent event) {
if (event.getPlayer().getGroups().contains("not-first-join")) return; // If not first join, don't do anything.
@@ -110,12 +129,14 @@ public void join(ProxiedPlayer player, Server server, boolean isFake) {
plugin.getProxy().getScheduler().schedule(
plugin,
() -> {
+ if (server == null || server.getInfo() == null) return;
+
previousServerHandler.put(player.getName(), server.getInfo());
if (isFake) chatHandler.runProxyJoinMessage(player.getName(), player.getUniqueId(), server.getInfo().getName(), this::sendToAllServersVanish);
else chatHandler.runProxyJoinMessage(player.getName(), player.getUniqueId(), server.getInfo().getName(), this::sendToAllServers);
},
- 50L, TimeUnit.MILLISECONDS); // 50ms is 1 tick
+ 50L * 2, TimeUnit.MILLISECONDS); // 50ms is 1 tick
} catch (Exception e) {
plugin.getLogger().warning("BungeeCord error. This is a bungeecord issue and cannot be fixed: " + e.getMessage());
}
@@ -166,7 +187,10 @@ private void sendToAllServers(String parsedMessage, Permission permission) {
return player.hasPermission(permission.getPermissionNode());
return true;
})
- .filter((player) -> !Helper.serverHasChatLocked(plugin.getConfig(), player.getServer().getInfo().getName()))
+ .filter((player) -> {
+ if (player.getServer() == null || player.getServer().getInfo() == null) return false;
+ return !Helper.serverHasChatLocked(plugin.getConfig(), player.getServer().getInfo().getName());
+ })
.forEach((player) -> player.sendMessage(ChatMessageType.CHAT, Helper.convertToBungee(parsedMessage)));
}
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/velocity/VelocityServerListener.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/velocity/VelocityServerListener.java
index 7ad138a..07ba137 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/velocity/VelocityServerListener.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/listeners/velocity/VelocityServerListener.java
@@ -3,7 +3,7 @@
import com.beanbeanjuice.simpleproxychat.SimpleProxyChatVelocity;
import com.beanbeanjuice.simpleproxychat.chat.ChatHandler;
import com.beanbeanjuice.simpleproxychat.socket.velocity.VelocityChatMessageData;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.config.Permission;
import com.beanbeanjuice.simpleproxychat.utility.listeners.MessageType;
import com.beanbeanjuice.simpleproxychat.utility.status.ServerStatusManager;
@@ -11,8 +11,10 @@
import com.velocitypowered.api.event.PostOrder;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.connection.DisconnectEvent;
+import com.velocitypowered.api.event.connection.PreLoginEvent;
import com.velocitypowered.api.event.player.PlayerChatEvent;
import com.velocitypowered.api.event.player.ServerConnectedEvent;
+import com.velocitypowered.api.event.player.ServerPreConnectEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import de.myzelyam.api.vanish.VelocityVanishAPI;
@@ -43,14 +45,22 @@ public void initializeVelocityVanishListener() {
@Subscribe(order = PostOrder.LAST)
public void onPlayerChat(PlayerChatEvent event) {
+ String playerMessage = event.getMessage();
Player player = event.getPlayer();
- if (plugin.getConfig().getAsBoolean(ConfigDataKey.VANISH_ENABLED) && VelocityVanishAPI.isInvisible(player)) return;
+ if (plugin.getConfig().getAsBoolean(ConfigDataKey.VANISH_ENABLED) && VelocityVanishAPI.isInvisible(player)) {
+ // If is allowed to speak in vanish, continue.
+ if (!event.getMessage().endsWith("/")) {
+ String errorMessage = plugin.getConfig().getAsString(ConfigDataKey.MINECRAFT_CHAT_VANISHED_MESSAGE);
+ player.sendMessage(Helper.stringToComponent(errorMessage));
+ return;
+ }
+ playerMessage = playerMessage.substring(0, playerMessage.length() - 1);
+ }
if (!Helper.playerCanChat(plugin.getConfig(), player.getUniqueId(), player.getUsername())) return;
+ String finalPlayerMessage = playerMessage;
event.getPlayer().getCurrentServer().ifPresent((connection) -> {
- String playerMessage = event.getMessage();
-
- VelocityChatMessageData messageData = new VelocityChatMessageData(plugin, MessageType.CHAT, connection.getServer(), player, playerMessage);
+ VelocityChatMessageData messageData = new VelocityChatMessageData(plugin, MessageType.CHAT, connection.getServer(), player, finalPlayerMessage);
chatHandler.runProxyChatMessage(messageData);
});
}
@@ -89,6 +99,16 @@ private void startServerStatusDetection() {
})).delay(updateInterval, TimeUnit.SECONDS).repeat(updateInterval, TimeUnit.SECONDS).schedule();
}
+ @Subscribe
+ public void onPreLoginEvent(PreLoginEvent event) {
+ String playerName = event.getUsername();
+
+ if (!plugin.getConfig().getAsBoolean(ConfigDataKey.USE_SIMPLE_PROXY_CHAT_BANNING_SYSTEM)) return;
+ if (!plugin.getBanHelper().isBanned(playerName)) return;
+
+ event.setResult(PreLoginEvent.PreLoginComponentResult.denied(Helper.stringToComponent("&cYou are banned from the proxy.")));
+ }
+
@Subscribe
public void onServerConnected(ServerConnectedEvent event) {
if (plugin.getConfig().getAsBoolean(ConfigDataKey.VANISH_ENABLED) && VelocityVanishAPI.isInvisible(event.getPlayer())) return;
diff --git a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/status/ServerStatusManager.java b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/status/ServerStatusManager.java
index bf485bd..a51b7dc 100644
--- a/src/main/java/com/beanbeanjuice/simpleproxychat/utility/status/ServerStatusManager.java
+++ b/src/main/java/com/beanbeanjuice/simpleproxychat/utility/status/ServerStatusManager.java
@@ -1,7 +1,7 @@
package com.beanbeanjuice.simpleproxychat.utility.status;
import com.beanbeanjuice.simpleproxychat.discord.Bot;
-import com.beanbeanjuice.simpleproxychat.utility.Helper;
+import com.beanbeanjuice.simpleproxychat.utility.helper.Helper;
import com.beanbeanjuice.simpleproxychat.utility.config.Config;
import com.beanbeanjuice.simpleproxychat.utility.config.ConfigDataKey;
import net.dv8tion.jda.api.EmbedBuilder;
diff --git a/src/main/resources/bannedPlayers.yml b/src/main/resources/bannedPlayers.yml
new file mode 100644
index 0000000..1997db8
--- /dev/null
+++ b/src/main/resources/bannedPlayers.yml
@@ -0,0 +1,2 @@
+bannedPlayers:
+ - exampleBannedPlayerName
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 6afd74f..c4deb3d 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -15,6 +15,8 @@ BOT-TOKEN: "TOKEN_HERE"
CHANNEL-ID: "GLOBAL_CHANNEL_ID"
bot-activity:
+ # Valid Types: ONLINE, DO_NOT_DISTURB, IDLE, INVISIBLE
+ status: ONLINE
# Valid Types: PLAYING, STREAMING, LISTENING, WATCHING, COMPETING
type: "COMPETING"
text: "SimpleProxyChat by beanbeanjuice"
@@ -42,6 +44,9 @@ aliases:
# 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.ban - Ban a player from the proxy. ➕
+# simpleproxychat.unban - Unban a player from the proxy. ➕
+# simpleproxychat.whisper - Whisper to another player on the proxy. ➕
use-permissions: false
# Only messages that start with this character will be sent through the plugin.
@@ -69,5 +74,19 @@ timestamp:
# True if you will be using the helper plugin.
use-helper: false
+update-notifications: true
+
+# It is HIGHLY recommended to use a more robust proxy-wide banning system such as LiteBans or AdvancedBan.
+# However, if you would rather a light-weight, simple, banning system. You can enable it here.
+# A FULL PROXY RESTART IS REQUIRED TO USE THIS.
+use-simple-proxy-chat-banning-system: false
+
+# These require a restart in order to take place.
+commands:
+ whisper-aliases:
+ - "spc-msg"
+ reply-aliases:
+ - "spc-r"
+
# DO NOT TOUCH THIS
-file-version: 10
+file-version: 12
diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml
index f233bd4..104df4d 100644
--- a/src/main/resources/messages.yml
+++ b/src/main/resources/messages.yml
@@ -19,10 +19,15 @@ minecraft:
chat:
enabled: true
message: "&8[&3%server%&8] &e%player% &9» &7%message%"
+ vanished: "&cYou cannot send proxy messages while vanished. Your message must end with a '&e/&c' to speak."
switch:
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%"
@@ -45,6 +50,11 @@ minecraft:
all:
locked: "%plugin-prefix% &cAll servers will no longer send proxy chat messages."
unlocked: "%plugin-prefix% &aAll servers will now send proxy chat messages."
+ proxy-ban:
+ usage: "%plugin-prefix% &c/(un)ban (player)"
+ banned: "%plugin-prefix% &c%player% &7has been banned."
+ unbanned: "%plugin-prefix% &c%player% &7has been unbanned."
+ login-message: "&cYou have been banned from the proxy."
# Discord Stuff
discord:
@@ -91,4 +101,4 @@ 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