//FIXME Изменить порядок проверки клиента
package org.sinrel.engine.actions;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import java.util.ArrayList;
import org.sinrel.engine.Engine;
import org.sinrel.engine.library.NetManager;
import org.sinrel.engine.library.OSManager;
import org.sinrel.engine.library.OSManager.OS;
import org.sinrel.engine.library.cryption.MD5;
public class DefaultChecker extends Checker {
// Проверяемые файлы. Так же проверяется наличие natives под систему клиента
static String[] files = { "jinput.jar", "lwjgl.jar", "lwjgl_util.jar", "minecraft.jar" };
private Engine engine;
private String clientName, folder;
public ClientStatus checkClient( Engine e, String clientName ) {
try {
clientName = clientName.toLowerCase();
String applicationName = e.getSettings().getDirectory();
this.engine = e;
if (!NetManager.isOnline()) {
return ClientStatus.BAD_CONNECTION;
}
if (!OSManager.getWorkingDirectory(applicationName).exists() | !OSManager.getClientFolder(applicationName , clientName).exists()) {
return ClientStatus.CLIENT_NOT_EXIST;
}
StringBuffer hash = new StringBuffer();
File f = null;
for (String name : files) {
f = new File( OSManager.getClientFolder(applicationName, clientName ), name);
if (!f.exists()) {
return ClientStatus.WRONG_CLIENT;
}
hash.append( MD5.getMD5(f) );
}
return send( clientName , hash.toString(), OSManager.getPlatform() );
} catch ( IOException ex ) {
ex.printStackTrace();
return ClientStatus.CLIENT_DOES_NOT_MATCH;
}
}
private ClientStatus send(String client, String hash, OS system) {
try {
String data = "action=" + URLEncoder.encode("check", "UTF-8");
data += "&client=" + URLEncoder.encode(client, "UTF-8");
data += "&hash=" + URLEncoder.encode(hash, "UTF-8");
data += "&system=" + URLEncoder.encode(system.toString(), "UTF-8");
String s = NetManager.sendPostRequest( NetManager.getEngineLink( engine ) , data);
return ClientStatus.valueOf(s.trim());
} catch (IOException e) {
e.printStackTrace();
return ClientStatus.BAD_CONNECTION;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return ClientStatus.BAD_CONNECTION;
}
}
public LauncherData getLauncherData( Engine engine ) {
LauncherData laun = null;
try{
String answer = NetManager.sendPostRequest( NetManager.getEngineLink( engine ), "action=launcher");
if( engine.isDebug() )
System.out.println( answer );
laun = new LauncherData( Integer.parseInt( answer.split("<:>")[0] ) , answer.split("<:>")[1] );
return laun;
}catch( MalformedURLException e ) {
e.printStackTrace();
}catch( IOException e ) {
e.printStackTrace();
}
return laun;
}
public DirectoryStatus checkMods( Engine engine, String clientName ) {
this.clientName = clientName;
this.folder = "mods";
try {
File directory = new File( OSManager.getWorkingDirectory(engine) + File.separator + clientName, this.folder );
String data;
if( !directory.exists() ) {
data = generateData( "not_exist" );
String answer = NetManager.sendPostRequest( NetManager.getEngineLink( engine ) , data );
if( engine.isDebug() )
System.out.println( answer );
if ( answer.equals( "OK" ) )
return DirectoryStatus.OK;
else
if( answer.equals( "DIRECTORY_DOES_NOT_MATCH" ) )
return DirectoryStatus.DIRECTORY_DOES_NOT_MATCH;
}else{
ArrayList< File > files = new ArrayList< File >();
for ( File f : directory.listFiles() ) {
if( f.isFile() ) {
files.add( f );
}
}
String answer = NetManager.sendPostRequest( NetManager.getEngineLink( engine ) , generateData( "count", Integer.toString( files.size() ) ) );
if( engine.isDebug() )
System.out.println( answer );
if( answer.contains( "DIRECTORY_DOES_NOT_MATCH" ) )
return DirectoryStatus.DIRECTORY_DOES_NOT_MATCH;
//TODO сделать сборку хеша и сверку с сгенерированным на сервере
return DirectoryStatus.OK;
}
}catch( Exception e ) {
e.printStackTrace();
return DirectoryStatus.BAD_CONNECTION;
}
return DirectoryStatus.DIRECTORY_DOES_NOT_MATCH;
}
@Deprecated
public DirectoryStatus checkDirectory( Engine engine, String clientName, String directoryName ) {
//TODO Реализовать метод
return null;
}
private String generateData( String data ) {
return "action=directory&folder=" + this.folder + "&client=" + this.clientName + "&data=" + data;
}
private String generateData( String data, String option ) {
return "action=directory&folder=" + this.folder + "&client=" + this.clientName + "&data=" + data + "&option=" + option;
}
}