2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee.Network.Packet ;
2020-11-16 21:34:59 +01:00
import net.ME1312.Galaxi.Library.Map.ObjectMap ;
2021-10-24 06:14:07 +02:00
import net.ME1312.Galaxi.Library.Try ;
2020-11-16 21:34:59 +01:00
import net.ME1312.Galaxi.Library.Util ;
2019-08-30 21:44:54 +02:00
import net.ME1312.SubData.Server.Library.DisconnectReason ;
2019-05-11 23:23:31 +02:00
import net.ME1312.SubData.Server.Protocol.Initial.InitialPacket ;
2020-11-16 21:34:59 +01:00
import net.ME1312.SubData.Server.Protocol.PacketObjectIn ;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut ;
2019-04-18 16:02:09 +02:00
import net.ME1312.SubData.Server.SubDataClient ;
2019-06-25 23:13:27 +02:00
import net.ME1312.SubServers.Bungee.Event.SubStartedEvent ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Host.Server ;
2020-06-12 07:45:49 +02:00
import net.ME1312.SubServers.Bungee.Host.ServerImpl ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Host.SubServer ;
2020-06-12 07:45:49 +02:00
import net.ME1312.SubServers.Bungee.Host.SubServerImpl ;
2019-05-17 00:36:41 +02:00
import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger ;
2021-07-09 07:46:10 +02:00
import net.ME1312.SubServers.Bungee.SubAPI ;
2019-08-30 21:44:54 +02:00
import net.ME1312.SubServers.Bungee.SubProxy ;
2020-11-16 21:34:59 +01:00
2019-06-25 23:13:27 +02:00
import net.md_5.bungee.api.ProxyServer ;
2016-12-05 04:21:04 +01:00
2018-01-29 07:04:36 +01:00
import java.net.InetSocketAddress ;
2020-06-12 07:45:49 +02:00
import java.util.* ;
2019-08-30 21:44:54 +02:00
import java.util.concurrent.TimeUnit ;
2016-12-05 04:21:04 +01:00
2017-01-07 20:06:54 +01:00
/ * *
* Link Server Packet
* /
2019-05-11 23:23:31 +02:00
public class PacketLinkServer implements InitialPacket , PacketObjectIn < Integer > , PacketObjectOut < Integer > {
2021-07-09 07:46:10 +02:00
public static boolean strict = true ;
2019-08-30 21:44:54 +02:00
private SubProxy plugin ;
2016-12-19 01:38:02 +01:00
private int response ;
2016-12-05 04:21:04 +01:00
private String message ;
2018-01-29 07:04:36 +01:00
private String name ;
2016-12-05 04:21:04 +01:00
2019-01-27 03:04:53 +01:00
private static class ServerLinkException extends IllegalStateException {
public ServerLinkException ( String message ) {
super ( message ) ;
}
}
2017-01-07 20:06:54 +01:00
/ * *
* New PacketLinkServer ( In )
*
* @param plugin SubPlugin
* /
2019-08-30 21:44:54 +02:00
public PacketLinkServer ( SubProxy plugin ) {
2021-10-24 06:14:07 +02:00
Util . nullpo ( plugin ) ;
2016-12-05 04:21:04 +01:00
this . plugin = plugin ;
}
2017-01-07 20:06:54 +01:00
/ * *
* New PacketLinkServer ( Out )
*
2018-01-29 07:04:36 +01:00
* @param name The name that was determined
2017-01-07 20:06:54 +01:00
* @param response Response ID
* @param message Message
* /
2018-01-29 07:04:36 +01:00
public PacketLinkServer ( String name , int response , String message ) {
2021-10-24 06:14:07 +02:00
Util . nullpo ( response ) ;
2018-01-29 07:04:36 +01:00
this . name = name ;
2016-12-05 04:21:04 +01:00
this . response = response ;
this . message = message ;
}
@Override
2019-04-18 16:02:09 +02:00
public ObjectMap < Integer > send ( SubDataClient client ) {
ObjectMap < Integer > data = new ObjectMap < Integer > ( ) ;
data . set ( 0x0000 , name ) ;
data . set ( 0x0001 , response ) ;
if ( message ! = null ) data . set ( 0x0002 , message ) ;
2018-04-15 03:53:51 +02:00
return data ;
2016-12-05 04:21:04 +01:00
}
@Override
2019-04-18 16:02:09 +02:00
public void receive ( SubDataClient client , ObjectMap < Integer > data ) {
2021-10-24 20:53:15 +02:00
String name = ( data . contains ( 0x0000 ) ) ? data . getString ( 0x0000 ) : null ;
2019-05-10 04:43:34 +02:00
Integer channel = data . getInt ( 0x0002 ) ;
2021-07-09 07:46:10 +02:00
InetSocketAddress address ;
2019-04-18 16:02:09 +02:00
2016-12-05 04:21:04 +01:00
try {
2021-07-09 07:46:10 +02:00
if ( ! data . contains ( 0x0001 ) ) {
address = null ;
} else if ( data . isNumber ( 0x0001 ) ) {
address = new InetSocketAddress ( client . getAddress ( ) . getAddress ( ) , data . getInt ( 0x0001 ) ) ;
} else {
2021-10-24 20:53:15 +02:00
String [ ] sa = data . getString ( 0x0001 ) . split ( " : " ) ;
2021-07-09 07:46:10 +02:00
address = new InetSocketAddress ( sa [ 0 ] , Integer . parseInt ( sa [ 1 ] ) ) ;
}
2018-01-29 07:04:36 +01:00
Server server ;
2021-07-26 22:50:03 +02:00
Map < String , Server > servers = plugin . api . getServers ( ) ;
2022-03-18 16:57:38 +01:00
if ( name ! = null & & servers . containsKey ( name . toLowerCase ( ) ) ) {
2021-07-26 22:50:03 +02:00
link ( client , servers . get ( name . toLowerCase ( ) ) , channel ) ;
2021-07-09 07:46:10 +02:00
} else if ( address ! = null ) {
2021-07-26 22:50:03 +02:00
if ( ( server = search ( address ) ) ! = null | | ( server = create ( name , address ) ) ! = null ) {
link ( client , server , channel ) ;
2019-01-30 04:05:59 +01:00
} else {
2021-07-09 07:46:10 +02:00
throw new ServerLinkException ( " There is no server with address: " + address . getAddress ( ) . getHostAddress ( ) + ':' + address . getPort ( ) ) ;
2019-01-30 04:05:59 +01:00
}
2019-01-27 03:04:53 +01:00
} else {
2019-01-30 04:05:59 +01:00
throw new ServerLinkException ( " Not enough arguments " ) ;
2019-01-27 03:04:53 +01:00
}
} catch ( ServerLinkException e ) {
2019-04-18 16:02:09 +02:00
if ( name ! = null ) {
client . sendPacket ( new PacketLinkServer ( null , 3 , " There is no server with name: " + name ) ) ;
2016-12-05 04:21:04 +01:00
} else {
2019-01-27 03:04:53 +01:00
client . sendPacket ( new PacketLinkServer ( null , 2 , e . getMessage ( ) ) ) ;
2016-12-05 04:21:04 +01:00
}
2019-05-11 23:23:31 +02:00
} catch ( Throwable e ) {
2019-04-18 16:02:09 +02:00
client . sendPacket ( new PacketLinkServer ( null , 1 , null ) ) ;
2017-07-23 06:32:57 +02:00
e . printStackTrace ( ) ;
2016-12-05 04:21:04 +01:00
}
}
2021-07-26 22:50:03 +02:00
private Server create ( String name , InetSocketAddress address ) throws Throwable {
if ( strict ) {
return null ;
2021-07-09 07:46:10 +02:00
} else {
2021-07-26 22:50:03 +02:00
String id = ( name = = null ) ? Util . getNew ( SubAPI . getInstance ( ) . getServers ( ) . keySet ( ) , ( ) - > UUID . randomUUID ( ) . toString ( ) ) : name ;
Server server = SubAPI . getInstance ( ) . addServer ( id , address . getAddress ( ) , address . getPort ( ) , " Some Dynamic Server " , name = = null , false ) ;
if ( server ! = null ) Util . reflect ( ServerImpl . class . getDeclaredField ( " persistent " ) , server , false ) ;
return server ;
2021-07-09 07:46:10 +02:00
}
2021-07-26 22:50:03 +02:00
}
2021-07-09 07:46:10 +02:00
2021-07-26 22:50:03 +02:00
private Server search ( InetSocketAddress address ) {
Server server = null ;
for ( Server s : plugin . api . getServers ( ) . values ( ) ) {
if ( s . getAddress ( ) . equals ( address ) ) {
if ( server ! = null ) throw new ServerLinkException ( " Multiple servers match address: " + address . getAddress ( ) . getHostAddress ( ) + ':' + address . getPort ( ) ) ;
server = s ;
}
}
return server ;
}
static long req = 1 ;
static long last = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
private void link ( SubDataClient client , Server server , int channel ) throws Throwable {
2021-10-24 06:14:07 +02:00
HashMap < Integer , SubDataClient > subdata = Try . all . get ( ( ) - > Util . reflect ( ServerImpl . class . getDeclaredField ( " subdata " ) , server ) ) ;
2022-03-18 16:57:38 +01:00
if ( ! subdata . containsKey ( channel ) | | ( channel = = 0 & & subdata . get ( 0 ) = = null ) ) {
2019-05-10 04:43:34 +02:00
server . setSubData ( client , channel ) ;
2021-06-25 05:06:53 +02:00
Logger . get ( " SubData " ) . info ( client . getAddress ( ) . toString ( ) + " has been defined as " + ( ( server instanceof SubServer ) ? " SubServer " : " Server " ) + " : " + server . getName ( ) + ( ( channel > 0 ) ? " [+ " + channel + " ] " : " " ) ) ;
2019-08-30 21:44:54 +02:00
Runnable register = ( ) - > {
if ( server instanceof SubServer & & ! ( ( SubServer ) server ) . isRunning ( ) ) {
2022-02-15 17:36:07 +01:00
if ( ( ( SubServer ) server ) . isAvailable ( ) ) {
2019-08-30 21:44:54 +02:00
Logger . get ( " SubServers " ) . info ( " Sending shutdown signal to rogue SubServer: " + server . getName ( ) ) ;
client . sendPacket ( new PacketOutExReset ( " Rogue SubServer Detected " ) ) ;
} else {
// Drop connection if host is unavailable for rogue checking (try again later)
2021-10-24 06:14:07 +02:00
Try . all . run ( ( ) - > Util . reflect ( SubDataClient . class . getDeclaredMethod ( " close " , DisconnectReason . class ) , client , DisconnectReason . CLOSE_REQUESTED ) ) ;
2019-08-30 21:44:54 +02:00
}
} else {
2021-10-24 06:14:07 +02:00
if ( server instanceof SubServer & & ! Try . all . get ( ( ) - > Util . reflect ( SubServerImpl . class . getDeclaredField ( " started " ) , server ) , true ) ) {
Try . all . run ( ( ) - > Util . reflect ( SubServerImpl . class . getDeclaredField ( " started " ) , server , true ) ) ;
2019-08-30 21:44:54 +02:00
SubStartedEvent event = new SubStartedEvent ( ( SubServer ) server ) ;
ProxyServer . getInstance ( ) . getPluginManager ( ) . callEvent ( event ) ;
}
client . sendPacket ( new PacketLinkServer ( server . getName ( ) , 0 , null ) ) ;
}
2020-06-12 07:45:49 +02:00
- - req ;
2019-08-30 21:44:54 +02:00
} ;
2020-06-12 07:45:49 +02:00
final long now = Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ;
2020-11-23 06:25:00 +01:00
Timer timer = new Timer ( " SubServers.Bungee::Server_Linker( " + server . getName ( ) + " ) " ) ;
timer . schedule ( new TimerTask ( ) {
2020-06-12 07:45:49 +02:00
@Override
public void run ( ) {
register . run ( ) ;
2020-11-23 06:25:00 +01:00
timer . cancel ( ) ;
2020-06-12 07:45:49 +02:00
}
} , ( ( server instanceof SubServer & & ! ( ( SubServer ) server ) . isRunning ( ) ) ? TimeUnit . SECONDS . toMillis ( 5 ) : 0 ) + ( ( now - last < 500 ) ? ( req * 500 ) : 0 ) ) ;
+ + req ;
last = now ;
2021-01-21 20:28:23 +01:00
setReady ( client ) ;
2018-01-29 07:04:36 +01:00
} else {
2019-04-18 16:02:09 +02:00
client . sendPacket ( new PacketLinkServer ( null , 4 , " Server already linked " ) ) ;
2018-01-29 07:04:36 +01:00
}
}
2016-12-05 04:21:04 +01:00
}