package jk_5.nailed.plugins.nmm;
import io.netty.util.concurrent.Promise;
import jk_5.nailed.api.mappack.Mappack;
import jk_5.nailed.api.mappack.filesystem.DirectoryMount;
import jk_5.nailed.api.mappack.filesystem.IMount;
import jk_5.nailed.api.mappack.metadata.MappackMetadata;
import jk_5.nailed.server.mappack.metadata.xml.XmlMappackMetadata;
import jk_5.nailed.server.utils.ZipUtils;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class NmmMappack implements Mappack {
private final String path;
private File dir;
private MappackMetadata metadata;
public NmmMappack(String path) {
this.path = path;
}
@Override
public String getId() {
return path;
}
@Nonnull
@Override
public MappackMetadata getMetadata() {
return metadata;
}
@Override
public void prepareWorld(@Nonnull File destinationDirectory, @Nonnull Promise<Void> promise) {
destinationDirectory.mkdir();
HttpClient httpClient = HttpClientBuilder.create().build();
try{
String mappack = path.split("/", 2)[1];
HttpGet request = new HttpGet("http://nmm.jk-5.nl/" + path + "/versions.json");
HttpResponse response = httpClient.execute(request);
MappackInfo list = NmmPlugin.gson.fromJson(EntityUtils.toString(response.getEntity(), "UTF-8"), MappackInfo.class);
HttpGet request2 = new HttpGet("http://nmm.jk-5.nl/" + path + "/" + mappack + "-" + list.latest + ".zip");
HttpEntity response2 = httpClient.execute(request2).getEntity();
if(response2 != null){
File mappackZip = new File(destinationDirectory, "mappack.zip");
InputStream is = response2.getContent();
OutputStream os = new FileOutputStream(mappackZip);
IOUtils.copy(is, os);
os.close();
ZipUtils.extract(mappackZip, destinationDirectory);
mappackZip.delete();
dir = destinationDirectory;
File dataDir = new File(destinationDirectory, ".data");
dataDir.mkdir();
File metadataLocation = new File(dataDir, "game.xml");
new File(destinationDirectory, "game.xml").renameTo(metadataLocation);
new File(destinationDirectory, "scripts").renameTo(new File(dataDir, "scripts"));
File worldsDir = new File(destinationDirectory, "worlds");
for(File f : worldsDir.listFiles()){
f.renameTo(new File(destinationDirectory, f.getName()));
}
worldsDir.delete();
metadata = XmlMappackMetadata.fromFile(metadataLocation);
promise.setSuccess(null);
}else{
promise.setFailure(new RuntimeException("Got an empty response while downloading mappack " + path + " from nmm.jk-5.nl"));
}
}catch(Exception e){
promise.setFailure(new RuntimeException("Was not able to download mappack " + path + " from nmm.jk-5.nl", e));
}
}
@Nullable
@Override
public IMount getMappackMount() {
return new DirectoryMount(new File(new File(dir, ".data"), "scripts"));
}
}