UNPKG

5.49 kBPlain TextView Raw
1import { getIfUpdate, UpdatedObject } from "@xmcl/net";
2import * as parser from "fast-html-parser";
3import { ForgeInstaller } from "./index";
4
5export namespace ForgeWebPage {
6
7 export interface Download {
8 md5: string;
9 sha1: string;
10 path: string;
11 }
12
13 function parseWebPage(content: string): ForgeWebPage {
14 const dom = parser.parse(content);
15 const selected = dom.querySelector(".elem-active");
16 const mcversion = selected.text;
17 return {
18 timestamp: "",
19 mcversion,
20 versions: dom.querySelector(".download-list").querySelector("tbody").querySelectorAll("tr")
21 .map((e) => {
22 const links = e.querySelector(".download-links").childNodes
23 .filter((elem) => elem.tagName === "li")
24 .map((elem) => {
25 const tt = elem.querySelector(".info-tooltip");
26 const url = tt.querySelector("a") || elem.querySelector("a");
27 return {
28 name: url.childNodes[2].rawText.trim(),
29 md5: tt.childNodes[2].text.trim(),
30 sha1: tt.childNodes[6].text.trim(),
31 path: url.attributes.href,
32 };
33 });
34 const downloadVersionElem = e.querySelector(".download-version");
35 let version;
36 let type: ForgeWebPage.Version["type"] = "common";
37 const icon = downloadVersionElem.querySelector("i");
38 if (icon) {
39 if (icon.classNames.indexOf("promo-recommended") !== -1) {
40 type = "recommended";
41 } else if (icon.classNames.indexOf("promo-latest") !== -1) {
42 type = "latest";
43 } else if (icon.classNames.indexOf("fa-bug") !== -1) {
44 type = "buggy";
45 }
46 version = downloadVersionElem.firstChild.text.trim();
47 } else {
48 version = downloadVersionElem.text.trim();
49 }
50 const installer = links.find((l) => l.name === "Installer");
51 const universal = links.find((l) => l.name === "Universal");
52
53 if (installer === undefined || universal === undefined) {
54 throw new Error(`Cannot parse forge web since it missing installer and universal jar info.`);
55 }
56 const result = {
57 version,
58 "date": e.querySelector(".download-time").text.trim(),
59 "changelog": links[0],
60 installer,
61 "installer-win": links.find((l) => l.name === "Installer-win"),
62 "mdk": links.find((l) => l.name === "Mdk"),
63 universal,
64 "mcversion": mcversion,
65 type,
66 };
67
68 return result;
69 }),
70 };
71 }
72
73 /**
74 * Query the webpage content from files.minecraftforge.net.
75 *
76 * You can put the last query result to the fallback option. It will check if your old result is up-to-date.
77 * It will request a new page only when the fallback option is outdated.
78 *
79 * @param option The option can control querying minecraft version, and page caching.
80 */
81 export async function getWebPage(option: {
82 mcversion?: string,
83 fallback?: ForgeWebPage,
84 } = {}): Promise<ForgeWebPage> {
85 const mcversion = option.mcversion || "";
86 const url = mcversion === "" ? `http://files.minecraftforge.net/maven/net/minecraftforge/forge/index.html` : `http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_${mcversion}.html`;
87 const page = await getIfUpdate(url, parseWebPage, option.fallback);
88 return page;
89 }
90
91 export interface Version extends ForgeInstaller.VersionMeta {
92 mcversion: string;
93 version: string;
94 date: string;
95 changelog: ForgeWebPage.Download;
96 installer: ForgeWebPage.Download;
97 mdk?: ForgeWebPage.Download;
98 universal: ForgeWebPage.Download;
99 type: "buggy" | "recommended" | "common" | "latest";
100 }
101
102 export namespace Version {
103 export function to(webPageVersion: ForgeWebPage.Version): ForgeInstaller.VersionMeta {
104 return {
105 universal: webPageVersion.universal,
106 installer: webPageVersion.installer,
107 mcversion: webPageVersion.mcversion,
108 version: webPageVersion.version,
109 };
110 }
111 }
112}
113
114declare module "./index" {
115 export namespace VersionMeta {
116 export function from(webPageVersion: ForgeWebPage.Version): ForgeInstaller.VersionMeta;
117 }
118}
119
120(ForgeInstaller as any).VersionMeta = (ForgeInstaller as any).VersionMeta || {};
121(ForgeInstaller as any).VersionMeta.from = ForgeWebPage.Version.to;
122
123export interface ForgeWebPage extends UpdatedObject {
124 versions: ForgeWebPage.Version[];
125 mcversion: string;
126}
127
128
129