diff --git a/module/cmd-bungee/nb-configuration.xml b/module/cmd-bungee/nb-configuration.xml
new file mode 100644
index 00000000..7e465924
--- /dev/null
+++ b/module/cmd-bungee/nb-configuration.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ project
+ NEW_LINE
+ NEW_LINE
+ NEW_LINE
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+
+
diff --git a/module/cmd-bungee/pom.xml b/module/cmd-bungee/pom.xml
new file mode 100644
index 00000000..2c00d6c5
--- /dev/null
+++ b/module/cmd-bungee/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+
+ net.md-5
+ bungeecord-module
+ 1.20-R0.1-SNAPSHOT
+ ../pom.xml
+
+
+ net.md-5
+ bungeecord-module-cmd-bungee
+ 1.20-R0.1-SNAPSHOT
+ jar
+
+ cmd_bungee
+ Provides the bungee command
+
diff --git a/module/cmd-bungee/src/main/java/net/md_5/bungee/module/cmd/bungee/CommandBungee.java b/module/cmd-bungee/src/main/java/net/md_5/bungee/module/cmd/bungee/CommandBungee.java
new file mode 100644
index 00000000..15d81b02
--- /dev/null
+++ b/module/cmd-bungee/src/main/java/net/md_5/bungee/module/cmd/bungee/CommandBungee.java
@@ -0,0 +1,106 @@
+package net.md_5.bungee.module.cmd.bungee;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.stream.Collectors;
+import javax.net.ssl.HttpsURLConnection;
+import net.md_5.bungee.api.ChatColor;
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.ProxyServer;
+import net.md_5.bungee.api.chat.ClickEvent;
+import net.md_5.bungee.api.chat.HoverEvent;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.md_5.bungee.api.chat.hover.content.Text;
+import net.md_5.bungee.api.plugin.Command;
+
+public class CommandBungee extends Command
+{
+ private PluginBungee plugin;
+
+ public CommandBungee(PluginBungee plugin)
+ {
+ super( "bungee", "bungeecord.command.bungee" );
+
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void execute(CommandSender sender, String[] args)
+ {
+ TextComponent bungee = new TextComponent( ChatColor.BLUE + "This server is running HexaCord version " + ProxyServer.getInstance().getVersion() + " by md_5" );
+ bungee.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new Text( "Click to copy to clipboard" ) ) );
+ bungee.setClickEvent( new ClickEvent( ClickEvent.Action.COPY_TO_CLIPBOARD, ChatColor.stripColor( bungee.getText() ) ) );
+
+ sender.sendMessage( bungee );
+
+ TextComponent protocol = new TextComponent( ChatColor.BLUE + "Protocol support for 1.7.x by Zartec, ghac and I9hdkill" );
+ protocol.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new Text( "Click to copy to clipboard" ) ) );
+ protocol.setClickEvent( new ClickEvent( ClickEvent.Action.COPY_TO_CLIPBOARD, ChatColor.stripColor( protocol.getText() ) ) );
+
+ sender.sendMessage( protocol );
+
+ sender.sendMessage( "Checking version. please wait..." );
+
+ String version = ProxyServer.getInstance().getVersion();
+ int lastColon = version.lastIndexOf( ':' );
+ String buildNumber = version.substring( lastColon + 1, version.length() );
+
+ if ( "unknown".equals( buildNumber ) )
+ {
+ sender.sendMessage( "Couldn't detect bungee version. Custom build?" );
+ return;
+ }
+
+ int currentBuildNumber = Integer.valueOf( buildNumber ).intValue();
+
+ ProxyServer.getInstance().getScheduler().runAsync( this.plugin, () ->
+ {
+ try
+ {
+ HttpsURLConnection connection = (HttpsURLConnection) new URL( "https://ci.simplyrin.net/job/HexaCord/lastStableBuild/buildNumber" ).openConnection();
+ connection.addRequestProperty( "user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" );
+
+ // 5 second timeout at various stages
+ connection.setConnectTimeout( 5000 );
+ connection.setReadTimeout( 5000 );
+
+ String result = new BufferedReader( new InputStreamReader( connection.getInputStream(), StandardCharsets.UTF_8 ) ).lines().collect( Collectors.joining() );
+
+ int lastStableBuild = Integer.valueOf( result ).intValue();
+
+ if ( lastStableBuild == currentBuildNumber )
+ {
+ TextComponent latest = new TextComponent( ChatColor.GREEN + "You are running the latest version" );
+ latest.setHoverEvent( bungee.getHoverEvent() );
+ latest.setClickEvent( bungee.getClickEvent() );
+
+ sender.sendMessage( latest );
+ } else
+ {
+ TextComponent behind = new TextComponent( ChatColor.YELLOW + String.format( "You are %d version(s) behind", lastStableBuild - currentBuildNumber ) );
+ behind.setHoverEvent( bungee.getHoverEvent() );
+ behind.setClickEvent( bungee.getClickEvent() );
+
+ sender.sendMessage( behind );
+
+ TextComponent text = new TextComponent( ChatColor.YELLOW + "Download the new version at: " );
+ text.setHoverEvent( bungee.getHoverEvent() );
+ text.setClickEvent( bungee.getClickEvent() );
+
+ TextComponent url = new TextComponent( ChatColor.GOLD + "https://ci.simplyrin.net/job/HexaCord/" );
+ url.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new Text( "Click to open" ) ) );
+ url.setClickEvent( new ClickEvent( ClickEvent.Action.OPEN_URL, "https://ci.simplyrin.net/job/HexaCord/" ) );
+
+ text.addExtra( url );
+
+ sender.sendMessage( text );
+ }
+ } catch ( Exception e )
+ {
+ e.printStackTrace();
+ }
+ } );
+ }
+}
diff --git a/module/cmd-bungee/src/main/java/net/md_5/bungee/module/cmd/bungee/PluginBungee.java b/module/cmd-bungee/src/main/java/net/md_5/bungee/module/cmd/bungee/PluginBungee.java
new file mode 100644
index 00000000..663c94fb
--- /dev/null
+++ b/module/cmd-bungee/src/main/java/net/md_5/bungee/module/cmd/bungee/PluginBungee.java
@@ -0,0 +1,13 @@
+package net.md_5.bungee.module.cmd.bungee;
+
+import net.md_5.bungee.api.plugin.Plugin;
+
+public class PluginBungee extends Plugin
+{
+
+ @Override
+ public void onEnable()
+ {
+ getProxy().getPluginManager().registerCommand( this, new CommandBungee( this ) );
+ }
+}
diff --git a/module/cmd-bungee/src/main/resources/plugin.yml b/module/cmd-bungee/src/main/resources/plugin.yml
new file mode 100644
index 00000000..66f3a39c
--- /dev/null
+++ b/module/cmd-bungee/src/main/resources/plugin.yml
@@ -0,0 +1,5 @@
+name: ${project.name}
+main: net.md_5.bungee.module.cmd.bungee.PluginBungee
+version: ${describe}
+description: ${project.description}
+author: ${module.author}
diff --git a/module/pom.xml b/module/pom.xml
index 0b495660..36785bd6 100644
--- a/module/pom.xml
+++ b/module/pom.xml
@@ -20,6 +20,7 @@
cmd-alert
+ cmd-bungee
cmd-find
cmd-kick
cmd-list
diff --git a/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java
index 150d8739..dd42cb75 100644
--- a/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java
+++ b/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java
@@ -95,7 +95,7 @@ public void load()
} ) );
set( "permissions.admin", Arrays.asList( new String[]
{
- "bungeecord.command.alert", "bungeecord.command.end", "bungeecord.command.ip", "bungeecord.command.reload", "bungeecord.command.kick"
+ "bungeecord.command.alert", "bungeecord.command.end", "bungeecord.command.ip", "bungeecord.command.reload", "bungeecord.command.kick", "bungeecord.command.bungee"
} ) );
}
diff --git a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
index 9c7293b8..be78145a 100644
--- a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
+++ b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
@@ -84,6 +84,7 @@ public void load(ProxyServer proxy, File moduleDirectory) throws Exception
{
case 0:
defaults.add( "jenkins://cmd_alert" );
+ defaults.add( "jenkins://cmd_bungee" );
defaults.add( "jenkins://cmd_find" );
defaults.add( "jenkins://cmd_list" );
defaults.add( "jenkins://cmd_send" );