2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee.Network.Packet ;
2019-05-10 04:43:34 +02:00
import net.ME1312.SubData.Server.DataClient ;
2019-04-18 16:02:09 +02:00
import net.ME1312.SubData.Server.SubDataClient ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Host.Server ;
2019-05-10 04:43:34 +02:00
import net.ME1312.SubServers.Bungee.Host.ServerContainer ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Host.SubServer ;
2019-04-18 16:02:09 +02:00
import net.ME1312.Galaxi.Library.Map.ObjectMap ;
import net.ME1312.Galaxi.Library.Util ;
import net.ME1312.SubData.Server.Protocol.PacketObjectIn ;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.SubPlugin ;
2016-12-05 04:21:04 +01:00
2018-01-29 07:04:36 +01:00
import java.net.InetSocketAddress ;
2019-05-10 04:43:34 +02:00
import java.util.HashMap ;
2016-12-05 04:21:04 +01:00
import java.util.Map ;
2017-01-07 20:06:54 +01:00
/ * *
* Link Server Packet
* /
2019-04-18 16:02:09 +02:00
public class PacketLinkServer implements PacketObjectIn < Integer > , PacketObjectOut < Integer > {
2016-12-05 04:21:04 +01:00
private SubPlugin 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
* /
2016-12-05 04:21:04 +01:00
public PacketLinkServer ( SubPlugin plugin ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( plugin ) ) throw new NullPointerException ( ) ;
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 ) {
2019-04-18 16:02:09 +02:00
if ( Util . isNull ( response ) ) throw new NullPointerException ( ) ;
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 ) {
String name = ( data . contains ( 0x0000 ) ) ? data . getRawString ( 0x0000 ) : null ;
Integer port = ( data . contains ( 0x0001 ) ) ? data . getInt ( 0x0001 ) : null ;
2019-05-10 04:43:34 +02:00
Integer channel = data . getInt ( 0x0002 ) ;
2019-04-18 16:02:09 +02:00
2016-12-05 04:21:04 +01:00
try {
Map < String , Server > servers = plugin . api . getServers ( ) ;
2018-01-29 07:04:36 +01:00
Server server ;
2019-04-18 16:02:09 +02:00
if ( name ! = null & & servers . keySet ( ) . contains ( name . toLowerCase ( ) ) ) {
2019-05-10 04:43:34 +02:00
link ( client , servers . get ( name . toLowerCase ( ) ) , channel ) ;
2019-04-18 16:02:09 +02:00
} else if ( port ! = null ) {
if ( ( server = search ( new InetSocketAddress ( client . getAddress ( ) . getAddress ( ) , port ) ) ) ! = null ) {
2019-05-10 04:43:34 +02:00
link ( client , server , channel ) ;
2019-01-30 04:05:59 +01:00
} else {
2019-04-18 16:02:09 +02:00
throw new ServerLinkException ( " There is no server with address: " + client . getAddress ( ) . getAddress ( ) . getHostAddress ( ) + ':' + port ) ;
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
}
} catch ( Exception 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
}
}
2019-05-10 04:43:34 +02:00
private void link ( SubDataClient client , Server server , int channel ) {
HashMap < Integer , SubDataClient > subdata = Util . getDespiteException ( ( ) - > Util . reflect ( ServerContainer . class . getDeclaredField ( " subdata " ) , server ) , null ) ;
if ( ! subdata . keySet ( ) . contains ( channel ) | | ( channel = = 0 & & subdata . get ( 0 ) = = null ) ) {
server . setSubData ( client , channel ) ;
System . out . println ( " SubData > " + client . getAddress ( ) . toString ( ) + " has been defined as " + ( ( server instanceof SubServer ) ? " SubServer " : " Server " ) + " : " + server . getName ( ) + ( ( channel > 0 ) ? " (Sub " + channel + " ) " : " " ) ) ;
2019-01-30 04:05:59 +01:00
if ( server instanceof SubServer & & ! ( ( SubServer ) server ) . isRunning ( ) ) {
System . out . println ( " SubServers > Sending shutdown signal to rogue SubServer: " + server . getName ( ) ) ;
2019-04-18 16:02:09 +02:00
client . sendPacket ( new PacketOutExReset ( " Rogue SubServer Detected " ) ) ;
2019-01-30 04:05:59 +01:00
} else {
2019-04-18 16:02:09 +02:00
client . sendPacket ( new PacketLinkServer ( server . getName ( ) , 0 , null ) ) ;
2019-01-30 04:05:59 +01:00
}
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
}
}
2019-01-27 03:04:53 +01:00
private Server search ( InetSocketAddress address ) throws ServerLinkException {
2018-01-29 07:04:36 +01:00
Server server = null ;
for ( Server s : plugin . api . getServers ( ) . values ( ) ) {
if ( s . getAddress ( ) . equals ( address ) ) {
2019-01-27 03:04:53 +01:00
if ( server ! = null ) throw new ServerLinkException ( " Multiple servers match address: " + address . getAddress ( ) . getHostAddress ( ) + ':' + address . getPort ( ) ) ;
2018-01-29 07:04:36 +01:00
server = s ;
}
}
return server ;
}
2016-12-05 04:21:04 +01:00
@Override
2019-04-18 16:02:09 +02:00
public int version ( ) {
return 0x0001 ;
2016-12-05 04:21:04 +01:00
}
}