2019-05-14 04:02:38 +02:00
package net.ME1312.SubServers.Sync.Network ;
import net.ME1312.Galaxi.Library.Callback.Callback ;
import net.ME1312.Galaxi.Library.Map.ObjectMap ;
2020-06-12 07:45:49 +02:00
import net.ME1312.Galaxi.Library.Container.NamedContainer ;
2019-05-14 04:02:38 +02:00
import net.ME1312.Galaxi.Library.Util ;
import net.ME1312.Galaxi.Library.Version.Version ;
import net.ME1312.SubData.Client.SubDataClient ;
import net.ME1312.SubData.Client.SubDataProtocol ;
2020-11-14 06:29:29 +01:00
import net.ME1312.SubServers.Client.Common.Network.API.RemotePlayer ;
import net.ME1312.SubServers.Client.Common.Network.API.Server ;
import net.ME1312.SubServers.Client.Common.Network.Packet.* ;
2019-05-14 04:02:38 +02:00
import net.ME1312.SubServers.Sync.Event.SubNetworkConnectEvent ;
import net.ME1312.SubServers.Sync.Event.SubNetworkDisconnectEvent ;
2019-08-30 21:44:54 +02:00
import net.ME1312.SubServers.Sync.ExProxy ;
2019-05-14 04:02:38 +02:00
import net.ME1312.SubServers.Sync.Network.Packet.* ;
2020-11-14 06:29:29 +01:00
import net.ME1312.SubServers.Sync.Server.CachedPlayer ;
2020-07-25 07:20:59 +02:00
import net.ME1312.SubServers.Sync.Server.ServerImpl ;
2019-05-14 04:02:38 +02:00
import net.ME1312.SubServers.Sync.SubAPI ;
import net.md_5.bungee.api.config.ListenerInfo ;
2020-07-25 07:20:59 +02:00
import net.md_5.bungee.api.config.ServerInfo ;
2019-05-14 04:02:38 +02:00
import net.md_5.bungee.conf.Configuration ;
import java.io.IOException ;
import java.net.InetAddress ;
2020-07-25 11:43:42 +02:00
import java.util.* ;
2019-05-14 04:02:38 +02:00
import java.util.logging.Logger ;
2020-08-12 02:28:34 +02:00
/ * *
* SubServers Protocol Class
* /
2019-05-14 04:02:38 +02:00
public class SubProtocol extends SubDataProtocol {
private static SubProtocol instance ;
@SuppressWarnings ( " deprecation " )
2020-08-12 02:28:34 +02:00
protected SubProtocol ( ) {
ExProxy plugin = SubAPI . getInstance ( ) . getInternals ( ) ;
setName ( " SubServers 2 " ) ;
addVersion ( new Version ( " 2.16a+ " ) ) ;
// 00-0F: Object Link Packets
registerPacket ( 0x0000 , PacketLinkProxy . class ) ;
registerPacket ( 0x0000 , new PacketLinkProxy ( plugin ) ) ;
// 10-2F: Download Packets
registerPacket ( 0x0010 , PacketDownloadLang . class ) ;
registerPacket ( 0x0011 , PacketDownloadPlatformInfo . class ) ;
registerPacket ( 0x0012 , PacketDownloadProxyInfo . class ) ;
registerPacket ( 0x0013 , PacketDownloadHostInfo . class ) ;
registerPacket ( 0x0014 , PacketDownloadGroupInfo . class ) ;
registerPacket ( 0x0015 , PacketDownloadServerInfo . class ) ;
registerPacket ( 0x0016 , PacketDownloadPlayerInfo . class ) ;
registerPacket ( 0x0017 , PacketCheckPermission . class ) ;
registerPacket ( 0x0018 , PacketCheckPermissionResponse . class ) ;
registerPacket ( 0x0010 , new PacketDownloadLang ( plugin ) ) ;
registerPacket ( 0x0011 , new PacketDownloadPlatformInfo ( ) ) ;
registerPacket ( 0x0012 , new PacketDownloadProxyInfo ( ) ) ;
registerPacket ( 0x0013 , new PacketDownloadHostInfo ( ) ) ;
registerPacket ( 0x0014 , new PacketDownloadGroupInfo ( ) ) ;
registerPacket ( 0x0015 , new PacketDownloadServerInfo ( ) ) ;
registerPacket ( 0x0016 , new PacketDownloadPlayerInfo ( ) ) ;
registerPacket ( 0x0017 , new PacketCheckPermission ( ) ) ;
registerPacket ( 0x0018 , new PacketCheckPermissionResponse ( ) ) ;
// 30-4F: Control Packets
registerPacket ( 0x0030 , PacketCreateServer . class ) ;
registerPacket ( 0x0031 , PacketAddServer . class ) ;
registerPacket ( 0x0032 , PacketStartServer . class ) ;
registerPacket ( 0x0033 , PacketUpdateServer . class ) ;
registerPacket ( 0x0034 , PacketEditServer . class ) ;
registerPacket ( 0x0035 , PacketRestartServer . class ) ;
registerPacket ( 0x0036 , PacketCommandServer . class ) ;
registerPacket ( 0x0037 , PacketStopServer . class ) ;
registerPacket ( 0x0038 , PacketRemoveServer . class ) ;
registerPacket ( 0x0039 , PacketDeleteServer . class ) ;
2020-08-19 21:24:05 +02:00
registerPacket ( 0x003C , PacketDisconnectPlayer . class ) ;
2020-08-12 02:28:34 +02:00
registerPacket ( 0x0030 , new PacketCreateServer ( ) ) ;
registerPacket ( 0x0031 , new PacketAddServer ( ) ) ;
registerPacket ( 0x0032 , new PacketStartServer ( ) ) ;
registerPacket ( 0x0033 , new PacketUpdateServer ( ) ) ;
registerPacket ( 0x0034 , new PacketEditServer ( ) ) ;
registerPacket ( 0x0035 , new PacketRestartServer ( ) ) ;
registerPacket ( 0x0036 , new PacketCommandServer ( ) ) ;
registerPacket ( 0x0037 , new PacketStopServer ( ) ) ;
registerPacket ( 0x0038 , new PacketRemoveServer ( ) ) ;
registerPacket ( 0x0039 , new PacketDeleteServer ( ) ) ;
2020-08-19 21:24:05 +02:00
registerPacket ( 0x003C , new PacketDisconnectPlayer ( ) ) ;
2020-08-12 02:28:34 +02:00
// 70-7F: External Misc Packets
//registerPacket(0x0070, PacketInExRunEvent.class);
//registerPacket(0x0071, PacketInExReset.class);
//registerPacket(0x0073, PacketInExReload.class);
registerPacket ( 0x0074 , PacketExSyncPlayer . class ) ;
2020-08-19 21:24:05 +02:00
registerPacket ( 0x0076 , PacketExDisconnectPlayer . class ) ;
2020-08-12 02:28:34 +02:00
registerPacket ( 0x0070 , new PacketInExRunEvent ( plugin ) ) ;
registerPacket ( 0x0071 , new PacketInExReset ( ) ) ;
registerPacket ( 0x0073 , new PacketInExUpdateWhitelist ( plugin ) ) ;
registerPacket ( 0x0074 , new PacketExSyncPlayer ( plugin ) ) ;
2020-08-19 21:24:05 +02:00
registerPacket ( 0x0076 , new PacketExDisconnectPlayer ( plugin ) ) ;
2020-08-12 02:28:34 +02:00
}
2019-05-14 04:02:38 +02:00
public static SubProtocol get ( ) {
2020-08-12 02:28:34 +02:00
if ( instance = = null )
2019-05-14 04:02:38 +02:00
instance = new SubProtocol ( ) ;
return instance ;
}
private Logger getLogger ( int channel ) {
2020-11-14 04:41:56 +01:00
return net . ME1312 . SubServers . Bungee . Library . Compatibility . Logger . get ( " SubData " + ( ( channel ! = 0 ) ? " /Sub- " + channel : " " ) ) ;
2019-05-14 04:02:38 +02:00
}
@Override
2020-06-12 07:45:49 +02:00
protected SubDataClient sub ( Callback < Runnable > scheduler , Logger logger , InetAddress address , int port , ObjectMap < ? > login ) throws IOException {
2019-08-30 21:44:54 +02:00
ExProxy plugin = SubAPI . getInstance ( ) . getInternals ( ) ;
HashMap < Integer , SubDataClient > map = Util . getDespiteException ( ( ) - > Util . reflect ( ExProxy . class . getDeclaredField ( " subdata " ) , plugin ) , null ) ;
2019-05-14 04:02:38 +02:00
int channel = 1 ;
while ( map . keySet ( ) . contains ( channel ) ) channel + + ;
final int fc = channel ;
2020-06-12 07:45:49 +02:00
SubDataClient subdata = super . open ( scheduler , getLogger ( fc ) , address , port , login ) ;
2019-05-14 04:02:38 +02:00
map . put ( fc , subdata ) ;
subdata . sendPacket ( new PacketLinkProxy ( plugin , fc ) ) ;
subdata . on . closed ( client - > map . remove ( fc ) ) ;
return subdata ;
}
@SuppressWarnings ( " deprecation " )
@Override
public SubDataClient open ( Callback < Runnable > scheduler , Logger logger , InetAddress address , int port ) throws IOException {
2019-08-30 21:44:54 +02:00
ExProxy plugin = SubAPI . getInstance ( ) . getInternals ( ) ;
2019-05-14 04:02:38 +02:00
SubDataClient subdata = super . open ( scheduler , logger , address , port ) ;
2019-08-30 21:44:54 +02:00
HashMap < Integer , SubDataClient > map = Util . getDespiteException ( ( ) - > Util . reflect ( ExProxy . class . getDeclaredField ( " subdata " ) , plugin ) , null ) ;
2019-05-14 04:02:38 +02:00
subdata . sendPacket ( new PacketLinkProxy ( plugin , 0 ) ) ;
subdata . sendPacket ( new PacketDownloadLang ( ) ) ;
subdata . sendPacket ( new PacketDownloadPlatformInfo ( platform - > {
if ( plugin . lastReload ! = platform . getMap ( " subservers " ) . getLong ( " last-reload " ) ) {
2020-11-14 04:41:56 +01:00
net . ME1312 . SubServers . Bungee . Library . Compatibility . Logger . get ( " SubServers " ) . info ( " Resetting Server Data " ) ;
2019-05-14 04:02:38 +02:00
plugin . servers . clear ( ) ;
plugin . lastReload = platform . getMap ( " subservers " ) . getLong ( " last-reload " ) ;
}
try {
LinkedList < ListenerInfo > listeners = new LinkedList < ListenerInfo > ( plugin . getConfig ( ) . getListeners ( ) ) ;
for ( int i = 0 ; i < platform . getMap ( " bungee " ) . getMapList ( " listeners " ) . size ( ) ; i + + ) if ( i < listeners . size ( ) ) {
if ( plugin . config . get ( ) . getMap ( " Sync " , new ObjectMap < > ( ) ) . getBoolean ( " Forced-Hosts " , true ) ) Util . reflect ( ListenerInfo . class . getDeclaredField ( " forcedHosts " ) , listeners . get ( i ) , platform . getMap ( " bungee " ) . getMapList ( " listeners " ) . get ( i ) . getMap ( " forced-hosts " ) . get ( ) ) ;
if ( plugin . config . get ( ) . getMap ( " Sync " , new ObjectMap < > ( ) ) . getBoolean ( " Motd " , false ) ) Util . reflect ( ListenerInfo . class . getDeclaredField ( " motd " ) , listeners . get ( i ) , platform . getMap ( " bungee " ) . getMapList ( " listeners " ) . get ( i ) . getRawString ( " motd " ) ) ;
if ( plugin . config . get ( ) . getMap ( " Sync " , new ObjectMap < > ( ) ) . getBoolean ( " Player-Limit " , false ) ) Util . reflect ( ListenerInfo . class . getDeclaredField ( " maxPlayers " ) , listeners . get ( i ) , platform . getMap ( " bungee " ) . getMapList ( " listeners " ) . get ( i ) . getInt ( " player-limit " ) ) ;
if ( plugin . config . get ( ) . getMap ( " Sync " , new ObjectMap < > ( ) ) . getBoolean ( " Server-Priorities " , true ) ) Util . reflect ( ListenerInfo . class . getDeclaredField ( " serverPriority " ) , listeners . get ( i ) , platform . getMap ( " bungee " ) . getMapList ( " listeners " ) . get ( i ) . getRawStringList ( " priorities " ) ) ;
}
if ( plugin . config . get ( ) . getMap ( " Sync " , new ObjectMap < > ( ) ) . getBoolean ( " Disabled-Commands " , false ) ) Util . reflect ( Configuration . class . getDeclaredField ( " disabledCommands " ) , plugin . getConfig ( ) , platform . getMap ( " bungee " ) . getRawStringList ( " disabled-cmds " ) ) ;
if ( plugin . config . get ( ) . getMap ( " Sync " , new ObjectMap < > ( ) ) . getBoolean ( " Player-Limit " , false ) ) Util . reflect ( Configuration . class . getDeclaredField ( " playerLimit " ) , plugin . getConfig ( ) , platform . getMap ( " bungee " ) . getInt ( " player-limit " ) ) ;
} catch ( Exception e ) {
2020-11-14 04:41:56 +01:00
net . ME1312 . SubServers . Bungee . Library . Compatibility . Logger . get ( " SubServers " ) . info ( " Problem syncing BungeeCord configuration options " ) ;
2019-05-14 04:02:38 +02:00
e . printStackTrace ( ) ;
}
2020-11-14 06:29:29 +01:00
ArrayList < CachedPlayer > localPlayers = new ArrayList < CachedPlayer > ( ) ;
2020-07-25 11:43:42 +02:00
for ( UUID id : new ArrayList < UUID > ( plugin . rPlayers . keySet ( ) ) ) {
if ( plugin . getPlayer ( id ) ! = null ) {
localPlayers . add ( plugin . rPlayers . get ( id ) ) ;
} else {
plugin . rPlayerLinkS . remove ( id ) ;
plugin . rPlayerLinkP . remove ( id ) ;
plugin . rPlayers . remove ( id ) ;
}
}
2020-11-14 06:29:29 +01:00
subdata . sendPacket ( new PacketExSyncPlayer ( null , localPlayers . toArray ( new CachedPlayer [ 0 ] ) ) ) ;
2020-07-25 11:43:42 +02:00
2019-05-14 04:02:38 +02:00
plugin . api . getServers ( servers - > {
for ( Server server : servers . values ( ) ) {
plugin . merge ( server ) ;
}
2020-07-25 07:20:59 +02:00
plugin . api . getGlobalPlayers ( players - > {
for ( RemotePlayer player : players . values ( ) ) {
plugin . rPlayerLinkP . put ( player . getUniqueId ( ) , player . getProxy ( ) . toLowerCase ( ) ) ;
2020-11-14 06:29:29 +01:00
plugin . rPlayers . put ( player . getUniqueId ( ) , new CachedPlayer ( player ) ) ;
2020-07-25 07:20:59 +02:00
ServerInfo server = plugin . getServerInfo ( player . getServer ( ) ) ;
if ( server instanceof ServerImpl )
plugin . rPlayerLinkS . put ( player . getUniqueId ( ) , ( ServerImpl ) server ) ;
}
} ) ;
2019-05-14 04:02:38 +02:00
} ) ;
2020-07-25 07:20:59 +02:00
2019-05-14 04:02:38 +02:00
} ) ) ;
subdata . on . ready ( client - > plugin . getPluginManager ( ) . callEvent ( new SubNetworkConnectEvent ( ( SubDataClient ) client ) ) ) ;
subdata . on . closed ( client - > {
SubNetworkDisconnectEvent event = new SubNetworkDisconnectEvent ( client . get ( ) , client . name ( ) ) ;
plugin . getPluginManager ( ) . callEvent ( event ) ;
2019-09-26 18:41:04 +02:00
if ( plugin . isRunning ) {
2020-11-14 04:41:56 +01:00
net . ME1312 . SubServers . Bungee . Library . Compatibility . Logger . get ( " SubData " ) . info ( " Attempting reconnect in " + plugin . config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getInt ( " Reconnect " , 60 ) + " seconds " ) ;
2019-09-26 18:41:04 +02:00
Util . isException ( ( ) - > Util . reflect ( ExProxy . class . getDeclaredMethod ( " connect " , NamedContainer . class ) , plugin , client ) ) ;
2019-10-19 00:24:58 +02:00
} else map . put ( 0 , null ) ;
2019-05-14 04:02:38 +02:00
} ) ;
return subdata ;
}
public SubDataClient open ( InetAddress address , int port ) throws IOException {
return open ( getLogger ( 0 ) , address , port ) ;
}
}