Add command ip and permissions.

This commit is contained in:
md_5 2012-10-15 14:14:08 +11:00
parent 7415afdbfd
commit 86b081ddfd
10 changed files with 117 additions and 4 deletions

View File

@ -15,6 +15,7 @@ import java.util.logging.Level;
import static net.md_5.bungee.Logger.$; import static net.md_5.bungee.Logger.$;
import net.md_5.bungee.command.Command; import net.md_5.bungee.command.Command;
import net.md_5.bungee.command.CommandEnd; import net.md_5.bungee.command.CommandEnd;
import net.md_5.bungee.command.CommandIP;
import net.md_5.bungee.command.CommandList; import net.md_5.bungee.command.CommandList;
import net.md_5.bungee.command.CommandSender; import net.md_5.bungee.command.CommandSender;
import net.md_5.bungee.command.CommandServer; import net.md_5.bungee.command.CommandServer;
@ -71,6 +72,7 @@ public class BungeeCord {
commandMap.put("end", new CommandEnd()); commandMap.put("end", new CommandEnd());
commandMap.put("glist", new CommandList()); commandMap.put("glist", new CommandList());
commandMap.put("server", new CommandServer()); commandMap.put("server", new CommandServer());
commandMap.put("ip", new CommandIP());
} }
/** /**
@ -107,7 +109,7 @@ public class BungeeCord {
String[] split = commandLine.trim().split(" "); String[] split = commandLine.trim().split(" ");
String commandName = split[0].toLowerCase(); String commandName = split[0].toLowerCase();
Command command = commandMap.get(commandName); Command command = commandMap.get(commandName);
if (command != null) { if (command != null && !config.disabledCommands.contains(commandName)) {
String[] args = Arrays.copyOfRange(split, 1, split.length); String[] args = Arrays.copyOfRange(split, 1, split.length);
try { try {
command.execute(sender, args); command.execute(sender, args);

View File

@ -14,6 +14,8 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static net.md_5.bungee.Logger.$; import static net.md_5.bungee.Logger.$;
import net.md_5.bungee.command.CommandSender;
import net.md_5.bungee.command.ConsoleCommandSender;
import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.Yaml;
@ -95,6 +97,14 @@ public class Configuration {
add("mbaxter"); add("mbaxter");
} }
}; };
/**
* Commands which will be blocked completely.
*/
public List<String> disabledCommands = new ArrayList<String>() {
{
add("glist");
}
};
/** /**
* Maximum number of lines to log before old ones are removed. * Maximum number of lines to log before old ones are removed.
*/ */
@ -225,4 +235,20 @@ public class Configuration {
save(reconnect, reconnectLocations); save(reconnect, reconnectLocations);
$().info("Saved reconnect locations to " + reconnect); $().info("Saved reconnect locations to " + reconnect);
} }
/**
* Get the highest permission a player has.
*
* @param sender to get permissions of
* @return their permission
*/
public Permission getPermission(CommandSender sender) {
Permission permission = Permission.DEFAULT;
if (admins.contains(sender.getName()) || sender instanceof ConsoleCommandSender) {
permission = Permission.ADMIN;
} else if (moderators.contains(sender.getName())) {
permission = Permission.MODERATOR;
}
return permission;
}
} }

View File

@ -0,0 +1,17 @@
package net.md_5.bungee;
public enum Permission {
/**
* Can access all commands.
*/
ADMIN,
/**
* Can access commands which do not affect everyone.
*/
MODERATOR,
/**
* Can access other commands.
*/
DEFAULT;
}

View File

