mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-16 08:56:04 +01:00
Utils for gacha history record subsystem
* Auto generate mapping files with command `java -jar grasscutter.jar -gachamap` * Static file provider * For gacha record webpage * All static files should be stored at `GRASSCUTTER_RESOURCE/gcstatic/` * Can benefit other subsystem in future when webpages involved
This commit is contained in:
@@ -60,6 +60,9 @@ public final class Grasscutter {
|
||||
case "-handbook" -> {
|
||||
Tools.createGmHandbook(); return;
|
||||
}
|
||||
case "-gachamap" -> {
|
||||
Tools.createGachaMapping(); return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ import emu.grasscutter.server.dispatch.json.ComboTokenReqJson.LoginTokenData;
|
||||
import emu.grasscutter.server.event.dispatch.QueryAllRegionsEvent;
|
||||
import emu.grasscutter.server.event.dispatch.QueryCurrentRegionEvent;
|
||||
import emu.grasscutter.server.http.gacha.GachaRecordHandler;
|
||||
import emu.grasscutter.server.http.gcstatic.StaticFileHandler;
|
||||
import emu.grasscutter.utils.FileUtils;
|
||||
import express.Express;
|
||||
import org.eclipse.jetty.server.Connector;
|
||||
@@ -445,8 +446,12 @@ public final class DispatchServer {
|
||||
// webstatic-sea.hoyoverse.com
|
||||
httpServer.get("/admin/mi18n/plat_oversea/m202003048/m202003048-version.json", new DispatchHttpJsonHandler("{\"version\":51}"));
|
||||
|
||||
// gacha record
|
||||
httpServer.get("/gacha", new GachaRecordHandler());
|
||||
|
||||
// static file provider
|
||||
httpServer.get("/gcstatic/*", new StaticFileHandler());
|
||||
|
||||
httpServer.listen(Grasscutter.getConfig().getDispatchOptions().Port);
|
||||
Grasscutter.getLogger().info("[Dispatch] Dispatch server started on port " + httpServer.raw().port());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package emu.grasscutter.server.http.gcstatic;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import express.http.HttpContextHandler;
|
||||
import express.http.Request;
|
||||
import express.http.Response;
|
||||
|
||||
public final class StaticFileHandler implements HttpContextHandler {
|
||||
String static_folder;
|
||||
public StaticFileHandler() {
|
||||
static_folder = Grasscutter.getConfig().RESOURCE_FOLDER + "/gcstatic";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(Request req, Response res) throws IOException {
|
||||
// Grasscutter.getLogger().info( req.path());
|
||||
|
||||
String reqFilename = req.path().replace("/gcstatic", ""); // remove the leading path
|
||||
reqFilename = reqFilename.replace("/../", "/./"); // security guard to prevent arbitrary read
|
||||
File resFile = new File(static_folder + reqFilename);
|
||||
if (resFile.exists()) {
|
||||
res.sendFile(resFile.toPath());
|
||||
} else {
|
||||
res.status(404);
|
||||
res.send("404");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package emu.grasscutter.tools;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
@@ -93,4 +94,96 @@ public final class Tools {
|
||||
|
||||
Grasscutter.getLogger().info("GM Handbook generated!");
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static void createGachaMapping() throws Exception {
|
||||
ResourceLoader.loadResources();
|
||||
|
||||
Map<Long, String> map;
|
||||
try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap/TextMapEN.json")), StandardCharsets.UTF_8)) {
|
||||
map = Grasscutter.getGsonFactory().fromJson(fileReader, new TypeToken<Map<Long, String>>() {}.getType());
|
||||
}
|
||||
|
||||
List<Integer> list;
|
||||
|
||||
|
||||
String fileName = Grasscutter.getConfig().RESOURCE_FOLDER + "/gcstatic";
|
||||
File folder = new File(fileName);
|
||||
if (!folder.exists()) { folder.mkdirs(); } // create folder if it doesn't exist
|
||||
fileName = fileName + "/mappings.js";
|
||||
|
||||
try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fileName), StandardCharsets.UTF_8), false)) {
|
||||
|
||||
list = new ArrayList<>(GameData.getAvatarDataMap().keySet());
|
||||
Collections.sort(list);
|
||||
|
||||
writer.println("mappings = {\"en-us\": {");
|
||||
|
||||
// Avatars
|
||||
boolean first = true;
|
||||
for (Integer id : list) {
|
||||
AvatarData data = GameData.getAvatarDataMap().get(id);
|
||||
int avatarID = data.getId();
|
||||
if (avatarID >= 11000000) { // skip test avatar
|
||||
continue;
|
||||
}
|
||||
if (first) { // skip adding comma for the first element
|
||||
first = false;
|
||||
} else {
|
||||
writer.print(",");
|
||||
}
|
||||
String color;
|
||||
switch (data.getQualityType()){
|
||||
case "QUALITY_PURPLE":
|
||||
color = "purple";
|
||||
break;
|
||||
case "QUALITY_ORANGE":
|
||||
color = "yellow";
|
||||
break;
|
||||
case "QUALITY_BLUE":
|
||||
default:
|
||||
color = "blue";
|
||||
}
|
||||
|
||||
writer.println(
|
||||
"\"" + (avatarID % 1000 + 1000) + "\" : [\""
|
||||
+ map.get(data.getNameTextMapHash()) + "(Avatar)\", \""
|
||||
+ color + "\"]");
|
||||
}
|
||||
|
||||
writer.println();
|
||||
|
||||
list = new ArrayList<>(GameData.getItemDataMap().keySet());
|
||||
Collections.sort(list);
|
||||
|
||||
// Weapons
|
||||
for (Integer id : list) {
|
||||
ItemData data = GameData.getItemDataMap().get(id);
|
||||
if (data.getId() <= 11101 || data.getId() >= 20000) {
|
||||
continue; //skip non weapon items
|
||||
}
|
||||
String color;
|
||||
|
||||
switch (data.getRankLevel()){
|
||||
case 3:
|
||||
color = "blue";
|
||||
break;
|
||||
case 4:
|
||||
color = "purple";
|
||||
break;
|
||||
case 5:
|
||||
color = "yellow";
|
||||
break;
|
||||
default:
|
||||
continue; // skip unnecessary entries
|
||||
}
|
||||
writer.println(",\"" + data.getId() +
|
||||
"\" : [\"" + map.get(data.getNameTextMapHash()).replaceAll("\"", "")
|
||||
+ "(Weapon)\",\""+ color + "\"]");
|
||||
}
|
||||
writer.println(",\"200\": \"Standard\", \"301\": \"Avatar Event\", \"302\": \"Weapon event\"");
|
||||
writer.println("}\n}");
|
||||
}
|
||||
Grasscutter.getLogger().info("Mappings generated!");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user