/*
* SK's Minecraft Launcher
* Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
* Please see LICENSE.txt for license information.
*/
package com.skcraft.launcher.creator.model.swing;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.skcraft.launcher.creator.model.creator.ManifestEntry;
import com.skcraft.launcher.model.modpack.ManifestInfo;
import com.skcraft.launcher.model.modpack.PackageList;
import com.skcraft.launcher.persistence.Persistence;
import lombok.Getter;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
public enum ListingType {
STATIC("packages.json (static)", false, "packages.json") {
@Override
public String generate(List<ManifestEntry> entries) throws IOException {
PackageList list = new PackageList();
list.setPackages(Lists.newArrayList());
list.setMinimumVersion(PackageList.MIN_VERSION);
for (ManifestEntry entry : entries) {
if (entry.getGameKeys().isEmpty()) {
list.getPackages().add(entry.getManifestInfo());
}
}
return Persistence.writeValueAsString(list, Persistence.L2F_LIST_PRETTY_PRINTER);
}
},
PHP("packages.php (requires PHP on web server) ", true, "packages.php") {
@Override
public String generate(List<ManifestEntry> entries) throws IOException {
StringBuilder builder = new StringBuilder();
builder.append("<?php\r\n");
builder.append("$keys = isset($_GET['key']) ? array_map('trim', explode(',', strtolower($_GET['key']))) : array();\r\n");
builder.append("$packages = array();\r\n\r\n");
for (ManifestEntry entry : entries) {
ManifestInfo info = entry.getManifestInfo();
List<String> keys = entry.getGameKeys();
if (!keys.isEmpty()) {
builder.append("if (count(array_intersect(array(").append(escapeKeys(keys)).append("), $keys)) > 0)\r\n");
}
builder.append("$packages[] = array(\r\n");
builder.append(" 'name' => '").append(escape(info.getName())).append("',\r\n");
if (info.getTitle() != null) {
builder.append(" 'title' => '").append(escape(info.getTitle())).append("',\r\n");
}
builder.append(" 'version' => '").append(escape(info.getVersion())).append("',\r\n");
builder.append(" 'priority' => ").append(info.getPriority()).append(",\r\n");
builder.append(" 'location' => '").append(escape(info.getLocation())).append("',\r\n");
builder.append(");\r\n\r\n");
}
builder.append("$out = array('minimumVersion' => ").append(PackageList.MIN_VERSION).append(", 'packages' => $packages);\r\n");
builder.append("header('Content-Type: text/plain; charset=utf-8');\r\n");
builder.append("echo json_encode($out);\r\n");
return builder.toString();
}
private String escape(String t) {
return t.replaceAll("[\\\\\"']", "\\$0").replace("\r", "\\r").replace("\n", "\\n");
}
private String escapeKeys(List<String> list) {
return Joiner.on(", ").join(list.stream().map(s -> "'" + escape(s.toLowerCase()) + "'").collect(Collectors.toList()));
}
};
@Getter private final String name;
@Getter private final boolean gameKeyCompatible;
@Getter private final String filename;
ListingType(String name, boolean gameKeyCompatible, String filename) {
this.name = name;
this.gameKeyCompatible = gameKeyCompatible;
this.filename = filename;
}
@Override
public String toString() {
return name;
}
public abstract String generate(List<ManifestEntry> entries) throws IOException;
}