2017-08-22 15:02:23 +02:00
package net.ME1312.SubServers.Sync ;
2020-11-16 21:34:59 +01:00
import net.ME1312.Galaxi.Library.Config.YAMLConfig ;
2020-11-14 08:07:25 +01:00
import net.ME1312.Galaxi.Library.Container.Container ;
2020-11-16 21:34:59 +01:00
import net.ME1312.Galaxi.Library.Container.Pair ;
import net.ME1312.Galaxi.Library.Map.ObjectMap ;
import net.ME1312.Galaxi.Library.UniversalFile ;
import net.ME1312.Galaxi.Library.Util ;
import net.ME1312.Galaxi.Library.Version.Version ;
2019-08-31 19:26:37 +02:00
import net.ME1312.SubData.Client.DataClient ;
2019-05-14 04:02:38 +02:00
import net.ME1312.SubData.Client.Encryption.AES ;
2020-06-12 07:45:49 +02:00
import net.ME1312.SubData.Client.Encryption.DHE ;
2019-05-14 04:02:38 +02:00
import net.ME1312.SubData.Client.Encryption.RSA ;
2019-08-31 19:26:37 +02:00
import net.ME1312.SubData.Client.Library.DisconnectReason ;
2020-11-16 21:34:59 +01:00
import net.ME1312.SubData.Client.SubDataClient ;
2020-11-14 04:41:56 +01:00
import net.ME1312.SubServers.Bungee.BungeeCommon ;
import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger ;
2020-12-05 05:30:36 +01:00
import net.ME1312.SubServers.Bungee.Library.Fallback.FallbackState ;
2020-11-14 04:41:56 +01:00
import net.ME1312.SubServers.Bungee.Library.Fallback.SmartFallback ;
2021-06-14 03:31:59 +02:00
import net.ME1312.SubServers.Client.Common.Network.Packet.PacketDisconnectPlayer ;
2017-08-22 15:02:23 +02:00
import net.ME1312.SubServers.Sync.Event.* ;
2020-06-12 07:45:49 +02:00
import net.ME1312.SubServers.Sync.Library.ConfigUpdater ;
2020-11-16 21:34:59 +01:00
import net.ME1312.SubServers.Sync.Library.Metrics ;
2020-07-25 07:20:59 +02:00
import net.ME1312.SubServers.Sync.Network.Packet.PacketExSyncPlayer ;
2019-05-14 04:02:38 +02:00
import net.ME1312.SubServers.Sync.Network.SubProtocol ;
2020-11-16 21:34:59 +01:00
import net.ME1312.SubServers.Sync.Server.CachedPlayer ;
2019-08-30 02:01:52 +02:00
import net.ME1312.SubServers.Sync.Server.ServerImpl ;
import net.ME1312.SubServers.Sync.Server.SubServerImpl ;
2020-11-16 21:34:59 +01:00
import com.dosse.upnp.UPnP ;
import com.google.gson.Gson ;
2020-07-04 02:23:27 +02:00
import net.md_5.bungee.BungeeServerInfo ;
2019-04-29 17:05:06 +02:00
import net.md_5.bungee.UserConnection ;
2019-05-14 04:02:38 +02:00
import net.md_5.bungee.api.ChatColor ;
2021-02-15 06:28:06 +01:00
import net.md_5.bungee.api.ProxyServer ;
2019-02-27 20:05:05 +01:00
import net.md_5.bungee.api.ServerPing ;
2019-04-29 17:05:06 +02:00
import net.md_5.bungee.api.chat.BaseComponent ;
2019-02-27 20:05:05 +01:00
import net.md_5.bungee.api.chat.TextComponent ;
2018-10-08 01:25:08 +02:00
import net.md_5.bungee.api.config.ListenerInfo ;
2017-08-22 15:02:23 +02:00
import net.md_5.bungee.api.config.ServerInfo ;
2020-08-22 00:33:09 +02:00
import net.md_5.bungee.api.connection.ProxiedPlayer ;
2019-04-29 17:05:06 +02:00
import net.md_5.bungee.api.event.* ;
2017-08-22 15:02:23 +02:00
import net.md_5.bungee.api.plugin.Listener ;
2021-02-15 06:28:06 +01:00
import net.md_5.bungee.api.plugin.Plugin ;
import net.md_5.bungee.api.plugin.PluginDescription ;
2020-07-04 02:23:27 +02:00
import net.md_5.bungee.connection.InitialHandler ;
2017-08-22 15:02:23 +02:00
import net.md_5.bungee.event.EventHandler ;
2021-03-13 17:51:32 +01:00
import net.md_5.bungee.util.CaseInsensitiveMap ;
2017-08-22 15:02:23 +02:00
import java.io.* ;
import java.net.InetAddress ;
import java.net.URL ;
import java.nio.charset.Charset ;
import java.util.* ;
import java.util.concurrent.TimeUnit ;
/ * *
* Main Plugin Class
* /
2020-11-14 04:41:56 +01:00
public final class ExProxy extends BungeeCommon implements Listener {
2019-05-17 00:36:41 +02:00
HashMap < Integer , SubDataClient > subdata = new HashMap < Integer , SubDataClient > ( ) ;
2020-11-14 08:07:25 +01:00
Pair < Long , Map < String , Map < String , String > > > lang = null ;
2019-08-30 02:01:52 +02:00
public final Map < String , ServerImpl > servers = new TreeMap < String , ServerImpl > ( ) ;
2020-07-25 07:20:59 +02:00
public final HashMap < UUID , ServerImpl > rPlayerLinkS = new HashMap < UUID , ServerImpl > ( ) ;
public final HashMap < UUID , String > rPlayerLinkP = new HashMap < UUID , String > ( ) ;
2020-11-14 06:29:29 +01:00
public final HashMap < UUID , CachedPlayer > rPlayers = new HashMap < UUID , CachedPlayer > ( ) ;
2020-12-05 05:30:36 +01:00
private final HashMap < UUID , FallbackState > fallback = new HashMap < UUID , FallbackState > ( ) ;
2017-08-22 15:02:23 +02:00
public final PrintStream out ;
public final UniversalFile dir = new UniversalFile ( new File ( System . getProperty ( " user.dir " ) ) ) ;
public YAMLConfig config ;
2020-11-11 08:35:02 +01:00
public final Plugin plugin ;
2017-12-10 01:30:06 +01:00
public final SubAPI api = new SubAPI ( this ) ;
2019-05-14 04:02:38 +02:00
public SubProtocol subprotocol ;
2021-06-25 05:06:53 +02:00
public static final Version version = Version . fromString ( " 2.17.1a " ) ;
2017-12-10 01:30:06 +01:00
2018-05-24 20:52:47 +02:00
public final boolean isPatched ;
2017-12-10 01:30:06 +01:00
public long lastReload = - 1 ;
2019-08-31 19:26:37 +02:00
private long resetDate = 0 ;
2019-05-14 04:02:38 +02:00
private boolean reconnect = false ;
2017-08-22 15:02:23 +02:00
private boolean posted = false ;
2020-06-12 07:45:49 +02:00
ExProxy ( PrintStream out , boolean isPatched ) throws Exception {
2020-11-14 04:41:56 +01:00
super ( SubAPI : : getInstance ) ;
2018-05-24 20:52:47 +02:00
this . isPatched = isPatched ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Loading SubServers.Sync v " + version . toString ( ) + " Libraries (for Minecraft " + api . getGameVersion ( ) [ api . getGameVersion ( ) . length - 1 ] + " ) " ) ;
2021-06-15 06:09:51 +02:00
Util . isException ( ( ) - > new CachedPlayer ( ( ProxiedPlayer ) null ) ) ; // runs <clinit>
2017-08-22 15:02:23 +02:00
this . out = out ;
if ( ! ( new UniversalFile ( dir , " config.yml " ) . exists ( ) ) ) {
2020-11-14 06:29:29 +01:00
Util . copyFromJar ( ExProxy . class . getClassLoader ( ) , " net/ME1312/SubServers/Bungee/Library/Files/bungee.yml " , new UniversalFile ( dir , " config.yml " ) . getPath ( ) ) ;
2017-08-22 15:02:23 +02:00
YAMLConfig tmp = new YAMLConfig ( new UniversalFile ( " config.yml " ) ) ;
tmp . get ( ) . set ( " stats " , UUID . randomUUID ( ) . toString ( ) ) ;
tmp . save ( ) ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Created ./config.yml " ) ;
2017-08-22 15:02:23 +02:00
}
UniversalFile dir = new UniversalFile ( this . dir , " SubServers " ) ;
dir . mkdir ( ) ;
2019-05-14 04:02:38 +02:00
ConfigUpdater . updateConfig ( new UniversalFile ( dir , " sync.yml " ) ) ;
2017-08-22 15:02:23 +02:00
config = new YAMLConfig ( new UniversalFile ( dir , " sync.yml " ) ) ;
2020-11-14 04:41:56 +01:00
SmartFallback . addInspector ( ( player , server ) - > {
double confidence = 0 ;
if ( server instanceof ServerImpl ) {
if ( ! ( ( ServerImpl ) server ) . isHidden ( ) ) confidence + + ;
if ( ! ( ( ServerImpl ) server ) . isRestricted ( ) ) confidence + + ;
if ( ( ( ServerImpl ) server ) . getSubData ( ) [ 0 ] ! = null ) confidence + + ;
if ( player ! = null ) {
if ( ( ( ServerImpl ) server ) . canAccess ( player ) ) confidence + + ;
}
} if ( server instanceof SubServerImpl ) {
if ( ! ( ( SubServerImpl ) server ) . isRunning ( ) ) return null ;
}
return confidence ;
} ) ;
2020-07-03 23:14:59 +02:00
if ( config . get ( ) . getMap ( " Settings " ) . getMap ( " Smart-Fallback " , new ObjectMap < > ( ) ) . getBoolean ( " Enabled " , true ) )
2020-11-14 04:41:56 +01:00
setReconnectHandler ( new SmartFallback ( config . get ( ) . getMap ( " Settings " ) . getMap ( " Smart-Fallback " , new ObjectMap < > ( ) ) ) ) ;
2020-06-26 01:47:30 +02:00
2019-05-14 04:02:38 +02:00
subprotocol = SubProtocol . get ( ) ;
2020-06-12 07:45:49 +02:00
subprotocol . registerCipher ( " DHE " , DHE . get ( 128 ) ) ;
subprotocol . registerCipher ( " DHE-128 " , DHE . get ( 128 ) ) ;
subprotocol . registerCipher ( " DHE-192 " , DHE . get ( 192 ) ) ;
subprotocol . registerCipher ( " DHE-256 " , DHE . get ( 256 ) ) ;
2020-11-11 08:35:02 +01:00
2021-02-15 06:28:06 +01:00
{
PluginDescription description = new PluginDescription ( ) ;
description . setName ( " SubServers-Sync " ) ;
description . setMain ( net . ME1312 . SubServers . Sync . Library . Compatibility . Plugin . class . getCanonicalName ( ) ) ;
description . setFile ( Util . getDespiteException ( ( ) - > new File ( ExProxy . class . getProtectionDomain ( ) . getCodeSource ( ) . getLocation ( ) . toURI ( ) ) , null ) ) ;
description . setVersion ( version . toString ( ) ) ;
description . setAuthor ( " ME1312 " ) ;
String stage = " access " ;
Plugin plugin = null ;
try {
plugin = new Plugin ( this , description ) {
// SubServers.Sync doesn't deploy code here at this time.
} ;
if ( plugin . getDescription ( ) = = null ) {
stage = " initialize " ;
Util . reflect ( Plugin . class . getDeclaredMethod ( " init " , ProxyServer . class , PluginDescription . class ) , plugin , this , description ) ;
}
} catch ( Throwable e ) {
Logger . get ( " SubServers " ) . warning ( " Could not " + stage + " plugin emulation " ) ;
} finally {
this . plugin = plugin ;
}
}
2020-11-11 08:35:02 +01:00
getPluginManager ( ) . registerListener ( plugin , this ) ;
2017-08-22 15:02:23 +02:00
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Loading BungeeCord Libraries... " ) ;
2017-08-22 15:02:23 +02:00
}
/ * *
* Load Hosts , Servers , SubServers , and SubData Direct
* /
@Override
public void startListeners ( ) {
try {
2020-11-14 04:41:56 +01:00
SmartFallback . dns_forward = config . get ( ) . getMap ( " Settings " ) . getMap ( " Smart-Fallback " , new ObjectMap < > ( ) ) . getBoolean ( " DNS-Forward " , false ) ;
2019-08-31 19:26:37 +02:00
resetDate = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
2019-05-14 04:02:38 +02:00
ConfigUpdater . updateConfig ( new UniversalFile ( dir , " SubServers:sync.yml " ) ) ;
2017-08-22 15:02:23 +02:00
config . reload ( ) ;
2018-01-05 21:37:23 +01:00
2021-10-06 20:11:26 +02:00
synchronized ( rPlayers ) {
for ( ProxiedPlayer local : getPlayers ( ) ) {
CachedPlayer player = new CachedPlayer ( local ) ;
rPlayerLinkP . put ( player . getUniqueId ( ) , player . getProxyName ( ) . toLowerCase ( ) ) ;
rPlayers . put ( player . getUniqueId ( ) , player ) ;
if ( local . getServer ( ) . getInfo ( ) instanceof ServerImpl ) rPlayerLinkS . put ( player . getUniqueId ( ) , ( ServerImpl ) local . getServer ( ) . getInfo ( ) ) ;
}
}
2019-05-14 04:02:38 +02:00
subprotocol . unregisterCipher ( " AES " ) ;
subprotocol . unregisterCipher ( " AES-128 " ) ;
subprotocol . unregisterCipher ( " AES-192 " ) ;
subprotocol . unregisterCipher ( " AES-256 " ) ;
subprotocol . unregisterCipher ( " RSA " ) ;
2020-06-12 07:45:49 +02:00
2019-05-14 04:02:38 +02:00
api . name = config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getString ( " Name " , null ) ;
if ( config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Password " , " " ) . length ( ) > 0 ) {
subprotocol . registerCipher ( " AES " , new AES ( 128 , config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Password " ) ) ) ;
subprotocol . registerCipher ( " AES-128 " , new AES ( 128 , config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Password " ) ) ) ;
subprotocol . registerCipher ( " AES-192 " , new AES ( 192 , config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Password " ) ) ) ;
subprotocol . registerCipher ( " AES-256 " , new AES ( 256 , config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Password " ) ) ) ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubData " ) . info ( " AES Encryption Available " ) ;
2019-05-14 04:02:38 +02:00
}
if ( new UniversalFile ( dir , " SubServers:subdata.rsa.key " ) . exists ( ) ) {
try {
subprotocol . registerCipher ( " RSA " , new RSA ( new UniversalFile ( dir , " SubServers:subdata.rsa.key " ) ) ) ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubData " ) . info ( " RSA Encryption Available " ) ;
2019-05-14 04:02:38 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2018-01-05 21:37:23 +01:00
}
2017-08-22 15:02:23 +02:00
}
2019-05-14 04:02:38 +02:00
reconnect = true ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubData " ) . info ( " " ) ;
2019-08-31 19:26:37 +02:00
Logger . get ( " SubData " ) . info ( " Connecting to / " + config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) ) ;
2021-01-21 20:28:23 +01:00
connect ( Logger . get ( " SubData " ) , null ) ;
2017-08-22 15:02:23 +02:00
2018-10-08 01:25:08 +02:00
if ( UPnP . isUPnPAvailable ( ) ) {
2019-05-14 04:02:38 +02:00
if ( config . get ( ) . getMap ( " Settings " ) . getMap ( " UPnP " , new ObjectMap < String > ( ) ) . getBoolean ( " Forward-Proxy " , true ) ) for ( ListenerInfo listener : getConfig ( ) . getListeners ( ) ) {
2018-10-08 01:25:08 +02:00
UPnP . openPortTCP ( listener . getHost ( ) . getPort ( ) ) ;
}
} else {
2020-11-11 08:35:02 +01:00
getLogger ( ) . warning ( " UPnP is currently unavailable. Ports may not be automatically forwarded on this device. " ) ;
2018-10-08 01:25:08 +02:00
}
2021-10-06 20:11:26 +02:00
super . startListeners ( ) ;
2017-08-22 15:02:23 +02:00
if ( ! posted ) {
posted = true ;
post ( ) ;
}
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
2021-01-21 20:28:23 +01:00
private void connect ( java . util . logging . Logger log , Pair < DisconnectReason , DataClient > disconnect ) throws IOException {
2020-11-11 22:07:22 +01:00
int reconnect = config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getInt ( " Reconnect " , 60 ) ;
2020-11-14 08:07:25 +01:00
if ( disconnect = = null | | ( this . reconnect & & reconnect > 0 & & disconnect . key ( ) ! = DisconnectReason . PROTOCOL_MISMATCH & & disconnect . key ( ) ! = DisconnectReason . ENCRYPTION_MISMATCH ) ) {
2019-08-31 19:26:37 +02:00
long reset = resetDate ;
Timer timer = new Timer ( " SubServers.Sync::SubData_Reconnect_Handler " ) ;
2021-01-21 20:28:23 +01:00
if ( disconnect ! = null ) log . info ( " Attempting reconnect in " + reconnect + " seconds " ) ;
2019-08-31 19:26:37 +02:00
timer . scheduleAtFixedRate ( new TimerTask ( ) {
@Override
public void run ( ) {
try {
2019-10-19 22:38:44 +02:00
if ( reset = = resetDate & & ( subdata . getOrDefault ( 0 , null ) = = null | | subdata . get ( 0 ) . isClosed ( ) ) ) {
2021-04-13 23:32:41 +02:00
SubDataClient open = subprotocol . open ( InetAddress . getByName ( config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 0 ] ) ,
2019-10-19 00:24:58 +02:00
Integer . parseInt ( config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getRawString ( " Address " , " 127.0.0.1:4391 " ) . split ( " : " ) [ 1 ] ) ) ;
if ( subdata . getOrDefault ( 0 , null ) ! = null ) subdata . get ( 0 ) . reconnect ( open ) ;
subdata . put ( 0 , open ) ;
}
2019-08-31 19:26:37 +02:00
timer . cancel ( ) ;
} catch ( IOException e ) {
2020-11-11 08:35:02 +01:00
Logger . get ( " SubData " ) . info ( " Connection was unsuccessful, retrying in " + reconnect + " seconds " ) ;
2019-08-31 19:26:37 +02:00
}
}
} , ( disconnect = = null ) ? 0 : TimeUnit . SECONDS . toMillis ( reconnect ) , TimeUnit . SECONDS . toMillis ( reconnect ) ) ;
}
2019-05-14 04:02:38 +02:00
}
2017-08-22 15:02:23 +02:00
private void post ( ) {
2020-08-19 02:03:59 +02:00
if ( ! config . get ( ) . getMap ( " Settings " ) . getRawStringList ( " Disabled-Overrides " , Collections . emptyList ( ) ) . contains ( " /server " ) )
2021-03-08 18:02:28 +01:00
getPluginManager ( ) . registerCommand ( plugin , new SubCommand . BungeeServer ( this , " server " ) ) ;
2020-08-19 02:03:59 +02:00
if ( ! config . get ( ) . getMap ( " Settings " ) . getRawStringList ( " Disabled-Overrides " , Collections . emptyList ( ) ) . contains ( " /glist " ) )
2020-11-11 08:35:02 +01:00
getPluginManager ( ) . registerCommand ( plugin , new SubCommand . BungeeList ( this , " glist " ) ) ;
2020-08-19 02:03:59 +02:00
2021-03-08 18:02:28 +01:00
getPluginManager ( ) . registerCommand ( plugin , new SubCommand ( this , " subservers " ) ) ;
getPluginManager ( ) . registerCommand ( plugin , new SubCommand ( this , " subserver " ) ) ;
getPluginManager ( ) . registerCommand ( plugin , new SubCommand ( this , " sub " ) ) ;
2017-08-22 15:02:23 +02:00
2020-07-03 23:14:59 +02:00
if ( getReconnectHandler ( ) ! = null & & getReconnectHandler ( ) . getClass ( ) . equals ( SmartFallback . class ) )
2020-11-14 04:41:56 +01:00
setReconnectHandler ( new SmartFallback ( config . get ( ) . getMap ( " Settings " ) . getMap ( " Smart-Fallback " , new ObjectMap < > ( ) ) ) ) ; // Re-initialize Smart Fallback
2020-07-03 23:14:59 +02:00
2021-07-28 08:28:16 +02:00
if ( plugin ! = null ) new Metrics ( plugin , 1461 ) . appendAppData ( ) ;
2019-01-06 07:58:13 +01:00
new Timer ( " SubServers.Sync::Routine_Update_Check " ) . schedule ( new TimerTask ( ) {
2018-07-27 21:36:51 +02:00
@SuppressWarnings ( " unchecked " )
2017-08-22 15:02:23 +02:00
@Override
public void run ( ) {
try {
2019-05-14 04:02:38 +02:00
ObjectMap < String > tags = new ObjectMap < String > ( new Gson ( ) . fromJson ( " { \" tags \" : " + Util . readAll ( new BufferedReader ( new InputStreamReader ( new URL ( " https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags " ) . openStream ( ) , Charset . forName ( " UTF-8 " ) ) ) ) + '}' , Map . class ) ) ;
2018-07-29 20:39:42 +02:00
List < Version > versions = new LinkedList < Version > ( ) ;
2017-08-22 15:02:23 +02:00
Version updversion = version ;
2018-03-14 22:50:15 +01:00
int updcount = 0 ;
2019-05-14 04:02:38 +02:00
for ( ObjectMap < String > tag : tags . getMapList ( " tags " ) ) versions . add ( Version . fromString ( tag . getString ( " ref " ) . substring ( 10 ) ) ) ;
2018-07-29 20:39:42 +02:00
Collections . sort ( versions ) ;
for ( Version version : versions ) {
2018-07-29 05:02:47 +02:00
if ( version . compareTo ( updversion ) > 0 ) {
2018-07-27 21:36:51 +02:00
updversion = version ;
updcount + + ;
2017-08-22 15:02:23 +02:00
}
}
2019-05-17 00:36:41 +02:00
if ( updcount > 0 ) Logger . get ( " SubServers " ) . info ( " SubServers.Sync v " + updversion + " is available. You are " + updcount + " version " + ( ( updcount = = 1 ) ? " " : " s " ) + " behind. " ) ;
2017-08-22 15:02:23 +02:00
} catch ( Exception e ) { }
}
} , 0 , TimeUnit . DAYS . toMillis ( 2 ) ) ;
2020-08-23 02:01:58 +02:00
2020-11-07 17:35:25 +01:00
int rpec_i = config . get ( ) . getMap ( " Settings " ) . getInt ( " RPEC-Check-Interval " , 300 ) ;
int rpec_s = rpec_i - new Random ( ) . nextInt ( ( rpec_i / 3 ) + 1 ) ;
2020-08-23 02:01:58 +02:00
new Timer ( " SubServers.Sync::RemotePlayer_Error_Checking " ) . schedule ( new TimerTask ( ) {
@Override
public void run ( ) {
2021-02-07 05:53:03 +01:00
if ( api . getName ( ) ! = null & & api . getSubDataNetwork ( ) [ 0 ] ! = null & & ! api . getSubDataNetwork ( ) [ 0 ] . isClosed ( ) ) {
2020-08-23 02:01:58 +02:00
api . getProxy ( api . getName ( ) , proxy - > {
synchronized ( rPlayers ) {
2020-11-14 06:29:29 +01:00
ArrayList < CachedPlayer > add = new ArrayList < CachedPlayer > ( ) ;
2020-08-23 02:01:58 +02:00
for ( ProxiedPlayer player : getPlayers ( ) ) {
if ( ! rPlayers . containsKey ( player . getUniqueId ( ) ) ) { // Add players that don't exist
2020-11-14 06:29:29 +01:00
CachedPlayer p = new CachedPlayer ( player ) ;
2020-11-16 21:34:59 +01:00
rPlayerLinkP . put ( player . getUniqueId ( ) , p . getProxyName ( ) . toLowerCase ( ) ) ;
2020-08-23 02:01:58 +02:00
rPlayers . put ( player . getUniqueId ( ) , p ) ;
if ( player . getServer ( ) . getInfo ( ) instanceof ServerImpl ) rPlayerLinkS . put ( player . getUniqueId ( ) , ( ServerImpl ) player . getServer ( ) . getInfo ( ) ) ;
add . add ( p ) ;
}
}
2020-11-14 06:29:29 +01:00
ArrayList < CachedPlayer > remove = new ArrayList < CachedPlayer > ( ) ;
2020-11-14 08:07:25 +01:00
for ( Pair < String , UUID > player : proxy . getPlayers ( ) ) { // Remove players that shouldn't exist
if ( getPlayer ( player . value ( ) ) = = null ) {
remove . add ( rPlayers . get ( player . value ( ) ) ) ;
rPlayerLinkS . remove ( player . value ( ) ) ;
rPlayerLinkP . remove ( player . value ( ) ) ;
rPlayers . remove ( player . value ( ) ) ;
2020-08-23 02:01:58 +02:00
}
}
for ( UUID player : Util . getBackwards ( rPlayerLinkP , api . getName ( ) . toLowerCase ( ) ) ) { // Remove players that shouldn't exist (internally)
if ( getPlayer ( player ) = = null ) {
rPlayerLinkS . remove ( player ) ;
rPlayerLinkP . remove ( player ) ;
rPlayers . remove ( player ) ;
}
}
LinkedList < PacketExSyncPlayer > packets = new LinkedList < PacketExSyncPlayer > ( ) ; // Compile change data for external proxies
2020-11-14 06:29:29 +01:00
if ( add . size ( ) > 0 ) packets . add ( new PacketExSyncPlayer ( true , add . toArray ( new CachedPlayer [ 0 ] ) ) ) ;
if ( remove . size ( ) > 0 ) packets . add ( new PacketExSyncPlayer ( false , remove . toArray ( new CachedPlayer [ 0 ] ) ) ) ;
2020-08-23 02:01:58 +02:00
if ( packets . size ( ) > 0 ) {
PacketExSyncPlayer [ ] packet = packets . toArray ( new PacketExSyncPlayer [ 0 ] ) ;
if ( api . getSubDataNetwork ( ) [ 0 ] ! = null ) {
( ( SubDataClient ) api . getSubDataNetwork ( ) [ 0 ] ) . sendPacket ( packet ) ;
}
}
}
} ) ;
}
}
2020-11-07 17:35:25 +01:00
} , TimeUnit . SECONDS . toMillis ( rpec_s ) , TimeUnit . SECONDS . toMillis ( rpec_i ) ) ;
2017-08-22 15:02:23 +02:00
}
2017-12-07 23:51:06 +01:00
/ * *
* Further override BungeeCord ' s signature when patched into the same jar
*
* @return Software Name
* /
2020-08-14 00:26:22 +02:00
@Override // SubServers.Bungee is used here to hide the fact that this isn't the controller instance
2017-12-07 23:51:06 +01:00
public String getName ( ) {
2020-08-14 00:26:22 +02:00
return ( isPatched ) ? " SubServers.Bungee " : super . getName ( ) ;
2017-12-07 23:51:06 +01:00
}
/ * *
2018-05-24 20:52:47 +02:00
* Get the name from BungeeCord ' s original signature ( for determining which fork is being used )
2017-12-07 23:51:06 +01:00
*
2018-05-24 20:52:47 +02:00
* @return BungeeCord Software Name
2017-12-07 23:51:06 +01:00
* /
2020-11-14 04:41:56 +01:00
@Override
2018-05-24 20:52:47 +02:00
public String getBungeeName ( ) {
return super . getName ( ) ;
2017-12-07 23:51:06 +01:00
}
2017-08-22 15:02:23 +02:00
/ * *
* Emulate BungeeCord ' s getServers ( )
*
* @return Server Map
* /
@Override
public Map < String , ServerInfo > getServers ( ) {
if ( servers . size ( ) > 0 ) {
2021-03-13 17:51:32 +01:00
Map < String , ServerInfo > servers = new CaseInsensitiveMap < ServerInfo > ( ) ;
2017-12-07 23:51:06 +01:00
for ( ServerInfo server : this . servers . values ( ) ) servers . put ( server . getName ( ) , server ) ;
return servers ;
2017-08-22 15:02:23 +02:00
} else {
return super . getServers ( ) ;
}
}
2020-01-25 19:30:16 +01:00
/ * *
* Emulate Waterfall ' s getServersCopy ( )
*
* @return Server Map Copy ( which is the default , by the way )
* /
public Map < String , ServerInfo > getServersCopy ( ) {
return getServers ( ) ;
}
/ * *
* Force BungeeCord ' s implementation of getServerInfo ( )
*
* @return ServerInfo
* /
@Override
public ServerInfo getServerInfo ( String name ) {
return getServers ( ) . get ( name ) ;
}
2017-08-22 15:02:23 +02:00
/ * *
* Reset all changes made by startListeners
*
2019-08-30 21:44:54 +02:00
* @see ExProxy # startListeners ( )
2017-08-22 15:02:23 +02:00
* /
@Override
public void stopListeners ( ) {
try {
2021-02-07 05:53:03 +01:00
Logger . get ( " SubServers " ) . info ( " Removing synced data " ) ;
2017-08-22 15:02:23 +02:00
servers . clear ( ) ;
2019-05-14 04:02:38 +02:00
reconnect = false ;
ArrayList < SubDataClient > tmp = new ArrayList < SubDataClient > ( ) ;
tmp . addAll ( subdata . values ( ) ) ;
for ( SubDataClient client : tmp ) if ( client ! = null ) {
client . close ( ) ;
Util . isException ( client : : waitFor ) ;
}
subdata . clear ( ) ;
subdata . put ( 0 , null ) ;
2018-10-08 01:25:08 +02:00
2021-02-07 05:53:03 +01:00
if ( UPnP . isUPnPAvailable ( ) ) {
for ( ListenerInfo listener : getConfig ( ) . getListeners ( ) ) {
if ( UPnP . isMappedTCP ( listener . getHost ( ) . getPort ( ) ) ) UPnP . closePortTCP ( listener . getHost ( ) . getPort ( ) ) ;
}
2018-10-08 01:25:08 +02:00
}
2020-07-25 11:43:42 +02:00
rPlayerLinkS . clear ( ) ;
rPlayerLinkP . clear ( ) ;
rPlayers . clear ( ) ;
2017-08-22 15:02:23 +02:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
super . stopListeners ( ) ;
}
2020-07-04 02:23:27 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
public void ping_passthrough ( ProxyPingEvent e ) {
2020-08-13 02:18:55 +02:00
boolean dynamic ;
2020-07-04 02:23:27 +02:00
ServerInfo override ;
2020-08-13 02:18:55 +02:00
if ( ( dynamic = SmartFallback . getForcedHost ( e . getConnection ( ) ) = = null ) & & getReconnectHandler ( ) instanceof SmartFallback & & ( override = SmartFallback . getDNS ( e . getConnection ( ) ) ) ! = null ) {
2020-07-04 02:23:27 +02:00
if ( ! ( override instanceof SubServerImpl ) | | ( ( SubServerImpl ) override ) . isRunning ( ) ) {
if ( ! e . getConnection ( ) . getListener ( ) . isPingPassthrough ( ) ) {
2021-07-09 07:46:10 +02:00
e . setResponse ( new ServerPing ( e . getResponse ( ) . getVersion ( ) , e . getResponse ( ) . getPlayers ( ) , new TextComponent ( override . getMotd ( ) ) , e . getResponse ( ) . getFaviconObject ( ) ) ) ;
2020-07-04 02:23:27 +02:00
} else {
2020-11-14 08:07:25 +01:00
Container < Boolean > lock = new Container < > ( true ) ;
2020-11-11 08:35:02 +01:00
boolean mode = plugin ! = null ;
if ( mode ) e . registerIntent ( plugin ) ;
2020-07-04 02:23:27 +02:00
( ( BungeeServerInfo ) override ) . ping ( ( ping , error ) - > {
if ( error ! = null ) {
2021-07-09 07:46:10 +02:00
e . setResponse ( new ServerPing ( e . getResponse ( ) . getVersion ( ) , e . getResponse ( ) . getPlayers ( ) , new TextComponent ( getTranslation ( " ping_cannot_connect " ) ) , e . getResponse ( ) . getFaviconObject ( ) ) ) ;
2020-07-04 02:23:27 +02:00
} else e . setResponse ( ping ) ;
lock . value = false ;
2020-11-11 08:35:02 +01:00
if ( mode ) e . completeIntent ( plugin ) ;
2020-07-04 02:23:27 +02:00
} , ( ( InitialHandler ) e . getConnection ( ) ) . getHandshake ( ) . getProtocolVersion ( ) ) ;
2020-11-11 08:35:02 +01:00
if ( ! mode ) while ( lock . value ) Util . isException ( ( ) - > Thread . sleep ( 4 ) ) ;
2020-07-04 02:23:27 +02:00
}
}
2020-08-13 02:18:55 +02:00
} else if ( dynamic ) {
e . getResponse ( ) . getPlayers ( ) . setOnline ( rPlayers . size ( ) ) ;
2020-07-04 02:23:27 +02:00
}
}
2019-02-27 20:05:05 +01:00
@EventHandler ( priority = Byte . MAX_VALUE )
public void ping ( ProxyPingEvent e ) {
2020-07-04 02:23:27 +02:00
ServerInfo override ;
2020-08-13 02:18:55 +02:00
if ( ( override = SmartFallback . getForcedHost ( e . getConnection ( ) ) ) ! = null | | ( override = SmartFallback . getDNS ( e . getConnection ( ) ) ) ! = null ) {
2020-07-04 02:23:27 +02:00
if ( override instanceof SubServerImpl & & ! ( ( SubServerImpl ) override ) . isRunning ( ) ) {
2021-07-09 07:46:10 +02:00
e . setResponse ( new ServerPing ( e . getResponse ( ) . getVersion ( ) , e . getResponse ( ) . getPlayers ( ) , new TextComponent ( api . getLang ( " SubServers " , " Bungee.Ping.Offline " ) ) , e . getResponse ( ) . getFaviconObject ( ) ) ) ;
2020-07-04 02:23:27 +02:00
}
} else {
int offline = 0 ;
for ( String name : e . getConnection ( ) . getListener ( ) . getServerPriority ( ) ) {
ServerInfo server = getServerInfo ( name ) ;
2021-07-09 07:46:10 +02:00
if ( server instanceof SubServerImpl & & ! ( ( SubServerImpl ) server ) . isRunning ( ) ) offline + + ;
2020-07-04 02:23:27 +02:00
}
2019-02-27 20:05:05 +01:00
2020-07-04 02:23:27 +02:00
if ( offline > = e . getConnection ( ) . getListener ( ) . getServerPriority ( ) . size ( ) ) {
2021-07-09 07:46:10 +02:00
e . setResponse ( new ServerPing ( e . getResponse ( ) . getVersion ( ) , e . getResponse ( ) . getPlayers ( ) , new TextComponent ( api . getLang ( " SubServers " , " Bungee.Ping.Offline " ) ) , e . getResponse ( ) . getFaviconObject ( ) ) ) ;
2020-07-04 02:23:27 +02:00
}
2019-02-27 20:05:05 +01:00
}
}
2020-08-13 02:18:55 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
public void login ( LoginEvent e ) {
2020-08-29 12:57:38 +02:00
super . getLogger ( ) . info ( " UUID of player " + e . getConnection ( ) . getName ( ) + " is " + e . getConnection ( ) . getUniqueId ( ) ) ;
2020-08-13 02:18:55 +02:00
if ( rPlayers . containsKey ( e . getConnection ( ) . getUniqueId ( ) ) ) {
2020-08-23 02:01:58 +02:00
Logger . get ( " SubServers " ) . warning ( e . getConnection ( ) . getName ( ) + " connected, but already had a database entry " ) ;
2020-11-14 06:29:29 +01:00
CachedPlayer player = rPlayers . get ( e . getConnection ( ) . getUniqueId ( ) ) ;
2020-11-16 21:34:59 +01:00
if ( player . getProxyName ( ) ! = null & & player . getProxyName ( ) . equalsIgnoreCase ( api . getName ( ) ) ) {
2020-08-22 00:33:09 +02:00
ProxiedPlayer p = getPlayer ( player . getUniqueId ( ) ) ;
if ( p ! = null ) p . disconnect ( new TextComponent ( getTranslation ( " already_connected_proxy " ) ) ) ;
2020-08-19 21:24:05 +02:00
} else {
2021-06-15 06:09:51 +02:00
( ( SubDataClient ) api . getSubDataNetwork ( ) [ 0 ] ) . sendPacket ( new PacketDisconnectPlayer ( new UUID [ ] { player . getUniqueId ( ) } , getTranslation ( " already_connected_proxy " ) ) ) ;
2020-08-19 21:24:05 +02:00
}
2020-08-13 02:18:55 +02:00
}
}
2017-08-22 15:02:23 +02:00
@EventHandler ( priority = Byte . MAX_VALUE )
2019-02-27 20:05:05 +01:00
public void validate ( ServerConnectEvent e ) {
2020-08-29 12:57:38 +02:00
if ( e . getPlayer ( ) . isConnected ( ) ) {
Map < String , ServerInfo > servers = new TreeMap < String , ServerInfo > ( this . servers ) ;
if ( servers . keySet ( ) . contains ( e . getTarget ( ) . getName ( ) . toLowerCase ( ) ) & & e . getTarget ( ) ! = servers . get ( e . getTarget ( ) . getName ( ) . toLowerCase ( ) ) ) {
e . setTarget ( servers . get ( e . getTarget ( ) . getName ( ) . toLowerCase ( ) ) ) ;
} else {
servers = getServers ( ) ;
if ( servers . keySet ( ) . contains ( e . getTarget ( ) . getName ( ) ) & & e . getTarget ( ) ! = servers . get ( e . getTarget ( ) . getName ( ) ) ) {
e . setTarget ( servers . get ( e . getTarget ( ) . getName ( ) ) ) ;
}
2017-08-22 15:02:23 +02:00
}
2018-11-21 22:52:03 +01:00
2020-08-29 12:57:38 +02:00
if ( ! e . getTarget ( ) . canAccess ( e . getPlayer ( ) ) ) {
2020-12-05 05:30:36 +01:00
if ( e . getPlayer ( ) . getServer ( ) = = null | | fallback . containsKey ( e . getPlayer ( ) . getUniqueId ( ) ) ) {
if ( ! fallback . containsKey ( e . getPlayer ( ) . getUniqueId ( ) ) | | fallback . get ( e . getPlayer ( ) . getUniqueId ( ) ) . names . contains ( e . getTarget ( ) . getName ( ) ) ) {
2020-08-29 12:57:38 +02:00
ServerKickEvent kick = new ServerKickEvent ( e . getPlayer ( ) , e . getTarget ( ) , new BaseComponent [ ] {
2021-07-09 07:46:10 +02:00
new TextComponent ( api . getLang ( " SubServers " , " Bungee.Restricted " ) )
2020-08-29 12:57:38 +02:00
} , null , ServerKickEvent . State . CONNECTING ) ;
fallback ( kick ) ;
if ( ! kick . isCancelled ( ) ) e . getPlayer ( ) . disconnect ( kick . getKickReasonComponent ( ) ) ;
if ( e . getPlayer ( ) . getServer ( ) ! = null ) e . setCancelled ( true ) ;
}
} else {
2021-07-09 07:46:10 +02:00
e . getPlayer ( ) . sendMessage ( api . getLang ( " SubServers " , " Bungee.Restricted " ) ) ;
2020-08-29 12:57:38 +02:00
e . setCancelled ( true ) ;
2019-04-29 17:05:06 +02:00
}
2020-12-05 05:30:36 +01:00
} else if ( e . getPlayer ( ) . getServer ( ) ! = null & & ! fallback . containsKey ( e . getPlayer ( ) . getUniqueId ( ) ) & & e . getTarget ( ) instanceof SubServerImpl & & ! ( ( SubServerImpl ) e . getTarget ( ) ) . isRunning ( ) ) {
2020-08-29 12:57:38 +02:00
e . getPlayer ( ) . sendMessage ( api . getLang ( " SubServers " , " Bungee.Server.Offline " ) ) ;
2019-04-29 17:05:06 +02:00
e . setCancelled ( true ) ;
}
2020-12-05 05:30:36 +01:00
if ( fallback . containsKey ( e . getPlayer ( ) . getUniqueId ( ) ) ) {
FallbackState state = fallback . get ( e . getPlayer ( ) . getUniqueId ( ) ) ;
if ( state . names . contains ( e . getTarget ( ) . getName ( ) ) ) {
state . remove ( e . getTarget ( ) . getName ( ) ) ;
2020-08-29 12:57:38 +02:00
} else if ( e . getPlayer ( ) . getServer ( ) ! = null ) {
2020-12-05 05:30:36 +01:00
fallback . remove ( e . getPlayer ( ) . getUniqueId ( ) ) ;
2020-08-29 12:57:38 +02:00
}
2019-04-29 17:05:06 +02:00
}
2020-08-29 12:57:38 +02:00
} else {
e . setCancelled ( true ) ;
2018-11-21 22:52:03 +01:00
}
2017-08-22 15:02:23 +02:00
}
2020-07-25 07:20:59 +02:00
@SuppressWarnings ( " deprecation " )
@EventHandler ( priority = Byte . MAX_VALUE )
2020-08-13 02:18:55 +02:00
public void connected ( ServerConnectedEvent e ) {
2020-08-29 12:57:38 +02:00
if ( e . getPlayer ( ) . isConnected ( ) ) {
synchronized ( rPlayers ) {
2020-11-14 06:29:29 +01:00
ObjectMap < String > raw = CachedPlayer . translate ( e . getPlayer ( ) ) ;
2020-08-29 12:57:38 +02:00
raw . set ( " server " , e . getServer ( ) . getInfo ( ) . getName ( ) ) ;
2020-11-14 06:29:29 +01:00
CachedPlayer player = new CachedPlayer ( raw ) ;
2020-11-16 21:34:59 +01:00
rPlayerLinkP . put ( player . getUniqueId ( ) , player . getProxyName ( ) . toLowerCase ( ) ) ;
2020-08-29 12:57:38 +02:00
rPlayers . put ( player . getUniqueId ( ) , player ) ;
if ( e . getServer ( ) . getInfo ( ) instanceof ServerImpl ) rPlayerLinkS . put ( player . getUniqueId ( ) , ( ServerImpl ) e . getServer ( ) . getInfo ( ) ) ;
if ( api . getSubDataNetwork ( ) [ 0 ] ! = null ) {
( ( SubDataClient ) api . getSubDataNetwork ( ) [ 0 ] ) . sendPacket ( new PacketExSyncPlayer ( true , player ) ) ;
}
2020-08-19 21:24:05 +02:00
}
2020-08-13 02:18:55 +02:00
2020-12-05 05:30:36 +01:00
if ( fallback . containsKey ( e . getPlayer ( ) . getUniqueId ( ) ) ) {
fallback . get ( e . getPlayer ( ) . getUniqueId ( ) ) . done ( ( ) - > {
if ( e . getPlayer ( ) . getServer ( ) ! = null & & ! ( ( UserConnection ) e . getPlayer ( ) ) . isDimensionChange ( ) & & e . getPlayer ( ) . getServer ( ) . getInfo ( ) . getName ( ) . equals ( e . getServer ( ) . getInfo ( ) . getName ( ) ) ) {
fallback . remove ( e . getPlayer ( ) . getUniqueId ( ) ) ;
e . getPlayer ( ) . sendMessage ( api . getLang ( " SubServers " , " Bungee.Feature.Smart-Fallback.Result " ) . replace ( " $str$ " , ( e . getServer ( ) . getInfo ( ) instanceof ServerImpl ) ? ( ( ServerImpl ) e . getServer ( ) . getInfo ( ) ) . getDisplayName ( ) : e . getServer ( ) . getInfo ( ) . getName ( ) ) ) ;
2020-08-29 12:57:38 +02:00
}
2020-12-05 05:30:36 +01:00
} , getConfig ( ) . getServerConnectTimeout ( ) + 500 ) ;
2020-11-23 06:25:00 +01:00
}
2020-08-29 12:57:38 +02:00
}
2020-07-25 07:20:59 +02:00
}
2018-10-04 01:18:16 +02:00
@SuppressWarnings ( " deprecation " )
2019-04-29 17:05:06 +02:00
@EventHandler ( priority = Byte . MAX_VALUE )
2018-10-04 01:18:16 +02:00
public void fallback ( ServerKickEvent e ) {
2021-07-09 07:46:10 +02:00
if ( e . getPlayer ( ) . isConnected ( ) & & config . get ( ) . getMap ( " Settings " ) . getMap ( " Smart-Fallback " , new ObjectMap < > ( ) ) . getBoolean ( " Fallback " , true ) ) {
2020-12-05 05:30:36 +01:00
FallbackState state ;
boolean init = ! fallback . containsKey ( e . getPlayer ( ) . getUniqueId ( ) ) ;
if ( init ) {
Map < String , ServerInfo > map = SmartFallback . getFallbackServers ( e . getPlayer ( ) . getPendingConnection ( ) . getListener ( ) , e . getPlayer ( ) ) ;
map . remove ( e . getKickedFrom ( ) . getName ( ) ) ;
state = new FallbackState ( e . getPlayer ( ) . getUniqueId ( ) , map , e . getKickReasonComponent ( ) ) ;
2019-04-29 17:05:06 +02:00
} else {
2020-12-05 05:30:36 +01:00
state = fallback . get ( e . getPlayer ( ) . getUniqueId ( ) ) ;
e . setKickReasonComponent ( state . reason ) ;
LinkedList < ServerInfo > tmp = new LinkedList < > ( state . servers ) ;
for ( ServerInfo server : tmp ) if ( server . getName ( ) . equals ( e . getKickedFrom ( ) . getName ( ) ) )
state . remove ( server ) ;
2018-10-04 01:18:16 +02:00
}
2018-10-14 09:26:23 +02:00
2020-12-05 05:30:36 +01:00
if ( ! state . servers . isEmpty ( ) ) {
2019-04-29 17:05:06 +02:00
e . setCancelled ( true ) ;
2019-08-30 02:01:52 +02:00
e . getPlayer ( ) . sendMessage ( api . getLang ( " SubServers " , " Bungee.Feature.Smart-Fallback " ) . replace ( " $str$ " , ( e . getKickedFrom ( ) instanceof ServerImpl ) ? ( ( ServerImpl ) e . getKickedFrom ( ) ) . getDisplayName ( ) : e . getKickedFrom ( ) . getName ( ) ) . replace ( " $msg$ " , e . getKickReason ( ) ) ) ;
2020-12-05 05:30:36 +01:00
if ( init ) fallback . put ( e . getPlayer ( ) . getUniqueId ( ) , state ) ;
2019-04-29 17:05:06 +02:00
2020-12-05 05:30:36 +01:00
e . setCancelServer ( state . servers . getFirst ( ) ) ;
2019-04-29 17:05:06 +02:00
}
2018-10-04 01:18:16 +02:00
}
}
2020-08-13 02:18:55 +02:00
2020-08-29 12:57:38 +02:00
@EventHandler ( priority = Byte . MAX_VALUE )
2020-11-11 08:35:02 +01:00
public void disconnected ( PlayerDisconnectEvent e ) {
2020-08-24 18:04:21 +02:00
UUID id = e . getPlayer ( ) . getUniqueId ( ) ;
2020-12-05 05:30:36 +01:00
fallback . remove ( id ) ;
2020-08-24 18:04:21 +02:00
SubCommand . permitted . remove ( id ) ;
2020-07-25 07:20:59 +02:00
2020-08-19 21:24:05 +02:00
synchronized ( rPlayers ) {
2020-08-24 18:04:21 +02:00
if ( rPlayers . containsKey ( id ) & & ( ! rPlayerLinkP . containsKey ( id ) | | rPlayerLinkP . get ( id ) . equalsIgnoreCase ( api . getName ( ) ) ) ) {
2020-11-14 06:29:29 +01:00
CachedPlayer player = rPlayers . get ( id ) ;
2020-08-24 18:04:21 +02:00
rPlayerLinkS . remove ( id ) ;
rPlayerLinkP . remove ( id ) ;
rPlayers . remove ( id ) ;
2020-08-19 21:24:05 +02:00
if ( api . getSubDataNetwork ( ) [ 0 ] ! = null ) {
2020-08-24 18:04:21 +02:00
( ( SubDataClient ) api . getSubDataNetwork ( ) [ 0 ] ) . sendPacket ( new PacketExSyncPlayer ( false , player ) ) ;
2020-08-19 21:24:05 +02:00
}
2020-07-25 07:20:59 +02:00
}
}
2019-05-14 04:02:38 +02:00
}
@SuppressWarnings ( " unchecked " )
2020-11-14 06:29:29 +01:00
private Map < Integer , UUID > getSubDataAsMap ( net . ME1312 . SubServers . Client . Common . Network . API . Server server ) {
2019-05-14 04:02:38 +02:00
HashMap < Integer , UUID > map = new HashMap < Integer , UUID > ( ) ;
ObjectMap < Integer > subdata = new ObjectMap < Integer > ( ( Map < Integer , ? > ) server . getRaw ( ) . getObject ( " subdata " ) ) ;
for ( Integer channel : subdata . getKeys ( ) ) map . put ( channel , subdata . getUUID ( channel ) ) ;
return map ;
2019-04-29 17:05:06 +02:00
}
2018-10-04 01:18:16 +02:00
2017-08-22 15:02:23 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
public void add ( SubAddServerEvent e ) {
2018-08-09 20:54:56 +02:00
api . getServer ( e . getServer ( ) , server - > {
if ( server ! = null ) {
2020-11-14 06:29:29 +01:00
if ( server instanceof net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) {
2020-06-12 07:45:49 +02:00
servers . put ( server . getName ( ) . toLowerCase ( ) , SubServerImpl . construct ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
2020-11-14 06:29:29 +01:00
getSubDataAsMap ( server ) , server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) , server . getWhitelist ( ) , ( ( net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) server ) . isRunning ( ) ) ) ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Added SubServer: " + e . getServer ( ) ) ;
2018-08-09 20:54:56 +02:00
} else {
2020-06-12 07:45:49 +02:00
servers . put ( server . getName ( ) . toLowerCase ( ) , ServerImpl . construct ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
2019-05-14 04:02:38 +02:00
getSubDataAsMap ( server ) , server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) , server . getWhitelist ( ) ) ) ;
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Added Server: " + e . getServer ( ) ) ;
2018-08-09 20:54:56 +02:00
}
} else System . out . println ( " PacketDownloadServerInfo( " + e . getServer ( ) + " ) returned with an invalid response " ) ;
} ) ;
2017-08-22 15:02:23 +02:00
}
2020-11-14 06:29:29 +01:00
public Boolean merge ( net . ME1312 . SubServers . Client . Common . Network . API . Server server ) {
2019-08-30 02:01:52 +02:00
ServerImpl current = servers . get ( server . getName ( ) . toLowerCase ( ) ) ;
2021-07-09 07:46:10 +02:00
if ( server instanceof net . ME1312 . SubServers . Client . Common . Network . API . SubServer | | ! ( current instanceof SubServerImpl ) ) {
2018-08-09 20:54:56 +02:00
if ( current = = null | | ! current . getSignature ( ) . equals ( server . getSignature ( ) ) ) {
2020-11-14 06:29:29 +01:00
if ( server instanceof net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) {
2020-06-12 07:45:49 +02:00
servers . put ( server . getName ( ) . toLowerCase ( ) , SubServerImpl . construct ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
2020-11-14 06:29:29 +01:00
getSubDataAsMap ( server ) , server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) , server . getWhitelist ( ) , ( ( net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) server ) . isRunning ( ) ) ) ;
2017-12-10 01:30:06 +01:00
} else {
2020-06-12 07:45:49 +02:00
servers . put ( server . getName ( ) . toLowerCase ( ) , ServerImpl . construct ( server . getSignature ( ) , server . getName ( ) , server . getDisplayName ( ) , server . getAddress ( ) ,
2019-05-14 04:02:38 +02:00
getSubDataAsMap ( server ) , server . getMotd ( ) , server . isHidden ( ) , server . isRestricted ( ) , server . getWhitelist ( ) ) ) ;
2017-12-10 01:30:06 +01:00
}
2020-11-14 06:29:29 +01:00
Logger . get ( " SubServers " ) . info ( " Added " + ( ( server instanceof net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) ? " Sub " : " " ) + " Server: " + server . getName ( ) ) ;
2017-12-10 01:30:06 +01:00
return true ;
} else {
2020-11-14 06:29:29 +01:00
if ( server instanceof net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) {
if ( ( ( net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) server ) . isRunning ( ) ! = ( ( SubServerImpl ) current ) . isRunning ( ) )
( ( SubServerImpl ) current ) . setRunning ( ( ( net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) server ) . isRunning ( ) ) ;
2017-12-10 01:30:06 +01:00
}
2018-08-09 20:54:56 +02:00
if ( ! server . getMotd ( ) . equals ( current . getMotd ( ) ) )
current . setMotd ( server . getMotd ( ) ) ;
if ( server . isHidden ( ) ! = current . isHidden ( ) )
current . setHidden ( server . isHidden ( ) ) ;
if ( server . isRestricted ( ) ! = current . isRestricted ( ) )
current . setRestricted ( server . isRestricted ( ) ) ;
if ( ! server . getDisplayName ( ) . equals ( current . getDisplayName ( ) ) )
current . setDisplayName ( server . getDisplayName ( ) ) ;
2017-12-10 01:30:06 +01:00
2020-11-14 06:29:29 +01:00
Logger . get ( " SubServers " ) . info ( " Re-added " + ( ( server instanceof net . ME1312 . SubServers . Client . Common . Network . API . SubServer ) ? " Sub " : " " ) + " Server: " + server . getName ( ) ) ;
2017-12-10 01:30:06 +01:00
return false ;
}
}
return null ;
}
2018-10-14 09:26:23 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
public void start ( SubStartEvent e ) {
2019-08-30 02:01:52 +02:00
if ( servers . keySet ( ) . contains ( e . getServer ( ) . toLowerCase ( ) ) & & servers . get ( e . getServer ( ) . toLowerCase ( ) ) instanceof SubServerImpl )
( ( SubServerImpl ) servers . get ( e . getServer ( ) . toLowerCase ( ) ) ) . setRunning ( true ) ;
2018-10-14 09:26:23 +02:00
}
2017-08-22 15:02:23 +02:00
@EventHandler ( priority = Byte . MIN_VALUE )
public void stop ( SubStoppedEvent e ) {
2019-08-30 02:01:52 +02:00
if ( servers . keySet ( ) . contains ( e . getServer ( ) . toLowerCase ( ) ) & & servers . get ( e . getServer ( ) . toLowerCase ( ) ) instanceof SubServerImpl )
( ( SubServerImpl ) servers . get ( e . getServer ( ) . toLowerCase ( ) ) ) . setRunning ( false ) ;
2017-08-22 15:02:23 +02:00
}
@EventHandler ( priority = Byte . MIN_VALUE )
public void remove ( SubRemoveServerEvent e ) {
2021-10-22 03:31:59 +02:00
if ( servers . remove ( e . getServer ( ) . toLowerCase ( ) ) ! = null )
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Removed Server: " + e . getServer ( ) ) ;
2017-08-22 15:02:23 +02:00
}
}