package magic.ui.screen.duel.game; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Path; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import magic.game.state.GameState; import magic.game.state.GameStateFileWriter; import magic.game.state.GameStateSnapshot; import magic.model.MagicGame; import magic.model.MagicGameLog; import magic.ui.ScreenController; import magic.ui.helpers.DesktopHelper; import magic.ui.helpers.ImageHelper; import magic.utility.MagicFileSystem; import org.apache.commons.io.FileUtils; final class GameplayReport { private GameplayReport() {} // jpg : small size, lower quality than png. // png : much bigger size, slightly better quality than jpg. private static final String IMAGE_TYPE = "jpg"; private static final String SCREEN_FILE = "screenshot." + IMAGE_TYPE; private static final String GAME_FILE = "snapshot.game"; private static final String LOG_FILE = MagicGameLog.LOG_FILE; private static final String ZIP_FILE = "gameplay-report.zip"; static void createNewReport(final MagicGame aGame) throws IOException { MagicFileSystem.clearGameplayReportDirectory(); saveScreenshot(); saveGameState(aGame); saveGameLog(); createZipFile(); } private static void saveScreenshot() throws IOException { final Path filePath = MagicFileSystem.getGameplayReportDirectory().resolve(SCREEN_FILE); ImageHelper.doScreenshotToFile(ScreenController.getFrame().getContentPane(), filePath, IMAGE_TYPE); } private static void saveGameState(MagicGame aGame) { final File file = MagicFileSystem.getGameplayReportDirectory().resolve(GAME_FILE).toFile(); final GameState gameState = GameStateSnapshot.getGameState(aGame); GameStateFileWriter.createSaveGameFile(gameState, file); } private static void saveGameLog() throws IOException { final File logFile = MagicFileSystem.getDataPath(MagicFileSystem.DataPath.LOGS).resolve(LOG_FILE).toFile(); FileUtils.copyFileToDirectory(logFile, MagicFileSystem.getGameplayReportDirectory().toFile()); } static void openReportDirectory() throws IOException { DesktopHelper.openDirectory(MagicFileSystem.getDataPath(MagicFileSystem.DataPath.REPORTS).toString()); } private static void createZipFile() throws IOException { final byte[] buf = new byte[1024]; final String[] filenames = new String[]{SCREEN_FILE, GAME_FILE, LOG_FILE}; final File zipFile = MagicFileSystem.getDataPath(MagicFileSystem.DataPath.REPORTS).resolve(ZIP_FILE).toFile(); try (final ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))) { for (String filename : filenames) { final File f = MagicFileSystem.getGameplayReportDirectory().resolve(filename).toFile(); try (final FileInputStream in = new FileInputStream(f)) { out.putNextEntry(new ZipEntry(filename)); int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } out.closeEntry(); } } } } }