Add yaml reconnect handler.
This commit is contained in:
parent
355afba6da
commit
77d5398124
@ -1,6 +1,7 @@
|
|||||||
package net.md_5.bungee.api.connection;
|
package net.md_5.bungee.api.connection;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import net.md_5.bungee.api.config.ListenerInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a user attempting to log into the proxy.
|
* Represents a user attempting to log into the proxy.
|
||||||
@ -36,4 +37,11 @@ public interface PendingConnection extends Connection
|
|||||||
* @param reason the disconnect reason displayed to the player
|
* @param reason the disconnect reason displayed to the player
|
||||||
*/
|
*/
|
||||||
public void disconnect(String reason);
|
public void disconnect(String reason);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the listener that accepted this connection.
|
||||||
|
*
|
||||||
|
* @return the accepting listener
|
||||||
|
*/
|
||||||
|
public ListenerInfo getListener();
|
||||||
}
|
}
|
||||||
|
@ -55,4 +55,11 @@ public interface ProxiedPlayer extends Connection, CommandSender
|
|||||||
* @param data the data to send
|
* @param data the data to send
|
||||||
*/
|
*/
|
||||||
public void sendData(String channel, byte[] data);
|
public void sendData(String channel, byte[] data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the pending connection that belongs to this player.
|
||||||
|
*
|
||||||
|
* @return the pending connection that this player used
|
||||||
|
*/
|
||||||
|
public PendingConnection getPendingConnection();
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ public class BungeeCord extends ProxyServer
|
|||||||
public final PluginManager pluginManager = new PluginManager();
|
public final PluginManager pluginManager = new PluginManager();
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private ReconnectHandler reconnectHandler;
|
private ReconnectHandler reconnectHandler = new YamlReconnectHandler();
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private ConfigurationAdapter configurationAdapter = new YamlConfig();
|
private ConfigurationAdapter configurationAdapter = new YamlConfig();
|
||||||
|
@ -8,6 +8,7 @@ import java.net.Socket;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKey;
|
||||||
|
import lombok.Getter;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.config.ListenerInfo;
|
import net.md_5.bungee.api.config.ListenerInfo;
|
||||||
@ -26,7 +27,8 @@ public class InitialHandler implements Runnable, PendingConnection
|
|||||||
{
|
{
|
||||||
|
|
||||||
private final Socket socket;
|
private final Socket socket;
|
||||||
private final ListenerInfo info;
|
@Getter
|
||||||
|
private final ListenerInfo listener;
|
||||||
private PacketInputStream in;
|
private PacketInputStream in;
|
||||||
private OutputStream out;
|
private OutputStream out;
|
||||||
private Packet2Handshake handshake;
|
private Packet2Handshake handshake;
|
||||||
@ -34,7 +36,7 @@ public class InitialHandler implements Runnable, PendingConnection
|
|||||||
public InitialHandler(Socket socket, ListenerInfo info) throws IOException
|
public InitialHandler(Socket socket, ListenerInfo info) throws IOException
|
||||||
{
|
{
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
this.info = info;
|
this.listener = info;
|
||||||
in = new PacketInputStream(socket.getInputStream());
|
in = new PacketInputStream(socket.getInputStream());
|
||||||
out = socket.getOutputStream();
|
out = socket.getOutputStream();
|
||||||
}
|
}
|
||||||
@ -77,7 +79,7 @@ public class InitialHandler implements Runnable, PendingConnection
|
|||||||
customPackets.add(custom);
|
customPackets.add(custom);
|
||||||
}
|
}
|
||||||
|
|
||||||
UserConnection userCon = new UserConnection(socket, info, in, out, handshake, customPackets);
|
UserConnection userCon = new UserConnection(socket, this, in, out, handshake, customPackets);
|
||||||
String server = ProxyServer.getInstance().getReconnectHandler().getServer(userCon);
|
String server = ProxyServer.getInstance().getReconnectHandler().getServer(userCon);
|
||||||
ServerInfo s = BungeeCord.getInstance().config.getServers().get(server);
|
ServerInfo s = BungeeCord.getInstance().config.getServers().get(server);
|
||||||
userCon.connect(s);
|
userCon.connect(s);
|
||||||
@ -96,10 +98,10 @@ public class InitialHandler implements Runnable, PendingConnection
|
|||||||
String ping = (newPing) ? ChatColor.COLOR_CHAR + "1"
|
String ping = (newPing) ? ChatColor.COLOR_CHAR + "1"
|
||||||
+ "\00" + BungeeCord.PROTOCOL_VERSION
|
+ "\00" + BungeeCord.PROTOCOL_VERSION
|
||||||
+ "\00" + BungeeCord.GAME_VERSION
|
+ "\00" + BungeeCord.GAME_VERSION
|
||||||
+ "\00" + info.getMotd()
|
+ "\00" + listener.getMotd()
|
||||||
+ "\00" + ProxyServer.getInstance().getPlayers().size()
|
+ "\00" + ProxyServer.getInstance().getPlayers().size()
|
||||||
+ "\00" + info.getMaxPlayers()
|
+ "\00" + listener.getMaxPlayers()
|
||||||
: info.getMotd() + ChatColor.COLOR_CHAR + ProxyServer.getInstance().getPlayers().size() + ChatColor.COLOR_CHAR + info.getMaxPlayers();
|
: listener.getMotd() + ChatColor.COLOR_CHAR + ProxyServer.getInstance().getPlayers().size() + ChatColor.COLOR_CHAR + listener.getMaxPlayers();
|
||||||
throw new KickException(ping);
|
throw new KickException(ping);
|
||||||
default:
|
default:
|
||||||
if (id == 0xFA)
|
if (id == 0xFA)
|
||||||
|
@ -87,7 +87,7 @@ public class ServerConnection extends GenericConnection implements Server
|
|||||||
throw ex;
|
throw ex;
|
||||||
} catch (Exception ex)
|
} catch (Exception ex)
|
||||||
{
|
{
|
||||||
InetSocketAddress def = BungeeCord.getInstance().config.getServers().get(user.info.getDefaultServer()).getAddress();
|
InetSocketAddress def = BungeeCord.getInstance().config.getServers().get(user.getPendingConnection().getListener().getDefaultServer()).getAddress();
|
||||||
if (retry && !address.equals(def))
|
if (retry && !address.equals(def))
|
||||||
{
|
{
|
||||||
return connect(user, name, def, handshake, false);
|
return connect(user, name, def, handshake, false);
|
||||||
|
@ -20,6 +20,7 @@ import lombok.Synchronized;
|
|||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.config.ListenerInfo;
|
import net.md_5.bungee.api.config.ListenerInfo;
|
||||||
import net.md_5.bungee.api.config.ServerInfo;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
import net.md_5.bungee.api.connection.PendingConnection;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
import net.md_5.bungee.api.event.ChatEvent;
|
import net.md_5.bungee.api.event.ChatEvent;
|
||||||
import net.md_5.bungee.api.event.PluginMessageEvent;
|
import net.md_5.bungee.api.event.PluginMessageEvent;
|
||||||
@ -32,7 +33,8 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
|
|||||||
public final Packet2Handshake handshake;
|
public final Packet2Handshake handshake;
|
||||||
public Queue<DefinedPacket> packetQueue = new ConcurrentLinkedQueue<>();
|
public Queue<DefinedPacket> packetQueue = new ConcurrentLinkedQueue<>();
|
||||||
public List<byte[]> loginPackets = new ArrayList<>();
|
public List<byte[]> loginPackets = new ArrayList<>();
|
||||||
final ListenerInfo info;
|
@Getter
|
||||||
|
private final PendingConnection pendingConnection;
|
||||||
@Getter
|
@Getter
|
||||||
private ServerConnection server;
|
private ServerConnection server;
|
||||||
private UpstreamBridge upBridge;
|
private UpstreamBridge upBridge;
|
||||||
@ -51,11 +53,11 @@ final ListenerInfo info;
|
|||||||
private final Map<String, Boolean> permissions = new HashMap<>();
|
private final Map<String, Boolean> permissions = new HashMap<>();
|
||||||
private final Object permMutex = new Object();
|
private final Object permMutex = new Object();
|
||||||
|
|
||||||
public UserConnection(Socket socket, ListenerInfo info, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List<byte[]> loginPackets)
|
public UserConnection(Socket socket, PendingConnection pendingConnection, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List<byte[]> loginPackets)
|
||||||
{
|
{
|
||||||
super(socket, in, out);
|
super(socket, in, out);
|
||||||
this.info = info;
|
|
||||||
this.handshake = handshake;
|
this.handshake = handshake;
|
||||||
|
this.pendingConnection = pendingConnection;
|
||||||
name = handshake.username;
|
name = handshake.username;
|
||||||
displayName = handshake.username;
|
displayName = handshake.username;
|
||||||
this.loginPackets = loginPackets;
|
this.loginPackets = loginPackets;
|
||||||
|
@ -0,0 +1,81 @@
|
|||||||
|
package net.md_5.bungee;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.ReconnectHandler;
|
||||||
|
import net.md_5.bungee.api.config.ListenerInfo;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import org.yaml.snakeyaml.Yaml;
|
||||||
|
|
||||||
|
public class YamlReconnectHandler implements ReconnectHandler
|
||||||
|
{
|
||||||
|
|
||||||
|
private final Yaml yaml = new Yaml();
|
||||||
|
private final File file = new File("locations.yml");
|
||||||
|
/*========================================================================*/
|
||||||
|
private Map<String, String> data;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public YamlReconnectHandler()
|
||||||
|
{
|
||||||
|
try (FileReader rd = new FileReader(file))
|
||||||
|
{
|
||||||
|
data = yaml.loadAs(rd, Map.class);
|
||||||
|
} catch (IOException ex)
|
||||||
|
{
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not load reconnect locations", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data == null)
|
||||||
|
{
|
||||||
|
data = new ConcurrentHashMap<>();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
data = new ConcurrentHashMap<>(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getServer(ProxiedPlayer player)
|
||||||
|
{
|
||||||
|
ListenerInfo listener = player.getPendingConnection().getListener();
|
||||||
|
if (listener.isForceDefault())
|
||||||
|
{
|
||||||
|
return listener.getDefaultServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
String server = data.get(key(player));
|
||||||
|
return (server != null) ? server : listener.getDefaultServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setServer(ProxiedPlayer player)
|
||||||
|
{
|
||||||
|
data.put(key(player), player.getServer().getInfo().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String key(ProxiedPlayer player)
|
||||||
|
{
|
||||||
|
InetSocketAddress host = player.getPendingConnection().getVirtualHost();
|
||||||
|
return player.getName() + ";" + host.getHostString() + ":" + host.getPort();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save()
|
||||||
|
{
|
||||||
|
try (FileWriter wr = new FileWriter(file))
|
||||||
|
{
|
||||||
|
yaml.dump(data, wr);
|
||||||
|
} catch (IOException ex)
|
||||||
|
{
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not save reconnect locations", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user