package com.faforever.client.replay;
import com.faforever.client.i18n.I18n;
import com.faforever.client.io.Bytes;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.remote.io.QtCompress;
import com.google.common.io.BaseEncoding;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
import javax.annotation.Resource;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.nio.file.Files;
import java.nio.file.Path;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.nio.file.StandardOpenOption.CREATE_NEW;
public class ReplayFileWriterImpl implements ReplayFileWriter {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private final Gson gson;
@Resource
Environment environment;
@Resource
PreferencesService preferencesService;
@Resource
I18n i18n;
public ReplayFileWriterImpl() {
gson = ReplayFiles.gson();
}
@Override
public void writeReplayDataToFile(ByteArrayOutputStream replayData, LocalReplayInfo replayInfo) throws IOException {
String fileName = String.format(environment.getProperty("replayFileFormat"), replayInfo.getUid(), replayInfo.getRecorder());
Path replayFile = preferencesService.getReplaysDirectory().resolve(fileName);
logger.info("Writing replay file to {} ({})", replayFile, Bytes.formatSize(replayData.size(), i18n.getLocale()));
Files.createDirectories(replayFile.getParent());
try (BufferedWriter writer = Files.newBufferedWriter(replayFile, UTF_8, CREATE_NEW)) {
byte[] compressedBytes = QtCompress.qCompress(replayData.toByteArray());
String base64ReplayData = BaseEncoding.base64().encode(compressedBytes);
gson.toJson(replayInfo, writer);
writer.write('\n');
writer.write(base64ReplayData);
}
}
}