2017-08-27 20:37:25 +02:00
|
|
|
package net.ME1312.SubServers.Bungee.Host;
|
|
|
|
|
2020-11-14 08:07:25 +01:00
|
|
|
import net.ME1312.Galaxi.Library.Container.ContainedPair;
|
2020-11-16 21:34:59 +01:00
|
|
|
import net.ME1312.Galaxi.Library.Map.ObjectMap;
|
|
|
|
import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
|
|
|
|
import net.ME1312.Galaxi.Library.Util;
|
2019-04-18 16:02:09 +02:00
|
|
|
import net.ME1312.SubData.Server.DataClient;
|
|
|
|
import net.ME1312.SubData.Server.SubDataClient;
|
2017-08-27 20:37:25 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Event.SubEditServerEvent;
|
2018-10-14 09:26:23 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Event.SubNetworkConnectEvent;
|
|
|
|
import net.ME1312.SubServers.Bungee.Event.SubNetworkDisconnectEvent;
|
2017-08-27 20:37:25 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
|
2019-04-18 16:02:09 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutExRunEvent;
|
2019-01-10 21:52:38 +01:00
|
|
|
import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutExUpdateWhitelist;
|
2017-08-27 20:37:25 +02:00
|
|
|
import net.ME1312.SubServers.Bungee.SubAPI;
|
2020-11-16 21:34:59 +01:00
|
|
|
|
2017-08-27 20:37:25 +02:00
|
|
|
import net.md_5.bungee.BungeeServerInfo;
|
2019-01-10 21:52:38 +01:00
|
|
|
import net.md_5.bungee.api.CommandSender;
|
2017-08-27 20:37:25 +02:00
|
|
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
|
|
|
|
|
|
import java.net.InetSocketAddress;
|
2020-06-12 07:45:49 +02:00
|
|
|
import java.net.SocketAddress;
|
2017-12-10 15:14:49 +01:00
|
|
|
import java.util.*;
|
2017-08-27 20:37:25 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Server Class
|
|
|
|
*/
|
2020-06-12 07:45:49 +02:00
|
|
|
public class ServerImpl extends BungeeServerInfo implements Server {
|
2019-05-10 04:43:34 +02:00
|
|
|
private HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
|
2019-04-18 16:02:09 +02:00
|
|
|
private ObjectMap<String> extra = new ObjectMap<String>();
|
2017-08-27 20:37:25 +02:00
|
|
|
private String nick = null;
|
2019-01-10 21:52:38 +01:00
|
|
|
private List<String> groups = new ArrayList<String>();
|
|
|
|
private List<UUID> whitelist = new ArrayList<UUID>();
|
2017-08-27 20:37:25 +02:00
|
|
|
private boolean hidden;
|
2020-06-12 07:45:49 +02:00
|
|
|
private final String signature = SubAPI.getInstance().signAnonymousObject();
|
2017-08-27 20:37:25 +02:00
|
|
|
|
2020-06-12 07:45:49 +02:00
|
|
|
/**
|
|
|
|
* Construct a new Server data type
|
|
|
|
*
|
|
|
|
* @param name Server name
|
|
|
|
* @param address Server Address
|
|
|
|
* @param motd Server MOTD
|
|
|
|
* @param hidden Hidden Status
|
|
|
|
* @param restricted Restricted Status
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public static ServerImpl construct(String name, SocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException {
|
|
|
|
try {
|
|
|
|
return new ServerImpl(name, address, motd, hidden, restricted);
|
|
|
|
} catch (NoSuchMethodError e) {
|
|
|
|
return new ServerImpl(name, (InetSocketAddress) address, motd, hidden, restricted);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Super Method 2 (newest)
|
|
|
|
* @see #construct(String, SocketAddress, String, boolean, boolean) for method details
|
|
|
|
*/
|
|
|
|
protected ServerImpl(String name, SocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException {
|
2018-01-13 22:22:13 +01:00
|
|
|
super(name, address, motd, restricted);
|
2020-06-12 07:45:49 +02:00
|
|
|
init(name, address, motd, hidden, restricted);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Super Method 1 (oldest)
|
|
|
|
* @see #construct(String, SocketAddress, String, boolean, boolean) for method details
|
|
|
|
*/
|
|
|
|
protected ServerImpl(String name, InetSocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException {
|
|
|
|
super(name, address, motd, restricted);
|
|
|
|
init(name, address, motd, hidden, restricted);
|
|
|
|
}
|
|
|
|
|
|
|
|
@SuppressWarnings("deprecation")
|
|
|
|
private void init(String name, SocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException {
|
2017-08-27 20:37:25 +02:00
|
|
|
if (Util.isNull(name, address, motd, hidden, restricted)) throw new NullPointerException();
|
|
|
|
if (name.contains(" ")) throw new InvalidServerException("Server names cannot have spaces: " + name);
|
2019-08-30 21:44:54 +02:00
|
|
|
SubAPI.getInstance().getInternals().subprotocol.whitelist(getAddress().getAddress().getHostAddress());
|
2017-08-27 20:37:25 +02:00
|
|
|
this.hidden = hidden;
|
2019-05-10 04:43:34 +02:00
|
|
|
|
2019-05-14 04:02:38 +02:00
|
|
|
subdata.put(0, null);
|
2017-08-27 20:37:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-05-10 04:43:34 +02:00
|
|
|
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]);
|
2017-08-27 20:37:25 +02:00
|
|
|
}
|
|
|
|
|
2019-05-10 04:43:34 +02:00
|
|
|
public void setSubData(DataClient client, int channel) {
|
2019-05-10 06:04:10 +02:00
|
|
|
boolean update = false;
|
2019-05-10 04:43:34 +02:00
|
|
|
if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
|
2019-05-10 06:04:10 +02:00
|
|
|
if (client != null || channel == 0) {
|
|
|
|
if (!subdata.keySet().contains(channel) || (channel == 0 && (client == null || subdata.get(channel) == null))) {
|
|
|
|
update = true;
|
2019-05-10 04:43:34 +02:00
|
|
|
subdata.put(channel, (SubDataClient) client);
|
|
|
|
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
|
|
|
|
}
|
2019-05-10 06:04:10 +02:00
|
|
|
} else {
|
|
|
|
update = true;
|
|
|
|
subdata.remove(channel);
|
|
|
|
}
|
2019-05-10 04:43:34 +02:00
|
|
|
|
2019-05-10 06:04:10 +02:00
|
|
|
if (update) for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) {
|
|
|
|
ObjectMap<String> args = new ObjectMap<String>();
|
|
|
|
args.set("server", getName());
|
|
|
|
args.set("channel", channel);
|
2019-05-14 04:02:38 +02:00
|
|
|
if (client != null) args.set("id", client.getID());
|
2019-05-10 06:04:10 +02:00
|
|
|
((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExRunEvent((client != null)?SubNetworkConnectEvent.class:SubNetworkDisconnectEvent.class, args));
|
2018-10-14 09:26:23 +02:00
|
|
|
}
|
2019-05-10 04:43:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void removeSubData(DataClient client) {
|
|
|
|
for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
|
2017-08-27 20:37:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getDisplayName() {
|
|
|
|
return (nick == null)?getName():nick;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-08-30 03:55:59 +02:00
|
|
|
@SuppressWarnings("deprecation")
|
2017-08-27 20:37:25 +02:00
|
|
|
public void setDisplayName(String value) {
|
|
|
|
if (value == null || value.length() == 0 || getName().equals(value)) {
|
2020-11-14 08:07:25 +01:00
|
|
|
SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new ContainedPair<String, Object>("display", getName()), false));
|
2017-08-27 20:37:25 +02:00
|
|
|
this.nick = null;
|
|
|
|
} else {
|
2020-11-14 08:07:25 +01:00
|
|
|
SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new ContainedPair<String, Object>("display", value), false));
|
2017-08-27 20:37:25 +02:00
|
|
|
this.nick = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public List<String> getGroups() {
|
|
|
|
return groups;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@SuppressWarnings("deprecation")
|
|
|
|
public void addGroup(String value) {
|
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
|
|
|
if (value.length() > 0 && !groups.contains(value)) {
|
|
|
|
groups.add(value);
|
|
|
|
Collections.sort(groups);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@SuppressWarnings("deprecation")
|
|
|
|
public void removeGroup(String value) {
|
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
|
|
|
groups.remove(value);
|
|
|
|
Collections.sort(groups);
|
|
|
|
}
|
|
|
|
|
2017-12-10 15:14:49 +01:00
|
|
|
@Override
|
2020-11-14 19:12:08 +01:00
|
|
|
public Collection<RemotePlayer> getRemotePlayers() {
|
|
|
|
return SubAPI.getInstance().getRemotePlayers(this).values();
|
2017-12-10 15:14:49 +01:00
|
|
|
}
|
|
|
|
|
2017-08-27 20:37:25 +02:00
|
|
|
@Override
|
|
|
|
public boolean isHidden() {
|
|
|
|
return hidden;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-08-30 03:55:59 +02:00
|
|
|
@SuppressWarnings("deprecation")
|
2017-08-27 20:37:25 +02:00
|
|
|
public void setHidden(boolean value) {
|
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2020-11-14 08:07:25 +01:00
|
|
|
SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new ContainedPair<String, Object>("hidden", value), false));
|
2017-08-27 20:37:25 +02:00
|
|
|
this.hidden = value;
|
|
|
|
}
|
|
|
|
|
2018-08-30 03:55:59 +02:00
|
|
|
@SuppressWarnings("deprecation")
|
2017-08-27 20:37:25 +02:00
|
|
|
public void setMotd(String value) {
|
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2020-11-14 08:07:25 +01:00
|
|
|
SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new ContainedPair<String, Object>("motd", value), false));
|
2018-01-12 22:56:22 +01:00
|
|
|
try {
|
2019-01-15 00:28:18 +01:00
|
|
|
Util.reflect(BungeeServerInfo.class.getDeclaredField("motd"), this, value);
|
2018-01-12 22:56:22 +01:00
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2017-08-27 20:37:25 +02:00
|
|
|
}
|
|
|
|
|
2018-08-30 03:55:59 +02:00
|
|
|
@SuppressWarnings("deprecation")
|
2017-08-27 20:37:25 +02:00
|
|
|
public void setRestricted(boolean value) {
|
|
|
|
if (Util.isNull(value)) throw new NullPointerException();
|
2020-11-14 08:07:25 +01:00
|
|
|
SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new ContainedPair<String, Object>("restricted", value), false));
|
2018-01-12 22:56:22 +01:00
|
|
|
try {
|
2019-01-15 00:28:18 +01:00
|
|
|
Util.reflect(BungeeServerInfo.class.getDeclaredField("restricted"), this, value);
|
2018-01-12 22:56:22 +01:00
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2017-08-27 20:37:25 +02:00
|
|
|
}
|
|
|
|
|
2019-01-10 21:52:38 +01:00
|
|
|
/**
|
|
|
|
* See if a player can access this server
|
|
|
|
*
|
|
|
|
* @param player Player
|
|
|
|
* @return Whitelisted Status
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public boolean canAccess(CommandSender player) {
|
|
|
|
return (player instanceof ProxiedPlayer && whitelist.contains(((ProxiedPlayer) player).getUniqueId())) || super.canAccess(player);
|
|
|
|
}
|
|
|
|
|
2020-11-16 21:34:59 +01:00
|
|
|
@Override
|
|
|
|
public Collection<UUID> getWhitelist() {
|
|
|
|
return new ArrayList<UUID>(whitelist);
|
|
|
|
}
|
|
|
|
|
2019-01-10 21:52:38 +01:00
|
|
|
@Override
|
|
|
|
public boolean isWhitelisted(UUID player) {
|
|
|
|
return whitelist.contains(player);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void whitelist(UUID player) {
|
|
|
|
if (Util.isNull(player)) throw new NullPointerException();
|
2019-06-17 05:13:48 +02:00
|
|
|
if (!whitelist.contains(player)) whitelist.add(player);
|
2019-05-10 04:43:34 +02:00
|
|
|
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExUpdateWhitelist(getName(), true, player));
|
2019-01-10 21:52:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void unwhitelist(UUID player) {
|
|
|
|
if (Util.isNull(player)) throw new NullPointerException();
|
|
|
|
whitelist.remove(player);
|
2019-05-10 04:43:34 +02:00
|
|
|
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExUpdateWhitelist(getName(), false, player));
|
2019-01-10 21:52:38 +01:00
|
|
|
}
|
|
|
|
|
2017-12-10 01:30:06 +01:00
|
|
|
@Override
|
|
|
|
public final String getSignature() {
|
|
|
|
return signature;
|
|
|
|
}
|
|
|
|
|
2017-08-27 20:37:25 +02:00
|
|
|
@Override
|
|
|
|
public void addExtra(String handle, Object value) {
|
|
|
|
if (Util.isNull(handle, value)) throw new NullPointerException();
|
|
|
|
extra.set(handle, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean hasExtra(String handle) {
|
|
|
|
if (Util.isNull(handle)) throw new NullPointerException();
|
|
|
|
return extra.getKeys().contains(handle);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-04-18 16:02:09 +02:00
|
|
|
public ObjectMapValue getExtra(String handle) {
|
2017-08-27 20:37:25 +02:00
|
|
|
if (Util.isNull(handle)) throw new NullPointerException();
|
|
|
|
return extra.get(handle);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-04-18 16:02:09 +02:00
|
|
|
public ObjectMap<String> getExtra() {
|
2017-08-27 20:37:25 +02:00
|
|
|
return extra.clone();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void removeExtra(String handle) {
|
|
|
|
if (Util.isNull(handle)) throw new NullPointerException();
|
|
|
|
extra.remove(handle);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-04-18 16:02:09 +02:00
|
|
|
public ObjectMap<String> forSubData() {
|
|
|
|
ObjectMap<String> info = new ObjectMap<String>();
|
2018-04-15 03:53:51 +02:00
|
|
|
info.set("type", "Server");
|
|
|
|
info.set("name", getName());
|
|
|
|
info.set("display", getDisplayName());
|
|
|
|
info.set("group", getGroups());
|
|
|
|
info.set("address", getAddress().getAddress().getHostAddress() + ':' + getAddress().getPort());
|
|
|
|
info.set("motd", getMotd());
|
2019-06-17 05:13:48 +02:00
|
|
|
info.set("whitelist", getWhitelist());
|
2018-04-15 03:53:51 +02:00
|
|
|
info.set("restricted", isRestricted());
|
|
|
|
info.set("hidden", isHidden());
|
2019-04-18 16:02:09 +02:00
|
|
|
ObjectMap<String> players = new ObjectMap<String>();
|
2020-11-14 19:12:08 +01:00
|
|
|
for (RemotePlayer player : getRemotePlayers())
|
2020-06-12 07:45:49 +02:00
|
|
|
players.set(player.getUniqueId().toString(), player.getName());
|
2018-04-15 03:53:51 +02:00
|
|
|
info.set("players", players);
|
2019-05-14 04:02:38 +02:00
|
|
|
ObjectMap<Integer> subdata = new ObjectMap<Integer>();
|
|
|
|
for (int channel : this.subdata.keySet()) subdata.set(channel, (this.subdata.get(channel) == null)?null:this.subdata.get(channel).getID());
|
2019-05-10 04:43:34 +02:00
|
|
|
info.set("subdata", subdata);
|
2018-04-15 03:53:51 +02:00
|
|
|
info.set("signature", signature);
|
2018-07-01 05:46:58 +02:00
|
|
|
info.set("extra", getExtra());
|
2019-04-18 16:02:09 +02:00
|
|
|
return info;
|
2017-08-27 20:37:25 +02:00
|
|
|
}
|
|
|
|
}
|