diff --git a/README.md b/README.md index c7b91ed..195601a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ SimpleProxyChat Logo

- 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