Skip to content

Commit

Permalink
Implement Multi-Channel SubData
Browse files Browse the repository at this point in the history
  • Loading branch information
ME1312 committed May 10, 2019
1 parent 1952e7b commit 504dc7b
Show file tree
Hide file tree
Showing 28 changed files with 333 additions and 159 deletions.
4 changes: 2 additions & 2 deletions SubServers.Bungee/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@
<dependency>
<groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiUtil</artifactId>
<version>19w16a</version>
<version>19w19b</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ME1312.SubData</groupId>
<artifactId>Server</artifactId>
<version>19w18a</version>
<version>19w19c</version>
<scope>compile</scope>
</dependency>
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package net.ME1312.SubServers.Bungee.Host.External;

import com.google.common.collect.Range;
import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubData.Server.SerializableClientHandler;
import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
Expand All @@ -11,7 +11,6 @@
import net.ME1312.SubServers.Bungee.Host.SubServer;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExAddServer;
Expand All @@ -26,14 +25,15 @@
/**
* External Host Class
*/
public class ExternalHost extends Host implements SerializableClientHandler {
public class ExternalHost extends Host implements ClientHandler {
private HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
private HashMap<String, SubServer> servers = new HashMap<String, SubServer>();
private String name;
protected boolean available;
private boolean enabled;
private InetAddress address;
private SubCreator creator;
private String directory;
protected NamedContainer<Boolean, SubDataClient> client;
private LinkedList<PacketObjectOut> queue;
private boolean clean;
protected SubPlugin plugin;
Expand All @@ -54,51 +54,69 @@ public ExternalHost(SubPlugin plugin, String name, boolean enabled, Range<Intege
super(plugin, name, enabled, ports, log, address, directory, gitBash);
this.plugin = plugin;
this.name = name;
this.available = false;
this.enabled = enabled;
this.address = address;
this.client = new NamedContainer<Boolean, SubDataClient>(false, null);
this.creator = new ExternalSubCreator(this, ports, log, gitBash);
this.directory = directory;
this.queue = new LinkedList<PacketObjectOut>();
this.clean = false;

setSubData(null, 0);
}

@Override
public DataClient getSubData() {
return client.get();
public DataClient[] getSubData() {
LinkedList<Integer> keys = new LinkedList<Integer>(subdata.keySet());
LinkedList<SubDataClient> channels = new LinkedList<SubDataClient>();
Collections.sort(keys);
for (Integer channel : keys) channels.add(subdata.get(channel));
return channels.toArray(new DataClient[0]);
}

public void setSubData(DataClient client, int channel) {
if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
if (client != null || channel == 0) {
subdata.put(channel, (SubDataClient) client);
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
} else {
subdata.remove(channel);
}
}
}

@Override
public void setSubData(DataClient client) {
this.client = new NamedContainer<Boolean, SubDataClient>(false, (SubDataClient) client);
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
public void removeSubData(DataClient client) {
for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
}

protected void queue(PacketObjectOut... packet) {
for (PacketObjectOut p : packet) if (client.get() == null || client.name() == false) {
for (PacketObjectOut p : packet) if (getSubData()[0] == null || !available) {
queue.add(p);
} else {
client.get().sendPacket(p);
((SubDataClient) getSubData()[0]).sendPacket(p);
}
}
private void requeue() {
SubDataClient client = (SubDataClient) getSubData()[0];
if (!clean) {
client.get().sendPacket(new PacketOutExReset("Prevent Desync"));
client.sendPacket(new PacketOutExReset("Prevent Desync"));
clean = true;
}
for (SubServer server : servers.values()) {
client.get().sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.getAddress().getPort(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
client.sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.getAddress().getPort(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
}
while (queue.size() != 0) {
client.get().sendPacket(queue.get(0));
client.sendPacket(queue.get(0));
queue.remove(0);
}
client.rename(true);
available = true;
}

@Override
public boolean isAvailable() {
return this.client.name();
return available;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public void reload() {
e.printStackTrace();
}
}
if (host.client.name()) host.queue(new PacketExConfigureHost(host.plugin, host));
if (host.available) host.queue(new PacketExConfigureHost(host.plugin, host));
}

@Override
Expand Down Expand Up @@ -195,7 +195,7 @@ public void terminate() {
@Override
public void terminate(String name) {
if (this.thread.keySet().contains(name.toLowerCase())) {
((SubDataClient) host.getSubData()).sendPacket(new PacketExCreateServer(name.toLowerCase()));
((SubDataClient) host.getSubData()[0]).sendPacket(new PacketExCreateServer(name.toLowerCase()));
thread.remove(name.toLowerCase());
}
}
Expand All @@ -211,7 +211,7 @@ public void waitFor() throws InterruptedException {

@Override
public void waitFor(String name) throws InterruptedException {
while (this.thread.keySet().contains(name.toLowerCase()) && host.client.get() != null) {
while (this.thread.keySet().contains(name.toLowerCase()) && host.getSubData()[0] != null) {
Thread.sleep(250);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ private int edit(UUID player, ObjectMap<String> edit, boolean perma) {

@Override
public void waitFor() throws InterruptedException {
while (running && host.client.get() != null) {
while (running && host.getSubData()[0] != null) {
Thread.sleep(250);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.google.common.collect.Range;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.Galaxi.Library.ExtraDataHandler;
Expand All @@ -12,6 +13,7 @@
import net.ME1312.SubServers.Bungee.SubPlugin;

import java.net.InetAddress;
import java.util.LinkedList;
import java.util.Map;
import java.util.UUID;

Expand Down Expand Up @@ -448,7 +450,11 @@ public ObjectMap<String> forSubData() {
servers.set(server.getName(), server.forSubData());
}
hinfo.set("servers", servers);
if (this instanceof ClientHandler && ((ClientHandler) this).getSubData() != null) hinfo.set("subdata", ((ClientHandler) this).getSubData().getID());
if (this instanceof ClientHandler) {
LinkedList<UUID> subdata = new LinkedList<UUID>();
for (DataClient client : ((ClientHandler) this).getSubData()) subdata.add((client == null)?null:client.getID());
hinfo.set("subdata", subdata);
}
hinfo.set("signature", signature);
hinfo.set("extra", getExtra());
return hinfo;
Expand Down
46 changes: 33 additions & 13 deletions SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package net.ME1312.SubServers.Bungee.Host;

import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubData.Server.SerializableClientHandler;
import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Event.SubRemoveProxyEvent;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
Expand All @@ -19,11 +18,11 @@
/**
* Proxy Class
*/
public class Proxy implements SerializableClientHandler, ExtraDataHandler {
public class Proxy implements ClientHandler, ExtraDataHandler {
private HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
private ObjectMap<String> extra = new ObjectMap<String>();
private final String signature;
private boolean persistent = true;
private SubDataClient client = null;
private String nick = null;
private final String name;

Expand All @@ -36,22 +35,41 @@ public Proxy(String name) throws IllegalArgumentException {
if (name.contains(" ")) throw new IllegalArgumentException("Proxy names cannot have spaces: " + name);
this.name = name;
this.signature = SubAPI.getInstance().signAnonymousObject();

setSubData(null, 0);
}

@Override
public DataClient getSubData() {
return client;
public DataClient[] getSubData() {
LinkedList<Integer> keys = new LinkedList<Integer>(subdata.keySet());
LinkedList<SubDataClient> channels = new LinkedList<SubDataClient>();
Collections.sort(keys);
for (Integer channel : keys) channels.add(subdata.get(channel));
return channels.toArray(new DataClient[0]);
}

@Override
@SuppressWarnings("deprecation")
public void setSubData(DataClient client) {
this.client = (SubDataClient) client;
if (client == null && !persistent) {
ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this));
SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
public void setSubData(DataClient client, int channel) {
if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
if (client != null || channel == 0) {
subdata.put(channel, (SubDataClient) client);
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
} else {
subdata.remove(channel);
}

DataClient[] subdata = getSubData();
if (subdata[0] == null && subdata.length <= 1 && !persistent) {
ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this));
SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
}
}
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
}

@Override
public void removeSubData(DataClient client) {
for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
}

/**
Expand Down Expand Up @@ -166,7 +184,9 @@ public ObjectMap<String> forSubData() {
}
info.set("players", players);
info.set("redis", isRedis());
if (getSubData() != null) info.set("subdata", getSubData().getID());
LinkedList<UUID> subdata = new LinkedList<UUID>();
for (DataClient client : getSubData()) subdata.add((client == null)?null:client.getID());
info.set("subdata", subdata);
info.set("signature", signature);
info.set("extra", getExtra());
return info;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import net.ME1312.Galaxi.Library.ExtraDataHandler;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubData.Server.SerializableClientHandler;
import net.ME1312.SubData.Server.DataClient;
import net.md_5.bungee.api.config.ServerInfo;

import java.util.Collection;
Expand All @@ -13,7 +13,15 @@
/**
* Server Interface
*/
public interface Server extends ServerInfo, SerializableClientHandler, ExtraDataHandler {
public interface Server extends ServerInfo, ClientHandler, ExtraDataHandler {

/**
* Link a SubData Client to this Object
*
* @param client Client to Link
* @param channel Channel ID
*/
void setSubData(DataClient client, int channel);

/**
* Get the Display Name of this Server
Expand Down
Loading

0 comments on commit 504dc7b

Please sign in to comment.