More work

This commit is contained in:
md_5 2013-01-17 12:37:02 +11:00
parent 592a504e77
commit 55867dbdc3
8 changed files with 148 additions and 166 deletions

View File

@ -98,6 +98,21 @@ public abstract class ProxyServer
*/
public abstract void setConfigurationAdapter(ConfigurationAdapter adapter);
/**
* Get the currently in use tab list handle.
*
* @return the tab list handler
*/
public abstract TabListHandler getTabListHandler();
/**
* Set the used tab list handler, should not be changed once players have
* connected
*
* @param handler the tab list handler to set
*/
public abstract void setTabListHandler(TabListHandler handler);
/**
* Gracefully mark this instance for shutdown.
*/

View File

@ -22,11 +22,11 @@ public class PluginMessageEvent extends TargetedEvent implements Cancellable
/**
* Tag specified for this plugin message.
*/
private String tag;
private final String tag;
/**
* Data contained in this plugin message.
*/
private byte[] data;
private final byte[] data;
public PluginMessageEvent(Connection sender, Connection receiver, String tag, byte[] data)
{

View File

@ -0,0 +1,26 @@
package net.md_5.bungee.api.event;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.plugin.Event;
@Data
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class ServerConnectEvent extends Event
{
/**
* Player connecting to a new server.
*/
private final ProxiedPlayer player;
/**
* Server the player will be connected to.
*/
private Server target;
}

View File

@ -2,7 +2,9 @@ package net.md_5.bungee.api.event;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import net.md_5.bungee.api.connection.Connection;
import net.md_5.bungee.api.plugin.Event;
/**
* An event which occurs in the communication between two nodes. It is not
@ -12,7 +14,8 @@ import net.md_5.bungee.api.connection.Connection;
*/
@Data
@AllArgsConstructor
public abstract class TargetedEvent
@EqualsAndHashCode(callSuper = false)
public abstract class TargetedEvent extends Event
{
/**

View File

@ -268,7 +268,7 @@ public class Configuration
*/
public void setServer(UserConnection user, String server)
{
reconnectLocations.put(user.username, server);
reconnectLocations.put(user.name, server);
}
/**

View File

@ -4,6 +4,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import static net.md_5.bungee.Logger.$;
import net.md_5.bungee.packet.PacketFFKick;
@ -20,8 +21,10 @@ public class GenericConnection
protected final Socket socket;
protected final PacketInputStream in;
protected final OutputStream out;
public String username;
public String tabListName;
@Getter
public String name;
@Getter
public String displayName;
/**
* Close the socket with the specified reason.
@ -55,6 +58,6 @@ public class GenericConnection
public void log(String message)
{
$().info(socket.getInetAddress() + ((username == null) ? " " : " [" + username + "] ") + message);
$().info(socket.getInetAddress() + ((name == null) ? " " : " [" + name + "] ") + message);
}
}

View File

@ -4,17 +4,18 @@ import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import javax.print.attribute.standard.Destination;
import lombok.Getter;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.packet.*;
public class UserConnection extends GenericConnection implements ProxiedPlayer
@ -23,6 +24,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
public final Packet2Handshake handshake;
public Queue<DefinedPacket> packetQueue = new ConcurrentLinkedQueue<>();
public List<byte[]> loginPackets = new ArrayList<>();
@Getter
private ServerConnection server;
private UpstreamBridge upBridge;
private DownstreamBridge downBridge;
@ -33,6 +35,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
// ping stuff
private int trackingPingId;
private long pingTime;
@Getter
private int ping;
public UserConnection instance = this;
@ -40,39 +43,25 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
{
super(socket, in, out);
this.handshake = handshake;
username = handshake.username;
tabListName = handshake.username;
name = handshake.username;
displayName = handshake.username;
this.loginPackets = loginPackets;
BungeeCord.instance.connections.put(username, this);
BungeeCord.instance.connections.put(name, this);
BungeeCord.instance.tabListHandler.onJoin(this);
}
public void setTabListName(String newName)
@Override
public void setDisplayName(String name)
{
BungeeCord.instance.tabListHandler.onDisconnect(this);
tabListName = newName;
BungeeCord.instance.tabListHandler.onJoin(this);
ProxyServer.getInstance().getTabListHandler().onDisconnect(this);
displayName = name;
ProxyServer.getInstance().getTabListHandler().onConnect(this);
}
public void connect(String server)
public void connect(Server server)
{
ServerConnectEvent event = new ServerConnectEvent(this.server == null, this, server);
event.setNewServer(server);
BungeeCord.instance.pluginManager.onServerConnect(event);
if (event.getMessage() != null)
{
this.sendMessage(event.getMessage());
}
if (event.getNewServer() == null)
{
if (event.isFirstTime())
{
event.setNewServer(BungeeCord.instance.config.defaultServerName);
} else
{
return;
}
}
ServerConnectEvent event = new ServerConnectEvent(this, server);
BungeeCord.getInstance().getPluginManager().callEvent(event);
InetSocketAddress addr = BungeeCord.instance.config.getServer(event.getNewServer());
connect(server, addr);
}
@ -146,21 +135,6 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
}
}
public String getServer()
{
return server.name;
}
public SocketAddress getAddress()
{
return socket.getRemoteSocketAddress();
}
public int getPing()
{
return ping;
}
private void setPing(int ping)
{
BungeeCord.instance.tabListHandler.onPingChange(this, ping);
@ -171,7 +145,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
{
if (BungeeCord.instance.isRunning)
{
BungeeCord.instance.connections.remove(username);
BungeeCord.instance.connections.remove(name);
if (server != null)
{
List<UserConnection> conns = BungeeCord.instance.connectionsByServer.get(server.name);
@ -202,45 +176,10 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
packetQueue.add(new Packet3Chat(message));
}
public void sendPluginMessage(String tag, byte[] data)
{
server.packetQueue.add(new PacketFAPluginMessage(tag, data));
}
@Override
public String getName()
{
return username;
}
@Override
public String getDisplayName()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setDisplayName(String name)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void connect(Server server)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Server getServer()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void sendData(String channel, byte[] data)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
server.packetQueue.add(new PacketFAPluginMessage(channel, data));
}
@Override
@ -284,7 +223,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
public UpstreamBridge()
{
super("Upstream Bridge - " + username);
super("Upstream Bridge - " + name);
}
@Override
@ -298,39 +237,37 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
boolean sendPacket = true;
int id = Util.getId(packet);
if (id == 0xFA)
switch (id)
{
case 0x00:
if (trackingPingId == new Packet0KeepAlive(packet).id)
{
setPing((int) (System.currentTimeMillis() - pingTime));
}
break;
case 0x03:
Packet3Chat chat = new Packet3Chat(packet);
if (chat.message.startsWith("/"))
{
sendPacket = !ProxyServer.getInstance().getPluginManager().dispatchCommand(UserConnection.this, chat.message.substring(1));
} else
{
ChatEvent chatEvent = new ChatEvent(UserConnection.this, server, chat.message);
ProxyServer.getInstance().getPluginManager().callEvent(chatEvent);
sendPacket = !chatEvent.isCancelled();
}
break;
case 0xFA:
// Call the onPluginMessage event
PacketFAPluginMessage message = new PacketFAPluginMessage(packet);
PluginMessageEvent event = new PluginMessageEvent(Destination.SERVER, instance);
event.setTag(message.tag);
event.setData(new String(message.data));
BungeeCord.instance.pluginManager.onPluginMessage(event);
PluginMessageEvent event = new PluginMessageEvent(UserConnection.this, server, message.tag, message.data);
ProxyServer.getInstance().getPluginManager().callEvent(event);
if (event.isCancelled())
{
continue;
}
} else if (id == 0x03)
{
Packet3Chat chat = new Packet3Chat(packet);
String message = chat.message;
if (message.startsWith("/"))
{
sendPacket = !BungeeCord.instance.dispatchCommand(message.substring(1), UserConnection.this);
} else
{
ChatEvent chatEvent = new ChatEvent(ChatEvent.Destination.SERVER, instance);
chatEvent.setText(message);
BungeeCord.instance.pluginManager.onChat(chatEvent);
sendPacket = !chatEvent.isCancelled();
}
} else if (id == 0x00)
{
if (trackingPingId == new Packet0KeepAlive(packet).id)
{
setPing((int) (System.currentTimeMillis() - pingTime));
}
break;
}
while (!server.packetQueue.isEmpty())
@ -363,7 +300,7 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
public DownstreamBridge()
{
super("Downstream Bridge - " + username);
super("Downstream Bridge - " + name);
}
@Override
@ -371,61 +308,59 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
{
try
{
outer:
while (!reconnecting)
{
byte[] packet = server.in.readPacket();
int id = Util.getId(packet);
if (id == 0xFA)
switch (id)
{
case 0x00:
trackingPingId = new Packet0KeepAlive(packet).id;
pingTime = System.currentTimeMillis();
break;
case 0x03:
Packet3Chat chat = new Packet3Chat(packet);
ChatEvent chatEvent = new ChatEvent(server, UserConnection.this, chat.message);
ProxyServer.getInstance().getPluginManager().callEvent(chatEvent);
if (chatEvent.isCancelled())
{
continue;
}
break;
case 0xC9:
PacketC9PlayerListItem playerList = new PacketC9PlayerListItem(packet);
if (!ProxyServer.getInstance().getTabListHandler().onListUpdate(instance, playerList.username, playerList.online, playerList.ping))
{
continue;
}
break;
case 0xFA:
// Call the onPluginMessage event
PacketFAPluginMessage message = new PacketFAPluginMessage(packet);
PluginMessageEvent event = new PluginMessageEvent(Destination.CLIENT, instance);
event.setTag(message.tag);
event.setData(new String(message.data));
BungeeCord.instance.pluginManager.onPluginMessage(event);
PluginMessageEvent event = new PluginMessageEvent(server, UserConnection.this, message.tag, message.data);
ProxyServer.getInstance().getPluginManager().callEvent(event);
if (event.isCancelled())
{
continue;
}
message.tag = event.getTag();
message.data = event.getData().getBytes();
// Allow a message for killing the connection outright
if (message.tag.equals("KillCon"))
switch (message.tag)
{
break;
}
if (message.tag.equals("RubberBand"))
case "BungeeCord::Disconnect":
break outer;
case "BungeeCord::Connect":
Server server = ProxyServer.getInstance().getServer(new String(message.data));
if (server != null)
{
String server = new String(message.data);
connect(server);
break outer;
}
break;
}
} else if (id == 0x00)
{
trackingPingId = new Packet0KeepAlive(packet).id;
pingTime = System.currentTimeMillis();
} else if (id == 0x03)
{
Packet3Chat chat = new Packet3Chat(packet);
String message = chat.message;
ChatEvent chatEvent = new ChatEvent(ChatEvent.Destination.CLIENT, instance);
chatEvent.setText(message);
BungeeCord.instance.pluginManager.onChat(chatEvent);
if (chatEvent.isCancelled())
{
continue;
}
} else if (id == 0xC9)
{
if (!BungeeCord.instance.tabListHandler.onPacketC9(UserConnection.this, new PacketC9PlayerListItem(packet)))
{
continue;
}
}
while (!packetQueue.isEmpty())

View File

@ -19,7 +19,7 @@ public class GlobalTabList implements TabListHandler
{
for (UserConnection c : BungeeCord.getInstance().connections.values())
{
c.packetQueue.add(new PacketC9PlayerListItem(c.tabListName, true, c.getPing()));
c.packetQueue.add(new PacketC9PlayerListItem(c.displayName, true, c.getPing()));
}
}