diff --git a/src/main/java/com/alterdekim/hearthhack/component/StartupListener.java b/src/main/java/com/alterdekim/hearthhack/component/StartupListener.java index 237718e..2797909 100644 --- a/src/main/java/com/alterdekim/hearthhack/component/StartupListener.java +++ b/src/main/java/com/alterdekim/hearthhack/component/StartupListener.java @@ -1,6 +1,7 @@ package com.alterdekim.hearthhack.component; import com.alterdekim.hearthhack.config.DBFConfig; +import com.alterdekim.hearthhack.config.FS; import com.alterdekim.hearthhack.config.ServerConfig; import com.alterdekim.hearthhack.parser.CardsXmlParser; import com.alterdekim.hearthhack.parser.DBFParser; @@ -10,8 +11,10 @@ import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; -import java.nio.file.Files; -import java.nio.file.Path; +import java.io.File; +import java.io.IOException; +import java.nio.file.*; +import java.util.Map; @Slf4j @Component @@ -26,7 +29,6 @@ public class StartupListener { @EventListener public void onApplicationEvent(ContextRefreshedEvent event) { try { - dbfConfig.setCards(DBFParser.parseCards(serverConfig.getDbfPath())); dbfConfig.setClientConfig( new String( Files.readAllBytes( @@ -36,9 +38,48 @@ public class StartupListener { ) ) ); - log.info("CardsXmlMap: {}", CardsXmlParser.parse(serverConfig.getCardsXmlPath())); + if( serverConfig.getWorkDir() == null ) serverConfig.setWorkDir(new File(".").getCanonicalPath()); + makeDir(FS.xmlDir); + makeDir(FS.pluginsDir); + makeDir(FS.dbDir); + // TODO: make a auto-mkdir using reflection of interface + if( !Path.of(serverConfig.getWorkDir() + File.separator + FS.dbfDir).toFile().exists() ) initDbf(); + if( !Path.of(serverConfig.getWorkDir() + File.separator + FS.dataDir).toFile().exists() ) initXml(); + dbfConfig.setCards(DBFParser.parseCards(serverConfig.getWorkDir() + File.separator + FS.dbfDir)); } catch (Exception e) { log.error(e.getMessage()); } } + + private void initDbf() throws Exception { + makeDir(FS.dbfDir); + Files.walk(Path.of(serverConfig.getDbfPath())) + .map(Path::toFile) + .filter(f -> f.isFile() && f.getName().endsWith("xml")) + .forEach(f -> { + try { + Files.copy(f.toPath(), Path.of(serverConfig.getWorkDir() + File.separator + FS.dbfDir + File.separator + f.getName())); + } catch (IOException e) { + log.error(e.getMessage()); + } + }); + } + + private void initXml() throws IOException { + makeDir(FS.dataDir); + Map m = CardsXmlParser.parse(serverConfig.getCardsXmlPath()); + m.keySet().forEach(k -> { + try { + Path p = Path.of(serverConfig.getWorkDir()+File.separator+FS.dataDir+File.separator+k+".xml"); + Files.createFile(p); + Files.write(p, m.get(k).getBytes(), StandardOpenOption.WRITE); + } catch (IOException e) { + log.error(e.getMessage()); + } + }); + } + + private boolean makeDir(String dirName) { + return Path.of(serverConfig.getWorkDir() + File.separator + dirName).toFile().mkdirs(); + } } \ No newline at end of file diff --git a/src/main/java/com/alterdekim/hearthhack/config/FS.java b/src/main/java/com/alterdekim/hearthhack/config/FS.java new file mode 100644 index 0000000..9498c60 --- /dev/null +++ b/src/main/java/com/alterdekim/hearthhack/config/FS.java @@ -0,0 +1,12 @@ +package com.alterdekim.hearthhack.config; + +public interface FS { + String xmlDir = "xml"; + String pluginsDir = "plugins"; + String dbDir = "db"; + String dbfDir = xmlDir + "/dbf"; + String dataDir = xmlDir + "/data"; + String propertiesFilename = "server.properties"; + String eulaFilename = "eula.txt"; + String internalSettingsFilename = "flame.yml"; +} diff --git a/src/main/java/com/alterdekim/hearthhack/config/ServerConfig.java b/src/main/java/com/alterdekim/hearthhack/config/ServerConfig.java index 2c5f346..3810461 100644 --- a/src/main/java/com/alterdekim/hearthhack/config/ServerConfig.java +++ b/src/main/java/com/alterdekim/hearthhack/config/ServerConfig.java @@ -13,4 +13,5 @@ public class ServerConfig { @Value("${hearthhack.game_port}") private Integer gamePort; @Value("${hearthhack.host}") private String host; @Value("${hearthhack.cards_xml_path}") private String cardsXmlPath; + @Value("${hearthhack.work_dir}") private String workDir; } diff --git a/src/main/java/com/alterdekim/hearthhack/parser/CardsXmlParser.java b/src/main/java/com/alterdekim/hearthhack/parser/CardsXmlParser.java index 1b4f22c..cf0b236 100644 --- a/src/main/java/com/alterdekim/hearthhack/parser/CardsXmlParser.java +++ b/src/main/java/com/alterdekim/hearthhack/parser/CardsXmlParser.java @@ -1,6 +1,5 @@ package com.alterdekim.hearthhack.parser; -import com.alterdekim.hearthhack.util.Util; import java.io.IOException; import java.nio.file.Files; @@ -9,11 +8,12 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; + public class CardsXmlParser { - private static final byte[] cardDef = Util.hexStringToByteArray("3C43617264446566733E"); + private static final byte[] cardDef = "".getBytes(); - private static final byte[] cardDefEnd = Util.hexStringToByteArray("3C2F43617264446566733E"); + private static final byte[] cardDefEnd = "".getBytes(); public static Map parse(String path) throws IOException { Map m = new HashMap<>(); @@ -24,7 +24,7 @@ public class CardsXmlParser { a = Arrays.copyOfRange(b, i-8, i-4); int f = findFirst(b, i); m.put(new String(a), new String(Arrays.copyOfRange(b, i, f))); - i += f; + i = f; } } return m;