@ -2,8 +2,10 @@ package net.md_5.bungee;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
import java.net.SocketAddress;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import net.md_5.bungee.command.CommandSender; import net.md_5.bungee.command.CommandSender;
@ -86,6 +88,10 @@ public class UserConnection extends GenericConnection implements CommandSender {
} }
} }
public SocketAddress getAddress() {
return socket.getRemoteSocketAddress();
}
private void destroySelf(String reason) { private void destroySelf(String reason) {
if (BungeeCord.instance.isRunning) { if (BungeeCord.instance.isRunning) {
BungeeCord.instance.connections.remove(username); BungeeCord.instance.connections.remove(username);
@ -102,6 +108,11 @@ public class UserConnection extends GenericConnection implements CommandSender {
packetQueue.add(new Packet3Chat(message)); packetQueue.add(new Packet3Chat(message));
} }
@Override
public String getName() {
return username;
}
private class UpstreamBridge extends Thread { private class UpstreamBridge extends Thread {
public UpstreamBridge() { public UpstreamBridge() {

View File

@ -1,5 +1,8 @@
package net.md_5.bungee.command; package net.md_5.bungee.command;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.Permission;
/** /**
* Class which represents a proxy command. The {@link #execute(net.md_5.bungee.command.CommandSender, java.lang.String[]) * Class which represents a proxy command. The {@link #execute(net.md_5.bungee.command.CommandSender, java.lang.String[])
* } method will be called to dispatch the command. * } method will be called to dispatch the command.
@ -14,4 +17,8 @@ public abstract class Command {
* the original command. * the original command.
*/ */
public abstract void execute(CommandSender sender, String[] args); public abstract void execute(CommandSender sender, String[] args);
public Permission getPermission(CommandSender sender) {
return BungeeCord.instance.config.getPermission(sender);
}
} }

View File

@ -2,6 +2,7 @@ package net.md_5.bungee.command;
import net.md_5.bungee.BungeeCord; import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.ChatColor; import net.md_5.bungee.ChatColor;
import net.md_5.bungee.Permission;
/** /**
* Command to terminate the proxy instance. May only be used by the console. * Command to terminate the proxy instance. May only be used by the console.
@ -10,9 +11,10 @@ public class CommandEnd extends Command {
@Override @Override
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
if (!(sender instanceof ConsoleCommandSender)) { if (getPermission(sender) != Permission.ADMIN) {
sender.sendMessage(ChatColor.RED + "Only the console can use this command"); sender.sendMessage(ChatColor.RED + "You do not have permission to use this command");
} else {
BungeeCord.instance.stop();
} }
BungeeCord.instance.stop();
} }
} }

View File

@ -0,0 +1,27 @@
package net.md_5.bungee.command;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.ChatColor;
import net.md_5.bungee.Permission;
import net.md_5.bungee.UserConnection;
public class CommandIP extends Command {
@Override
public void execute(CommandSender sender, String[] args) {
if (getPermission(sender) != Permission.ADMIN) {
sender.sendMessage(ChatColor.RED + "You do not have permission to use this command");
return;
}
if (args.length < 1) {
sender.sendMessage(ChatColor.RED + "Please follow this command by a user name");
return;
}
UserConnection user = BungeeCord.instance.connections.get(args[0]);
if (user == null) {
sender.sendMessage(ChatColor.RED + "That user is not online");
} else {
sender.sendMessage(ChatColor.BLUE + "IP of " + args[0] + " is " + user.getAddress());
}
}
}

View File

@ -16,8 +16,17 @@ public class CommandList extends Command {
Collection<UserConnection> connections = BungeeCord.instance.connections.values(); Collection<UserConnection> connections = BungeeCord.instance.connections.values();
for (UserConnection con : connections) { for (UserConnection con : connections) {
switch (getPermission(con)) {
case ADMIN:
users.append(ChatColor.RED);
break;
case MODERATOR:
users.append(ChatColor.GREEN);
break;
}
users.append(con.username); users.append(con.username);
users.append(", "); users.append(", ");
users.append(ChatColor.RESET);
} }
users.setLength(users.length() - 2); users.setLength(users.length() - 2);

View File

@ -8,4 +8,11 @@ public interface CommandSender {
* @param message the message to send * @param message the message to send
*/ */
public abstract void sendMessage(String message); public abstract void sendMessage(String message);
/**
* Get the senders name or CONSOLE for console.
*
* @return the friendly name of the player.
*/
public abstract String getName();
} }

View File

@ -13,4 +13,9 @@ public class ConsoleCommandSender implements CommandSender {
public void sendMessage(String message) { public void sendMessage(String message) {
System.out.println(ChatColor.stripColor(message)); System.out.println(ChatColor.stripColor(message));
} }
@Override
public String getName() {
return "CONSOLE";
}
} }