package com.faforever.client.mod;
import com.faforever.client.api.FafApiAccessor;
import com.faforever.client.i18n.I18n;
import com.faforever.client.io.ByteCountListener;
import com.faforever.client.io.Zipper;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.task.CompletableTask;
import com.faforever.client.task.ResourceLocks;
import com.faforever.client.util.Validator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
import java.io.BufferedOutputStream;
import java.lang.invoke.MethodHandles;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Locale;
import java.util.zip.ZipOutputStream;
import static com.faforever.client.io.Bytes.formatSize;
import static java.nio.file.Files.createTempFile;
import static java.nio.file.Files.newOutputStream;
public class ModUploadTask extends CompletableTask<Void> {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@Resource
PreferencesService preferencesService;
@Resource
FafApiAccessor fafApiAccessor;
@Resource
I18n i18n;
private Path modPath;
public ModUploadTask() {
super(Priority.HIGH);
}
@Override
protected Void call() throws Exception {
Validator.notNull(modPath, "modPath must not be null");
ResourceLocks.acquireUploadLock();
Path cacheDirectory = preferencesService.getCacheDirectory();
Files.createDirectories(cacheDirectory);
Path tmpFile = createTempFile(cacheDirectory, "mod", ".zip");
try {
logger.debug("Zipping mod {} to {}", modPath, tmpFile);
updateTitle(i18n.get("modVault.upload.compressing"));
Locale locale = i18n.getLocale();
ByteCountListener byteListener = (written, total) -> {
updateMessage(i18n.get("bytesProgress", formatSize(written, locale), formatSize(total, locale)));
updateProgress(written, total);
};
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(newOutputStream(tmpFile)))) {
Zipper.of(modPath)
.to(zipOutputStream)
.listener(byteListener)
.zip();
}
logger.debug("Uploading mod {} as {}", modPath, tmpFile);
updateTitle(i18n.get("modVault.upload.uploading"));
fafApiAccessor.uploadMod(tmpFile, byteListener);
return null;
} finally {
Files.delete(tmpFile);
ResourceLocks.freeUploadLock();
}
}
public void setModPath(Path modPath) {
this.modPath = modPath;
}
}