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.Library.DisconnectReason ;
import net.ME1312.SubData.Client.SubDataClient ;
import net.ME1312.SubData.Client.SubDataProtocol ;
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 ;
2020-07-25 07:20:59 +02:00
import net.ME1312.SubServers.Sync.Network.API.RemotePlayer ;
2019-05-14 04:02:38 +02:00
import net.ME1312.SubServers.Sync.Network.API.Server ;
import net.ME1312.SubServers.Sync.Network.Packet.* ;
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.lang.reflect.InvocationTargetException ;
import java.net.InetAddress ;
import java.util.HashMap ;
import java.util.LinkedList ;
import java.util.Timer ;
import java.util.TimerTask ;
import java.util.concurrent.TimeUnit ;
import java.util.logging.Logger ;
public class SubProtocol extends SubDataProtocol {
private static SubProtocol instance ;
private SubProtocol ( ) { }
@SuppressWarnings ( " deprecation " )
public static SubProtocol get ( ) {
if ( instance = = null ) {
instance = new SubProtocol ( ) ;
2019-08-30 21:44:54 +02:00
ExProxy plugin = SubAPI . getInstance ( ) . getInternals ( ) ;
2019-05-14 04:02:38 +02:00
instance . setName ( " SubServers 2 " ) ;
2020-06-12 07:45:49 +02:00
instance . addVersion ( new Version ( " 2.16a+ " ) ) ;
2019-05-14 04:02:38 +02:00
2019-06-18 02:20:46 +02:00
// 00-0F: Object Link Packets
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0000 , PacketLinkProxy . class ) ;
instance . registerPacket ( 0x0000 , new PacketLinkProxy ( plugin ) ) ;
2019-06-18 02:20:46 +02:00
// 10-2F: Download Packets
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0010 , PacketDownloadLang . class ) ;
instance . registerPacket ( 0x0011 , PacketDownloadPlatformInfo . class ) ;
instance . registerPacket ( 0x0012 , PacketDownloadProxyInfo . class ) ;
instance . registerPacket ( 0x0013 , PacketDownloadHostInfo . class ) ;
instance . registerPacket ( 0x0014 , PacketDownloadGroupInfo . class ) ;
instance . registerPacket ( 0x0015 , PacketDownloadServerInfo . class ) ;
2020-06-12 07:45:49 +02:00
instance . registerPacket ( 0x0016 , PacketDownloadPlayerInfo . class ) ;
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0017 , PacketCheckPermission . class ) ;
2019-10-19 00:24:58 +02:00
instance . registerPacket ( 0x0018 , PacketCheckPermissionResponse . class ) ;
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0010 , new PacketDownloadLang ( plugin ) ) ;
instance . registerPacket ( 0x0011 , new PacketDownloadPlatformInfo ( ) ) ;
instance . registerPacket ( 0x0012 , new PacketDownloadProxyInfo ( ) ) ;
instance . registerPacket ( 0x0013 , new PacketDownloadHostInfo ( ) ) ;
instance . registerPacket ( 0x0014 , new PacketDownloadGroupInfo ( ) ) ;
instance . registerPacket ( 0x0015 , new PacketDownloadServerInfo ( ) ) ;
2020-06-12 07:45:49 +02:00
instance . registerPacket ( 0x0016 , new PacketDownloadPlayerInfo ( ) ) ;
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0017 , new PacketCheckPermission ( ) ) ;
2019-10-19 00:24:58 +02:00
instance . registerPacket ( 0x0018 , new PacketCheckPermissionResponse ( ) ) ;
2019-05-14 04:02:38 +02:00
2019-06-18 02:20:46 +02:00
// 30-4F: Control Packets
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0030 , PacketCreateServer . class ) ;
instance . registerPacket ( 0x0031 , PacketAddServer . class ) ;
instance . registerPacket ( 0x0032 , PacketStartServer . class ) ;
2019-06-17 05:13:48 +02:00
instance . registerPacket ( 0x0033 , PacketUpdateServer . class ) ;
instance . registerPacket ( 0x0034 , PacketEditServer . class ) ;
instance . registerPacket ( 0x0035 , PacketRestartServer . class ) ;
instance . registerPacket ( 0x0036 , PacketCommandServer . class ) ;
instance . registerPacket ( 0x0037 , PacketStopServer . class ) ;
instance . registerPacket ( 0x0038 , PacketRemoveServer . class ) ;
instance . registerPacket ( 0x0039 , PacketDeleteServer . class ) ;
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0030 , new PacketCreateServer ( ) ) ;
instance . registerPacket ( 0x0031 , new PacketAddServer ( ) ) ;
instance . registerPacket ( 0x0032 , new PacketStartServer ( ) ) ;
2019-06-17 05:13:48 +02:00
instance . registerPacket ( 0x0033 , new PacketUpdateServer ( ) ) ;
instance . registerPacket ( 0x0034 , new PacketEditServer ( ) ) ;
instance . registerPacket ( 0x0035 , new PacketRestartServer ( ) ) ;
instance . registerPacket ( 0x0036 , new PacketCommandServer ( ) ) ;
instance . registerPacket ( 0x0037 , new PacketStopServer ( ) ) ;
instance . registerPacket ( 0x0038 , new PacketRemoveServer ( ) ) ;
instance . registerPacket ( 0x0039 , new PacketDeleteServer ( ) ) ;
2019-05-14 04:02:38 +02:00
2019-06-18 02:20:46 +02:00
// 70-7F: External Misc Packets
2019-05-14 04:02:38 +02:00
//instance.registerPacket(0x0070, PacketInExRunEvent.class);
//instance.registerPacket(0x0071, PacketInExReset.class);
//instance.registerPacket(0x0073, PacketInExReload.class);
2020-07-25 07:20:59 +02:00
instance . registerPacket ( 0x0074 , PacketExSyncPlayer . class ) ;
2019-05-14 04:02:38 +02:00
instance . registerPacket ( 0x0070 , new PacketInExRunEvent ( plugin ) ) ;
instance . registerPacket ( 0x0071 , new PacketInExReset ( ) ) ;
instance . registerPacket ( 0x0073 , new PacketInExUpdateWhitelist ( plugin ) ) ;
2020-07-25 07:20:59 +02:00
instance . registerPacket ( 0x0074 , new PacketExSyncPlayer ( plugin ) ) ;
2019-05-14 04:02:38 +02:00
}
return instance ;
}
private Logger getLogger ( int channel ) {
2019-05-17 00:36:41 +02:00
return net . ME1312 . SubServers . Sync . 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 " ) ) {
2019-05-17 00:36:41 +02:00
net . ME1312 . SubServers . Sync . 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 ) {
2019-05-17 00:36:41 +02:00
net . ME1312 . SubServers . Sync . Library . Compatibility . Logger . get ( " SubServers " ) . info ( " Problem syncing BungeeCord configuration options " ) ;
2019-05-14 04:02:38 +02:00
e . printStackTrace ( ) ;
}
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 . rPlayers . put ( player . getUniqueId ( ) , player ) ;
plugin . rPlayerLinkP . put ( player . getUniqueId ( ) , player . getProxy ( ) . toLowerCase ( ) ) ;
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 ) {
net . ME1312 . SubServers . Sync . Library . Compatibility . Logger . get ( " SubData " ) . info ( " Attempting reconnect in " + plugin . config . get ( ) . getMap ( " Settings " ) . getMap ( " SubData " ) . getInt ( " Reconnect " , 30 ) + " seconds " ) ;
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 ) ;
}
}