diff --git a/module/cmd-kick/nb-configuration.xml b/module/cmd-kick/nb-configuration.xml
new file mode 100644
index 00000000..7e465924
--- /dev/null
+++ b/module/cmd-kick/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-kick/pom.xml b/module/cmd-kick/pom.xml
new file mode 100644
index 00000000..a43919ef
--- /dev/null
+++ b/module/cmd-kick/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+
+ net.md-5
+ bungeecord-module
+ 1.19-R0.1-SNAPSHOT
+ ../pom.xml
+
+
+ net.md-5
+ bungeecord-module-cmd-kick
+ 1.19-R0.1-SNAPSHOT
+ jar
+
+ cmd_kick
+ Provides the gkick command
+
diff --git a/module/cmd-kick/src/main/java/net/md_5/bungee/module/cmd/kick/CommandKick.java b/module/cmd-kick/src/main/java/net/md_5/bungee/module/cmd/kick/CommandKick.java
new file mode 100644
index 00000000..6dab5cc8
--- /dev/null
+++ b/module/cmd-kick/src/main/java/net/md_5/bungee/module/cmd/kick/CommandKick.java
@@ -0,0 +1,72 @@
+package net.md_5.bungee.module.cmd.kick;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableSet;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+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.TextComponent;
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+import net.md_5.bungee.api.plugin.Command;
+import net.md_5.bungee.api.plugin.TabExecutor;
+
+public class CommandKick extends Command implements TabExecutor
+{
+
+ public CommandKick()
+ {
+ super( "gkick", "bungeecord.command.kick" );
+ }
+
+ @Override
+ public void execute(CommandSender sender, String[] args)
+ {
+ if ( args.length == 0 )
+ {
+ sender.sendMessage( ProxyServer.getInstance().getTranslation( "username_needed" ) );
+ } else
+ {
+ ProxiedPlayer player = ProxyServer.getInstance().getPlayer( args[0] );
+
+ if ( player == null )
+ {
+ sender.sendMessage( TextComponent.fromLegacyText( ProxyServer.getInstance().getTranslation( "user_not_online" ) ) );
+ return;
+ }
+
+ if ( args.length == 1 )
+ {
+ player.disconnect( TextComponent.fromLegacyText( ProxyServer.getInstance().getTranslation( "kick_message" ) ) );
+ } else
+ {
+ String[] reason = new String[ args.length - 1 ];
+ System.arraycopy( args, 1, reason, 0, reason.length );
+ player.disconnect( TextComponent.fromLegacyText( ChatColor.translateAlternateColorCodes( '&', Joiner.on( ' ' ).join( reason ) ) ) );
+ }
+ }
+ }
+
+ @Override
+ public Iterable onTabComplete(CommandSender sender, String[] args)
+ {
+ if ( args.length == 1 )
+ {
+ Set matches = new HashSet<>();
+ String search = args[0].toLowerCase( Locale.ROOT );
+ for ( ProxiedPlayer player : ProxyServer.getInstance().getPlayers() )
+ {
+ if ( player.getName().toLowerCase( Locale.ROOT ).startsWith( search ) )
+ {
+ matches.add( player.getName() );
+ }
+ }
+ return matches;
+ } else
+ {
+ return ImmutableSet.of();
+ }
+ }
+}
diff --git a/module/cmd-kick/src/main/java/net/md_5/bungee/module/cmd/kick/PluginKick.java b/module/cmd-kick/src/main/java/net/md_5/bungee/module/cmd/kick/PluginKick.java
new file mode 100644
index 00000000..82b2332b
--- /dev/null
+++ b/module/cmd-kick/src/main/java/net/md_5/bungee/module/cmd/kick/PluginKick.java
@@ -0,0 +1,13 @@
+package net.md_5.bungee.module.cmd.kick;
+
+import net.md_5.bungee.api.plugin.Plugin;
+
+public class PluginKick extends Plugin
+{
+
+ @Override
+ public void onEnable()
+ {
+ getProxy().getPluginManager().registerCommand( this, new CommandKick() );
+ }
+}
diff --git a/module/cmd-kick/src/main/resources/plugin.yml b/module/cmd-kick/src/main/resources/plugin.yml
new file mode 100644
index 00000000..142d6901
--- /dev/null
+++ b/module/cmd-kick/src/main/resources/plugin.yml
@@ -0,0 +1,5 @@
+name: ${project.name}
+main: net.md_5.bungee.module.cmd.kick.PluginKick
+version: ${describe}
+description: ${project.description}
+author: ${module.author}
diff --git a/module/pom.xml b/module/pom.xml
index cbc26049..961560dc 100644
--- a/module/pom.xml
+++ b/module/pom.xml
@@ -21,6 +21,7 @@
cmd-alert
cmd-find
+ cmd-kick
cmd-list
cmd-send
cmd-server
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 2691b8b8..150d8739 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 class YamlConfig implements ConfigurationAdapter
} ) );
set( "permissions.admin", Arrays.asList( new String[]
{
- "bungeecord.command.alert", "bungeecord.command.end", "bungeecord.command.ip", "bungeecord.command.reload"
+ "bungeecord.command.alert", "bungeecord.command.end", "bungeecord.command.ip", "bungeecord.command.reload", "bungeecord.command.kick"
} ) );
}
diff --git a/proxy/src/main/resources/messages.properties b/proxy/src/main/resources/messages.properties
index 2b05a2dd..58380d4a 100644
--- a/proxy/src/main/resources/messages.properties
+++ b/proxy/src/main/resources/messages.properties
@@ -39,3 +39,4 @@ command_perms_groups=\u00a76You have the following groups: {0}
command_perms_permission=\u00a79- {0}
command_ip=\u00a79IP of {0} is {1}
illegal_chat_characters=\u00a7cillegal characters in chat ({0})
+kick_message=\u00a7cYou have been kicked off the proxy.