2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee.Host.Internal ;
2016-12-05 04:21:04 +01:00
2019-04-18 16:02:09 +02:00
import net.ME1312.Galaxi.Library.Config.YAMLSection ;
2020-11-16 21:34:59 +01:00
import net.ME1312.Galaxi.Library.Map.ObjectMap ;
import net.ME1312.Galaxi.Library.UniversalFile ;
import net.ME1312.Galaxi.Library.Util ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent ;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent ;
import net.ME1312.SubServers.Bungee.Host.Host ;
import net.ME1312.SubServers.Bungee.Host.SubCreator ;
import net.ME1312.SubServers.Bungee.Host.SubServer ;
2020-11-16 21:34:59 +01:00
import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger ;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException ;
2019-08-30 21:44:54 +02:00
import net.ME1312.SubServers.Bungee.SubProxy ;
2016-12-05 04:21:04 +01:00
2020-11-16 21:34:59 +01:00
import com.dosse.upnp.UPnP ;
import com.google.common.collect.Range ;
2017-04-01 18:50:09 +02:00
import java.io.File ;
import java.io.FileWriter ;
2016-12-05 04:21:04 +01:00
import java.net.InetAddress ;
2017-04-01 18:50:09 +02:00
import java.util.* ;
2016-12-05 04:21:04 +01:00
2017-01-07 20:06:54 +01:00
/ * *
* Internal Host Class
* /
2016-12-05 04:21:04 +01:00
public class InternalHost extends Host {
2018-09-15 03:05:39 +02:00
public static final boolean DRM_ALLOW = System . getProperty ( " RM.subservers " , " true " ) . equalsIgnoreCase ( " true " ) ;
2017-01-06 21:44:34 +01:00
private HashMap < String , SubServer > servers = new HashMap < String , SubServer > ( ) ;
2016-12-05 04:21:04 +01:00
private String name ;
private boolean enabled ;
private InetAddress address ;
2017-01-30 21:22:36 +01:00
private SubCreator creator ;
2016-12-15 22:04:39 +01:00
private String directory ;
2020-06-12 07:45:49 +02:00
SubProxy plugin ;
2016-12-05 04:21:04 +01:00
2017-01-07 20:06:54 +01:00
/ * *
* Creates an Internal Host
*
2019-01-05 22:04:45 +01:00
* @param plugin SubServers Internals
* @param name The Name of your Host
* @param ports The range of ports to auto - select from
* @param log Whether apps like SubCreator should log to console ( does not apply to servers )
* @param enabled If your host is Enabled
* @param address The address of your Host
* @param directory The runtime directory of your Host
* @param gitBash The Git Bash directory
2017-01-07 20:06:54 +01:00
* /
2019-08-30 21:44:54 +02:00
public InternalHost ( SubProxy plugin , String name , boolean enabled , Range < Integer > ports , boolean log , InetAddress address , String directory , String gitBash ) {
2019-01-05 22:04:45 +01:00
super ( plugin , name , enabled , ports , log , address , directory , gitBash ) ;
2018-09-15 03:05:39 +02:00
if ( ! DRM_ALLOW ) throw new IllegalStateException ( " SubServers' hosting capabilities have been disabled by your provider " ) ;
2016-12-05 04:21:04 +01:00
this . plugin = plugin ;
this . name = name ;
this . enabled = enabled ;
this . address = address ;
2019-01-05 22:04:45 +01:00
this . creator = new InternalSubCreator ( this , ports , log , gitBash ) ;
2016-12-05 04:21:04 +01:00
this . directory = directory ;
}
@Override
public boolean isEnabled ( ) {
return enabled ;
}
@Override
public void setEnabled ( boolean value ) {
this . enabled = value ;
}
@Override
public InetAddress getAddress ( ) {
return address ;
}
2016-12-15 22:04:39 +01:00
@Override
2017-04-24 18:28:16 +02:00
public String getPath ( ) {
2016-12-15 22:04:39 +01:00
return directory ;
}
2016-12-05 04:21:04 +01:00
@Override
public String getName ( ) {
return name ;
}
@Override
public SubCreator getCreator ( ) {
return creator ;
}
@Override
public Map < String , ? extends SubServer > getSubServers ( ) {
return new TreeMap < String , SubServer > ( servers ) ;
}
@Override
public SubServer getSubServer ( String name ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( name ) ) throw new NullPointerException ( ) ;
return getSubServers ( ) . get ( name . toLowerCase ( ) ) ;
2016-12-05 04:21:04 +01:00
}
@Override
2021-06-06 07:28:22 +02:00
public SubServer constructSubServer ( String name , boolean enabled , int port , String motd , boolean log , String directory , String executable , String stopcmd , boolean hidden , boolean restricted ) throws InvalidServerException {
return InternalSubServer . construct ( this , name , enabled , port , motd , log , directory , executable , stopcmd , hidden , restricted ) ;
}
@Override
public boolean addSubServer ( UUID player , SubServer server ) throws InvalidServerException {
if ( server . getHost ( ) ! = this ) throw new IllegalArgumentException ( " That Server does not belong to this Host! " ) ;
if ( plugin . api . getServers ( ) . keySet ( ) . contains ( server . getName ( ) . toLowerCase ( ) ) ) throw new InvalidServerException ( " A Server already exists with this name! " ) ;
2016-12-15 22:04:39 +01:00
SubAddServerEvent event = new SubAddServerEvent ( player , this , server ) ;
plugin . getPluginManager ( ) . callEvent ( event ) ;
if ( ! event . isCancelled ( ) ) {
2021-06-06 07:28:22 +02:00
servers . put ( server . getName ( ) . toLowerCase ( ) , server ) ;
if ( UPnP . isUPnPAvailable ( ) & & plugin . config . get ( ) . getMap ( " Settings " ) . getMap ( " UPnP " , new ObjectMap < String > ( ) ) . getBoolean ( " Forward-Servers " , false ) ) UPnP . openPortTCP ( server . getAddress ( ) . getPort ( ) ) ;
return true ;
2016-12-15 22:04:39 +01:00
} else {
2021-06-06 07:28:22 +02:00
return false ;
2016-12-15 22:04:39 +01:00
}
2016-12-05 04:21:04 +01:00
}
@Override
2020-08-14 00:26:22 +02:00
protected boolean removeSubServer ( UUID player , String name , boolean forced ) throws InterruptedException {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( name ) ) throw new NullPointerException ( ) ;
2020-06-12 07:45:49 +02:00
SubServer server = servers . get ( name . toLowerCase ( ) ) ;
SubRemoveServerEvent event = new SubRemoveServerEvent ( player , this , server ) ;
2016-12-20 00:31:01 +01:00
plugin . getPluginManager ( ) . callEvent ( event ) ;
2020-08-14 00:26:22 +02:00
if ( forced | | ! event . isCancelled ( ) ) {
2020-06-12 07:45:49 +02:00
if ( server . isRunning ( ) ) {
server . stop ( ) ;
server . waitFor ( ) ;
2016-12-20 00:31:01 +01:00
}
2021-02-07 05:53:03 +01:00
servers . remove ( name . toLowerCase ( ) ) ;
2020-06-12 07:45:49 +02:00
if ( UPnP . isUPnPAvailable ( ) & & UPnP . isMappedTCP ( server . getAddress ( ) . getPort ( ) ) )
UPnP . closePortTCP ( server . getAddress ( ) . getPort ( ) ) ;
2016-12-20 00:31:01 +01:00
return true ;
} else return false ;
2016-12-05 04:21:04 +01:00
}
2019-04-18 16:02:09 +02:00
@Override
2020-08-16 20:30:36 +02:00
protected boolean recycleSubServer ( UUID player , String name , boolean forced ) throws InterruptedException {
return recycleSubServer ( player , name , forced , true ) ;
2020-08-14 00:26:22 +02:00
}
2020-08-16 20:30:36 +02:00
/ * *
* Deletes a SubServer ( will move to ' Recently Deleted ' )
*
* @param player Player Deleting
* @param name SubServer Name
* @param forced Forces the Deletion
* @param multithreading Uses Multithreading for I / O
* @return Success Status
* /
2020-08-14 00:26:22 +02:00
protected boolean recycleSubServer ( UUID player , String name , boolean forced , boolean multithreading ) throws InterruptedException {
2019-04-18 16:02:09 +02:00
if ( Util . isNull ( name ) ) throw new NullPointerException ( ) ;
String server = servers . get ( name . toLowerCase ( ) ) . getName ( ) ;
File from = new File ( getPath ( ) , servers . get ( server . toLowerCase ( ) ) . getPath ( ) ) ;
2020-08-14 00:26:22 +02:00
if ( removeSubServer ( player , server , forced ) ) {
Runnable method = ( ) - > {
2019-04-18 16:02:09 +02:00
UniversalFile to = new UniversalFile ( plugin . dir , " SubServers:Recently Deleted: " + server . toLowerCase ( ) ) ;
try {
if ( from . exists ( ) ) {
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Moving Files... " ) ;
2019-04-18 16:02:09 +02:00
if ( to . exists ( ) ) {
if ( to . isDirectory ( ) ) Util . deleteDirectory ( to ) ;
else to . delete ( ) ;
}
to . mkdirs ( ) ;
Util . copyDirectory ( from , to ) ;
Util . deleteDirectory ( from ) ;
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Saving... " ) ;
2019-04-29 17:05:06 +02:00
YAMLSection info = ( plugin . servers . get ( ) . getMap ( " Servers " ) . getKeys ( ) . contains ( server ) ) ? new YAMLSection ( plugin . servers . get ( ) . getMap ( " Servers " ) . getMap ( server ) . get ( ) ) : new YAMLSection ( ) ;
2019-04-18 16:02:09 +02:00
info . set ( " Name " , server ) ;
info . set ( " Timestamp " , Calendar . getInstance ( ) . getTime ( ) . getTime ( ) ) ;
try {
2019-04-29 17:05:06 +02:00
if ( plugin . servers . get ( ) . getMap ( " Servers " ) . getKeys ( ) . contains ( server ) ) {
plugin . servers . get ( ) . getMap ( " Servers " ) . remove ( server ) ;
plugin . servers . save ( ) ;
2019-04-18 16:02:09 +02:00
}
if ( ! to . exists ( ) ) to . mkdirs ( ) ;
FileWriter writer = new FileWriter ( new File ( to , " info.json " ) , false ) ;
writer . write ( info . toJSON ( ) . toString ( ) ) ;
writer . close ( ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Deleted SubServer: " + server ) ;
2020-08-14 00:26:22 +02:00
} ;
if ( multithreading ) {
new Thread ( method , " SubServers.Bungee::Internal_Server_Recycler( " + name + ')' ) . start ( ) ;
} else method . run ( ) ;
2019-04-18 16:02:09 +02:00
return true ;
} else return false ;
}
2017-04-01 18:50:09 +02:00
@Override
2020-08-16 20:30:36 +02:00
protected boolean deleteSubServer ( UUID player , String name , boolean forced ) throws InterruptedException {
return deleteSubServer ( player , name , forced , true ) ;
2020-08-14 00:26:22 +02:00
}
2020-08-16 20:30:36 +02:00
/ * *
* Deletes a SubServer
*
* @param player Player Deleting
* @param name SubServer Name
* @param forced Forces the Deletion
* @param multithreading Uses Multithreading for I / O
* @return Success Status
* /
2020-08-14 00:26:22 +02:00
protected boolean deleteSubServer ( UUID player , String name , boolean forced , boolean multithreading ) throws InterruptedException {
2017-04-24 18:28:16 +02:00
if ( Util . isNull ( name ) ) throw new NullPointerException ( ) ;
String server = servers . get ( name . toLowerCase ( ) ) . getName ( ) ;
File from = new File ( getPath ( ) , servers . get ( server . toLowerCase ( ) ) . getPath ( ) ) ;
2020-08-14 00:26:22 +02:00
if ( removeSubServer ( player , server , forced ) ) {
Runnable method = ( ) - > {
2017-04-24 18:28:16 +02:00
try {
if ( from . exists ( ) ) {
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Removing Files... " ) ;
2018-03-14 08:01:44 +01:00
Util . deleteDirectory ( from ) ;
2017-04-24 18:28:16 +02:00
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Saving... " ) ;
2017-04-01 18:50:09 +02:00
try {
2019-04-29 17:05:06 +02:00
if ( plugin . servers . get ( ) . getMap ( " Servers " ) . getKeys ( ) . contains ( server ) ) {
plugin . servers . get ( ) . getMap ( " Servers " ) . remove ( server ) ;
plugin . servers . save ( ) ;
2017-04-01 18:50:09 +02:00
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2019-05-17 00:36:41 +02:00
Logger . get ( " SubServers " ) . info ( " Deleted SubServer: " + server ) ;
2020-08-14 00:26:22 +02:00
} ;
if ( multithreading ) {
new Thread ( method , " SubServers.Bungee::Internal_Server_Deletion( " + name + ')' ) . start ( ) ;
} else method . run ( ) ;
2017-04-01 18:50:09 +02:00
return true ;
} else return false ;
}
2016-12-05 04:21:04 +01:00
}