package jo.sm.factories.all.macro; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; import jo.sm.logic.StarMadeLogic; import jo.sm.logic.utils.FileUtils; import jo.sm.logic.utils.IntegerUtils; import jo.sm.logic.utils.StringUtils; import jo.sm.mods.IBlocksPlugin; import jo.sm.mods.IStarMadePlugin; import jo.sm.mods.IStarMadePluginFactory; import jo.util.Paths; public class MacroFactory implements IStarMadePluginFactory { private static final Logger log = Logger.getLogger(MacroFactory.class.getName()); private long mLastLoad; private File mMacroDir; private final List<MacroDefinition> mDefs; private final List<IStarMadePlugin> mPlugins; public MacroFactory() { this.mDefs = new ArrayList<>(); this.mPlugins = new ArrayList<>(); } @Override public IStarMadePlugin[] getPlugins() { updateDefinitions(); return mPlugins.toArray(new IStarMadePlugin[0]); } private void updatePlugins() { for (MacroDefinition fd : mDefs) { mPlugins.add(new MacroPlugin(fd)); } } private void updateDefinitions() { if (mMacroDir == null) { File plugins = new File(Paths.getPluginsDirectory()); mMacroDir = new File(plugins, "macros"); } if (mMacroDir.lastModified() < mLastLoad) { return; } mDefs.clear(); mPlugins.clear(); if (!mMacroDir.exists()) { return; } File[] macros = mMacroDir.listFiles(); if (macros == null) { return; } for (File macro : macros) { addMacro(macro); } updatePlugins(); } private void addMacro(File macroFile) { try { if (!macroFile.getName().endsWith(".js")) { return; } String macroText = FileUtils.readFileAsString(macroFile.toString()); MacroDefinition def = new MacroDefinition(); def.setScript(macroFile); def.setTitle(StringUtils.extract(macroText, "Name:", "\n").trim()); if (StringUtils.isTrivial(def.getTitle())) { return; } def.setDescription(StringUtils.extract(macroText, "DescriptionStart", "DescriptionEnd").trim()); def.setAuthor(StringUtils.extract(macroText, "Author:", "\n").trim()); List<String> sClassifications = new ArrayList<>(); extractArray(macroText, "Classification:", "\n", sClassifications); List<int[]> aClassifications = new ArrayList<>(); for (String classification : sClassifications) { classification = classification.trim(); StringTokenizer st = new StringTokenizer(classification, " "); if (st.countTokens() < 2) { continue; } int enablement = parseEnablement(st.nextToken()); if (enablement < 0) { continue; } int placement = parsePlacement(st.nextToken()); if (placement < 0) { continue; } if (st.hasMoreTokens()) { aClassifications.add(new int[]{enablement, placement, IntegerUtils.parseInt(st.nextToken())}); } else { aClassifications.add(new int[]{enablement, placement}); } } if (aClassifications.isEmpty()) { return; } def.setClassifications(aClassifications.toArray(new int[0][])); mDefs.add(def); } catch (IOException e) { log.log(Level.WARNING, "macroFile failed!", e); } } private void extractArray(String macroText, String prefix, String suffix, List<String> array) { int o = macroText.indexOf(prefix); if (o < 0) { return; } macroText = macroText.substring(o + prefix.length()); o = macroText.indexOf(suffix); if (o < 0) { return; } array.add(macroText.substring(0, o)); macroText = macroText.substring(o + suffix.length()); extractArray(macroText, prefix, suffix, array); } private int parseEnablement(String str) { if (str.equalsIgnoreCase("all")) { return IBlocksPlugin.TYPE_ALL; } if (str.equalsIgnoreCase("floatingrock")) { return IBlocksPlugin.TYPE_FLOATINGROCK; } if (str.equalsIgnoreCase("planet")) { return IBlocksPlugin.TYPE_PLANET; } if (str.equalsIgnoreCase("ship")) { return IBlocksPlugin.TYPE_SHIP; } if (str.equalsIgnoreCase("shop")) { return IBlocksPlugin.TYPE_SHOP; } if (str.equalsIgnoreCase("station")) { return IBlocksPlugin.TYPE_STATION; } return -1; } private int parsePlacement(String str) { if (str.equalsIgnoreCase("edit")) { return IBlocksPlugin.SUBTYPE_EDIT; } if (str.equalsIgnoreCase("file")) { return IBlocksPlugin.SUBTYPE_FILE; } if (str.equalsIgnoreCase("generate")) { return IBlocksPlugin.SUBTYPE_GENERATE; } if (str.equalsIgnoreCase("modify")) { return IBlocksPlugin.SUBTYPE_MODIFY; } if (str.equalsIgnoreCase("paint")) { return IBlocksPlugin.SUBTYPE_PAINT; } if (str.equalsIgnoreCase("view")) { return IBlocksPlugin.SUBTYPE_VIEW; } return -1; } }