2013-07-26 17:30:47 +02:00
|
|
|
/*
|
|
|
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
|
|
|
* Copyright (C) 2012 Kristian S. Stangeland
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
|
|
|
* GNU General Public License as published by the Free Software Foundation; either version 2 of
|
|
|
|
* the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
* See the GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with this program;
|
|
|
|
* if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
|
|
* 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
package com.comphenix.protocol;
|
|
|
|
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
2013-12-19 02:17:06 +01:00
|
|
|
import java.util.ArrayDeque;
|
2013-07-26 17:30:47 +02:00
|
|
|
import java.util.ArrayList;
|
2013-12-19 02:17:06 +01:00
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Deque;
|
2022-05-26 05:30:08 +02:00
|
|
|
import java.util.HashSet;
|
2013-07-26 17:30:47 +02:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
|
|
|
import java.util.WeakHashMap;
|
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
|
|
import org.bukkit.ChatColor;
|
|
|
|
import org.bukkit.command.CommandSender;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.plugin.Plugin;
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
import com.comphenix.protocol.PacketType.Sender;
|
|
|
|
import com.comphenix.protocol.concurrency.PacketTypeSet;
|
2013-07-26 17:30:47 +02:00
|
|
|
import com.comphenix.protocol.error.ErrorReporter;
|
|
|
|
import com.comphenix.protocol.error.Report;
|
|
|
|
import com.comphenix.protocol.error.ReportType;
|
|
|
|
import com.comphenix.protocol.events.ListeningWhitelist;
|
|
|
|
import com.comphenix.protocol.events.PacketEvent;
|
|
|
|
import com.comphenix.protocol.events.PacketListener;
|
|
|
|
import com.comphenix.protocol.utility.ChatExtensions;
|
2014-05-02 03:49:33 +02:00
|
|
|
import com.comphenix.protocol.utility.HexDumper;
|
2014-05-01 20:14:03 +02:00
|
|
|
import com.google.common.collect.MapMaker;
|
2013-07-26 17:30:47 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles the "packet" debug command.
|
|
|
|
*
|
|
|
|
* @author Kristian
|
|
|
|
*/
|
|
|
|
class CommandPacket extends CommandBase {
|
|
|
|
public static final ReportType REPORT_CANNOT_SEND_MESSAGE = new ReportType("Cannot send chat message.");
|
2013-12-19 02:17:06 +01:00
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
private enum SubCommand {
|
|
|
|
ADD, REMOVE, NAMES, PAGE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Name of this command.
|
|
|
|
*/
|
|
|
|
public static final String NAME = "packet";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Number of lines per page.
|
|
|
|
*/
|
|
|
|
public static final int PAGE_LINE_COUNT = 9;
|
|
|
|
|
|
|
|
private Plugin plugin;
|
|
|
|
private Logger logger;
|
|
|
|
private ProtocolManager manager;
|
|
|
|
|
|
|
|
private ChatExtensions chatter;
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
// The main parser
|
|
|
|
private PacketTypeParser typeParser = new PacketTypeParser();
|
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
// Paged message
|
|
|
|
private Map<CommandSender, List<String>> pagedMessage = new WeakHashMap<CommandSender, List<String>>();
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
// Current registered packet types
|
|
|
|
private PacketTypeSet packetTypes = new PacketTypeSet();
|
|
|
|
private PacketTypeSet extendedTypes = new PacketTypeSet();
|
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
// Compare listeners
|
|
|
|
private PacketTypeSet compareTypes = new PacketTypeSet();
|
|
|
|
private Map<PacketEvent, String> originalPackets = new MapMaker().weakKeys().makeMap();
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
// The packet listener
|
|
|
|
private PacketListener listener;
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
// Compare listener
|
|
|
|
private PacketListener compareListener;
|
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
// Filter packet events
|
|
|
|
private CommandFilter filter;
|
|
|
|
|
|
|
|
public CommandPacket(ErrorReporter reporter, Plugin plugin, Logger logger, CommandFilter filter, ProtocolManager manager) {
|
|
|
|
super(reporter, CommandBase.PERMISSION_ADMIN, NAME, 1);
|
|
|
|
this.plugin = plugin;
|
|
|
|
this.logger = logger;
|
|
|
|
this.manager = manager;
|
|
|
|
this.filter = filter;
|
|
|
|
this.chatter = new ChatExtensions(manager);
|
|
|
|
}
|
2013-12-19 02:17:06 +01:00
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
/**
|
|
|
|
* Send a message without invoking the packet listeners.
|
|
|
|
* @param receiver - the player to send it to.
|
|
|
|
* @param message - the message to send.
|
|
|
|
* @return TRUE if the message was sent successfully, FALSE otherwise.
|
|
|
|
*/
|
|
|
|
public void sendMessageSilently(CommandSender receiver, String message) {
|
|
|
|
try {
|
|
|
|
chatter.sendMessageSilently(receiver, message);
|
|
|
|
} catch (InvocationTargetException e) {
|
|
|
|
reporter.reportDetailed(this,
|
|
|
|
Report.newBuilder(REPORT_CANNOT_SEND_MESSAGE).error(e).callerParam(receiver, message)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Broadcast a message without invoking any packet listeners.
|
|
|
|
* @param message - message to send.
|
|
|
|
* @param permission - permission required to receieve the message. NULL to target everyone.
|
|
|
|
*/
|
|
|
|
public void broadcastMessageSilently(String message, String permission) {
|
|
|
|
try {
|
|
|
|
chatter.broadcastMessageSilently(message, permission);
|
|
|
|
} catch (InvocationTargetException e) {
|
|
|
|
reporter.reportDetailed(this,
|
|
|
|
Report.newBuilder(REPORT_CANNOT_SEND_MESSAGE).error(e).callerParam(message, permission)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void printPage(CommandSender sender, int pageIndex) {
|
|
|
|
List<String> paged = pagedMessage.get(sender);
|
|
|
|
|
|
|
|
// Make sure the player has any pages
|
|
|
|
if (paged != null) {
|
|
|
|
int lastPage = ((paged.size() - 1) / PAGE_LINE_COUNT) + 1;
|
|
|
|
|
|
|
|
for (int i = PAGE_LINE_COUNT * (pageIndex - 1); i < PAGE_LINE_COUNT * pageIndex; i++) {
|
|
|
|
if (i < paged.size()) {
|
|
|
|
sendMessageSilently(sender, " " + paged.get(i));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// More data?
|
|
|
|
if (pageIndex < lastPage) {
|
|
|
|
sendMessageSilently(sender, "Send /packet page " + (pageIndex + 1) + " for the next page.");
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
sendMessageSilently(sender, ChatColor.RED + "No pages found.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Description: Adds or removes a simple packet listener.
|
|
|
|
Usage: /<command> add|remove client|server|both [ID start] [ID stop] [detailed]
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
protected boolean handleCommand(CommandSender sender, String[] args) {
|
|
|
|
try {
|
2013-12-19 02:17:06 +01:00
|
|
|
Deque<String> arguments = new ArrayDeque<String>(Arrays.asList(args));
|
|
|
|
SubCommand subCommand = parseCommand(arguments);
|
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
// Commands with different parameters
|
|
|
|
if (subCommand == SubCommand.PAGE) {
|
2014-01-11 02:13:41 +01:00
|
|
|
if (args.length <= 1) {
|
|
|
|
sendMessageSilently(sender, ChatColor.RED + "Must specify a page index.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
int page = Integer.parseInt(args[1]);
|
|
|
|
|
|
|
|
if (page > 0)
|
|
|
|
printPage(sender, page);
|
|
|
|
else
|
|
|
|
sendMessageSilently(sender, ChatColor.RED + "Page index must be greater than zero.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
Set<PacketType> types = typeParser.parseTypes(arguments, PacketTypeParser.DEFAULT_MAX_RANGE);
|
|
|
|
Boolean detailed = parseBoolean(arguments, "detailed");
|
2014-05-01 20:14:03 +02:00
|
|
|
Boolean compare = parseBoolean(arguments, "compare");
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2014-01-19 00:27:57 +01:00
|
|
|
// Notify user
|
|
|
|
if (typeParser.getLastProtocol() == null) {
|
|
|
|
sender.sendMessage(ChatColor.YELLOW + "Warning: Missing protocol (PLAY, etc) - assuming legacy IDs.");
|
|
|
|
}
|
2013-12-19 02:17:06 +01:00
|
|
|
if (arguments.size() > 0) {
|
2014-01-20 06:21:20 +01:00
|
|
|
throw new IllegalArgumentException("Cannot parse " + arguments);
|
2013-12-19 02:17:06 +01:00
|
|
|
}
|
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
// The last elements are optional
|
2013-07-26 17:30:47 +02:00
|
|
|
if (detailed == null) {
|
|
|
|
detailed = false;
|
|
|
|
}
|
2014-05-01 20:14:03 +02:00
|
|
|
if (compare == null) {
|
|
|
|
compare = false;
|
|
|
|
} else {
|
|
|
|
// This is implied - we cannot compare content without going detailed
|
|
|
|
detailed = true;
|
|
|
|
}
|
2013-07-26 17:30:47 +02:00
|
|
|
|
|
|
|
// Perform commands
|
|
|
|
if (subCommand == SubCommand.ADD) {
|
|
|
|
// The add command is dangerous - don't default on the connection side
|
|
|
|
if (args.length == 1) {
|
2013-12-10 16:27:30 +01:00
|
|
|
sender.sendMessage(ChatColor.RED + "Please specify a connection side.");
|
2013-07-26 17:30:47 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
executeAddCommand(sender, types, detailed, compare);
|
2013-07-26 17:30:47 +02:00
|
|
|
} else if (subCommand == SubCommand.REMOVE) {
|
2013-12-19 02:17:06 +01:00
|
|
|
executeRemoveCommand(sender, types);
|
2013-07-26 17:30:47 +02:00
|
|
|
} else if (subCommand == SubCommand.NAMES) {
|
2013-12-19 02:17:06 +01:00
|
|
|
executeNamesCommand(sender, types);
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
sendMessageSilently(sender, ChatColor.RED + "Cannot parse number: " + e.getMessage());
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
sendMessageSilently(sender, ChatColor.RED + e.getMessage());
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
private void executeAddCommand(CommandSender sender, Set<PacketType> addition, boolean detailed, boolean compare) {
|
2013-12-19 02:17:06 +01:00
|
|
|
packetTypes.addAll(addition);
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
// Also mark these types as "detailed"
|
|
|
|
if (detailed) {
|
|
|
|
extendedTypes.addAll(addition);
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
2014-05-01 20:14:03 +02:00
|
|
|
// Whether or not to compare the packet with the initial state
|
|
|
|
if (compare) {
|
|
|
|
compareTypes.addAll(addition);
|
|
|
|
}
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
updatePacketListener();
|
2014-08-05 03:52:37 +02:00
|
|
|
sendMessageSilently(sender, ChatColor.YELLOW + "Added listener " + getWhitelistInfo(listener));
|
2013-12-19 02:17:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private void executeRemoveCommand(CommandSender sender, Set<PacketType> removal) {
|
|
|
|
packetTypes.removeAll(removal);
|
|
|
|
extendedTypes.removeAll(removal);
|
2014-05-01 20:14:03 +02:00
|
|
|
compareTypes.removeAll(removal);
|
2013-12-19 02:17:06 +01:00
|
|
|
updatePacketListener();
|
2014-08-05 03:52:37 +02:00
|
|
|
sendMessageSilently(sender, ChatColor.YELLOW + "Removing packet types.");
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
private void executeNamesCommand(CommandSender sender, Set<PacketType> types) {
|
2013-07-26 17:30:47 +02:00
|
|
|
List<String> messages = new ArrayList<String>();
|
|
|
|
|
|
|
|
// Print the equivalent name of every given ID
|
2013-12-19 02:17:06 +01:00
|
|
|
for (PacketType type : types) {
|
2014-08-05 03:52:37 +02:00
|
|
|
messages.add(ChatColor.YELLOW + type.toString());
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (sender instanceof Player && messages.size() > 0 && messages.size() > PAGE_LINE_COUNT) {
|
|
|
|
// Divide the messages into chuncks
|
|
|
|
pagedMessage.put(sender, messages);
|
|
|
|
printPage(sender, 1);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// Just print the damn thing
|
|
|
|
for (String message : messages) {
|
|
|
|
sendMessageSilently(sender, message);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve whitelist information about a given listener.
|
|
|
|
* @param listener - the given listener.
|
|
|
|
* @return Whitelist information.
|
|
|
|
*/
|
|
|
|
private String getWhitelistInfo(PacketListener listener) {
|
|
|
|
boolean sendingEmpty = ListeningWhitelist.isEmpty(listener.getSendingWhitelist());
|
|
|
|
boolean receivingEmpty = ListeningWhitelist.isEmpty(listener.getReceivingWhitelist());
|
|
|
|
|
|
|
|
if (!sendingEmpty && !receivingEmpty)
|
|
|
|
return String.format("Sending: %s, Receiving: %s", listener.getSendingWhitelist(), listener.getReceivingWhitelist());
|
|
|
|
else if (!sendingEmpty)
|
|
|
|
return listener.getSendingWhitelist().toString();
|
|
|
|
else if (!receivingEmpty)
|
|
|
|
return listener.getReceivingWhitelist().toString();
|
|
|
|
else
|
|
|
|
return "[None]";
|
|
|
|
}
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
private Set<PacketType> filterTypes(Set<PacketType> types, Sender sender) {
|
2022-05-26 05:30:08 +02:00
|
|
|
final Set<PacketType> result = new HashSet<>();
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
for (PacketType type : types) {
|
|
|
|
if (type.getSender() == sender) {
|
|
|
|
result.add(type);
|
|
|
|
}
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
2013-12-19 02:17:06 +01:00
|
|
|
|
|
|
|
public PacketListener createPacketListener(Set<PacketType> type) {
|
|
|
|
final ListeningWhitelist serverList = ListeningWhitelist.newBuilder().
|
|
|
|
types(filterTypes(type, Sender.SERVER)).
|
|
|
|
gamePhaseBoth().
|
|
|
|
monitor().
|
|
|
|
build();
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
final ListeningWhitelist clientList = ListeningWhitelist.newBuilder(serverList).
|
|
|
|
types(filterTypes(type, Sender.CLIENT)).
|
2014-05-01 20:14:03 +02:00
|
|
|
monitor().
|
2013-12-19 02:17:06 +01:00
|
|
|
build();
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
return new PacketListener() {
|
2013-07-26 17:30:47 +02:00
|
|
|
@Override
|
|
|
|
public void onPacketSending(PacketEvent event) {
|
2013-12-19 02:17:06 +01:00
|
|
|
if (filter.filterEvent(event)) {
|
2013-07-26 17:30:47 +02:00
|
|
|
printInformation(event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onPacketReceiving(PacketEvent event) {
|
2013-12-19 02:17:06 +01:00
|
|
|
if (filter.filterEvent(event)) {
|
2013-07-26 17:30:47 +02:00
|
|
|
printInformation(event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void printInformation(PacketEvent event) {
|
2013-12-19 02:17:06 +01:00
|
|
|
String verb = event.isServerPacket() ? "Sent" : "Received";
|
|
|
|
String format = event.isServerPacket() ?
|
|
|
|
"%s %s to %s" :
|
|
|
|
"%s %s from %s";
|
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
String shortDescription = String.format(format,
|
2013-08-07 00:33:57 +02:00
|
|
|
event.isCancelled() ? "Cancelled" : verb,
|
2013-12-19 02:17:06 +01:00
|
|
|
event.getPacketType(),
|
2013-07-26 17:30:47 +02:00
|
|
|
event.getPlayer().getName()
|
|
|
|
);
|
|
|
|
|
|
|
|
// Detailed will print the packet's content too
|
2013-12-19 02:17:06 +01:00
|
|
|
if (extendedTypes.contains(event.getPacketType())) {
|
2013-07-26 17:30:47 +02:00
|
|
|
try {
|
2014-05-01 20:14:03 +02:00
|
|
|
String original = originalPackets.remove(event);
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
// Also print original
|
|
|
|
if (original != null) {
|
|
|
|
logger.info("Initial packet:\n" + original + " -> ");
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
|
|
|
|
2021-01-04 19:35:58 +01:00
|
|
|
logger.info(shortDescription + ":\n" + HexDumper.getPacketDescription(
|
2014-05-01 20:14:03 +02:00
|
|
|
event.getPacket())
|
2013-07-26 17:30:47 +02:00
|
|
|
);
|
|
|
|
} catch (IllegalAccessException e) {
|
|
|
|
logger.log(Level.WARNING, "Unable to use reflection.", e);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
logger.info(shortDescription + ".");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
@Override
|
|
|
|
public ListeningWhitelist getSendingWhitelist() {
|
|
|
|
return serverList;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public ListeningWhitelist getReceivingWhitelist() {
|
|
|
|
return clientList;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Plugin getPlugin() {
|
|
|
|
return plugin;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
public PacketListener createCompareListener(Set<PacketType> type) {
|
|
|
|
final ListeningWhitelist serverList = ListeningWhitelist.newBuilder().
|
|
|
|
types(filterTypes(type, Sender.SERVER)).
|
|
|
|
gamePhaseBoth().
|
|
|
|
lowest().
|
|
|
|
build();
|
|
|
|
|
|
|
|
final ListeningWhitelist clientList = ListeningWhitelist.newBuilder(serverList).
|
|
|
|
types(filterTypes(type, Sender.CLIENT)).
|
|
|
|
lowest().
|
|
|
|
build();
|
|
|
|
|
|
|
|
return new PacketListener() {
|
|
|
|
@Override
|
|
|
|
public void onPacketSending(PacketEvent event) {
|
|
|
|
savePacketState(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onPacketReceiving(PacketEvent event) {
|
|
|
|
savePacketState(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Save the original value.
|
|
|
|
* @param event - the event with the packet to save.
|
|
|
|
*/
|
|
|
|
private void savePacketState(PacketEvent event) {
|
|
|
|
try {
|
2021-01-04 19:35:58 +01:00
|
|
|
originalPackets.put(event, HexDumper.getPacketDescription(event.getPacket()));
|
2014-05-01 20:14:03 +02:00
|
|
|
} catch (IllegalAccessException e) {
|
|
|
|
throw new RuntimeException("Cannot read packet.", e);
|
2014-02-15 12:47:30 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-26 17:30:47 +02:00
|
|
|
@Override
|
|
|
|
public ListeningWhitelist getSendingWhitelist() {
|
2013-12-19 02:17:06 +01:00
|
|
|
return serverList;
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public ListeningWhitelist getReceivingWhitelist() {
|
2013-12-19 02:17:06 +01:00
|
|
|
return clientList;
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Plugin getPlugin() {
|
|
|
|
return plugin;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2013-12-19 02:17:06 +01:00
|
|
|
public PacketListener updatePacketListener() {
|
2013-07-26 17:30:47 +02:00
|
|
|
if (listener != null) {
|
2013-12-19 02:17:06 +01:00
|
|
|
manager.removePacketListener(listener);
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
2014-05-01 20:14:03 +02:00
|
|
|
if (compareListener != null) {
|
|
|
|
manager.removePacketListener(compareListener);
|
|
|
|
}
|
2013-07-26 17:30:47 +02:00
|
|
|
|
2014-05-01 20:14:03 +02:00
|
|
|
// Register the new listeners
|
2013-12-19 02:17:06 +01:00
|
|
|
listener = createPacketListener(packetTypes.values());
|
2014-05-01 20:14:03 +02:00
|
|
|
compareListener = createCompareListener(compareTypes.values());
|
2013-12-19 02:17:06 +01:00
|
|
|
manager.addPacketListener(listener);
|
2014-05-01 20:14:03 +02:00
|
|
|
manager.addPacketListener(compareListener);
|
2013-12-19 02:17:06 +01:00
|
|
|
return listener;
|
2013-07-26 17:30:47 +02:00
|
|
|
}
|
2013-12-19 02:17:06 +01:00
|
|
|
|
|
|
|
private SubCommand parseCommand(Deque<String> arguments) {
|
|
|
|
String text = arguments.poll().toLowerCase();
|
2013-07-26 17:30:47 +02:00
|
|
|
|
|
|
|
// Parse this too
|
|
|
|
if ("add".startsWith(text))
|
|
|
|
return SubCommand.ADD;
|
|
|
|
else if ("remove".startsWith(text))
|
|
|
|
return SubCommand.REMOVE;
|
|
|
|
else if ("names".startsWith(text))
|
|
|
|
return SubCommand.NAMES;
|
|
|
|
else if ("page".startsWith(text))
|
|
|
|
return SubCommand.PAGE;
|
|
|
|
else
|
|
|
|
throw new IllegalArgumentException(text + " is not a valid sub command. Must be add or remove.");
|
|
|
|
}
|
|
|
|
}
|