2013-12-14 06:00:56 +01:00
package mineplex.bungee ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FilenameFilter ;
import java.io.IOException ;
import java.util.HashMap ;
import java.util.concurrent.TimeUnit ;
import net.md_5.bungee.BungeeCord ;
import net.md_5.bungee.api.ChatColor ;
import net.md_5.bungee.api.plugin.Plugin ;
import org.apache.commons.codec.digest.DigestUtils ;
public class FileUpdater implements Runnable
{
private Plugin _plugin ;
private HashMap < String , String > _jarMd5Map = new HashMap < String , String > ( ) ;
2014-08-08 23:35:37 +02:00
2013-12-14 06:00:56 +01:00
private boolean _needUpdate ;
private boolean _enabled = true ;
2014-04-25 09:44:14 +02:00
private int _timeTilRestart = 5 ;
2013-12-14 06:00:56 +01:00
public FileUpdater ( Plugin plugin )
{
_plugin = plugin ;
getPluginMd5s ( ) ;
if ( new File ( " IgnoreUpdates.dat " ) . exists ( ) )
_enabled = false ;
_plugin . getProxy ( ) . getScheduler ( ) . schedule ( _plugin , this , 2L , 2L , TimeUnit . MINUTES ) ;
}
public void checkForNewFiles ( )
{
if ( _needUpdate | | ! _enabled )
return ;
boolean windows = System . getProperty ( " os.name " ) . startsWith ( " Windows " ) ;
File updateDir = new File ( ( windows ? " C: " : File . separator + " home " + File . separator + " mineplex " ) + File . separator + " update " ) ;
updateDir . mkdirs ( ) ;
FilenameFilter statsFilter = new FilenameFilter ( )
{
public boolean accept ( File paramFile , String paramString )
{
if ( paramString . endsWith ( " jar " ) )
{
return true ;
}
return false ;
}
} ;
for ( File f : updateDir . listFiles ( statsFilter ) )
{
FileInputStream fis = null ;
try
{
if ( _jarMd5Map . containsKey ( f . getName ( ) ) )
{
fis = new FileInputStream ( f ) ;
String md5 = DigestUtils . md5Hex ( fis ) ;
if ( ! md5 . equals ( _jarMd5Map . get ( f . getName ( ) ) ) )
{
System . out . println ( f . getName ( ) + " old jar : " + _jarMd5Map . get ( f . getName ( ) ) ) ;
System . out . println ( f . getName ( ) + " new jar : " + md5 ) ;
_needUpdate = true ;
}
}
}
catch ( Exception ex )
{
ex . printStackTrace ( ) ;
}
finally
{
if ( fis ! = null )
{
try
{
fis . close ( ) ;
}
catch ( IOException e )
{
e . printStackTrace ( ) ;
}
}
}
}
}
private void getPluginMd5s ( )
{
File pluginDir = new File ( " plugins " ) ;
pluginDir . mkdirs ( ) ;
FilenameFilter statsFilter = new FilenameFilter ( )
{
public boolean accept ( File paramFile , String paramString )
{
if ( paramString . endsWith ( " jar " ) )
{
return true ;
}
return false ;
}
} ;
for ( File f : pluginDir . listFiles ( statsFilter ) )
{
FileInputStream fis = null ;
try
{
fis = new FileInputStream ( f ) ;
_jarMd5Map . put ( f . getName ( ) , DigestUtils . md5Hex ( fis ) ) ;
}
catch ( Exception ex )
{
ex . printStackTrace ( ) ;
}
finally
{
if ( fis ! = null )
{
try
{
fis . close ( ) ;
}
catch ( IOException e )
{
e . printStackTrace ( ) ;
}
}
}
}
}
@Override
public void run ( )
{
checkForNewFiles ( ) ;
if ( _needUpdate )
{
BungeeCord . getInstance ( ) . broadcast ( ChatColor . RED + " Connection Node " + ChatColor . DARK_GRAY + " > " + ChatColor . YELLOW + " This connection node will be restarting in " + _timeTilRestart + " minutes. " ) ;
}
else
{
return ;
}
_timeTilRestart - = 2 ;
if ( _timeTilRestart < 0 | | ! _enabled )
{
BungeeCord . getInstance ( ) . stop ( ) ;
}
}
}