Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
aee24d9492
|
84
index.js
84
index.js
@@ -2,10 +2,10 @@ const axios = require("axios");
|
|||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const { pipeline } = require("stream/promises");
|
const { pipeline } = require("stream/promises");
|
||||||
const cliProgress = require("cli-progress");
|
|
||||||
const cheerio = require("cheerio");
|
const cheerio = require("cheerio");
|
||||||
const SftpClient = require("ssh2-sftp-client");
|
const SftpClient = require("ssh2-sftp-client");
|
||||||
const crypto = require("crypto");
|
const crypto = require("crypto");
|
||||||
|
const pLimit = require("p-limit").default;
|
||||||
|
|
||||||
// --- Config & Secrets ---
|
// --- Config & Secrets ---
|
||||||
const CONFIG_PATH = "config.json";
|
const CONFIG_PATH = "config.json";
|
||||||
@@ -76,35 +76,34 @@ const downloadJar = async (url, name) => {
|
|||||||
console.log(`🟡 Skipped (already exists): ${name}`);
|
console.log(`🟡 Skipped (already exists): ${name}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const USER_AGENT = config.global?.userAgent || "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36";
|
|
||||||
const response = await axios.get(url, {
|
|
||||||
responseType: "stream",
|
|
||||||
headers: {
|
|
||||||
"User-Agent":
|
|
||||||
USER_AGENT,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const total = parseInt(response.headers["content-length"] || "0", 10);
|
const response = await axios.get(url, { responseType: "stream" });
|
||||||
const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);
|
|
||||||
bar.start(total, 0);
|
|
||||||
|
|
||||||
response.data.on("data", (chunk) => bar.increment(chunk.length));
|
await pipeline(
|
||||||
response.data.on("end", () => bar.stop());
|
response.data,
|
||||||
|
fs.createWriteStream(filePath)
|
||||||
|
);
|
||||||
|
|
||||||
await pipeline(response.data, fs.createWriteStream(filePath));
|
console.log(`✔️ Saved: ${name}`);
|
||||||
console.log(`✔️ Saved: ${filePath}`);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// --- Handle Jenkins ---
|
// --- Handle Jenkins ---
|
||||||
const handleJenkins = async (url) => {
|
const handleJenkins = async (url) => {
|
||||||
const html = await axios.get(url).then((res) => res.data);
|
const apiURL = url.endsWith("/")
|
||||||
const $ = cheerio.load(html);
|
? url + "api/json?tree=artifacts[fileName,relativePath]"
|
||||||
const links = $("a[href$='.jar']").map((_, el) => $(el).attr("href")).get();
|
: url + "/api/json?tree=artifacts[fileName,relativePath]";
|
||||||
|
|
||||||
|
const data = await axios.get(apiURL).then((res) => res.data);
|
||||||
|
|
||||||
|
const links = data.artifacts
|
||||||
|
.filter((a) => a.fileName.endsWith(".jar"))
|
||||||
|
.map((a) => a.relativePath);
|
||||||
|
|
||||||
if (!links.length) throw new Error("No .jar files found on page");
|
if (!links.length) throw new Error("No .jar files found on page");
|
||||||
|
|
||||||
const base = new URL(url);
|
const base = new URL(url + (url.endsWith("/") ? "" : "/") + "artifact/");
|
||||||
|
|
||||||
const preferred = ["paper", "spigot", "bukkit"];
|
const preferred = ["paper", "spigot", "bukkit"];
|
||||||
const skip = ["javadoc", "sources", "cli", "bootstrap", "mojangapi", "nashorn", "remapper", "fabric", "neoforge"];
|
const skip = ["javadoc", "sources", "cli", "bootstrap", "mojangapi", "nashorn", "remapper", "fabric", "neoforge"];
|
||||||
const essentialsOK = ["EssentialsX", "EssentialsXChat", "EssentialsXSpawn", "EssentialsXGeoIP"];
|
const essentialsOK = ["EssentialsX", "EssentialsXChat", "EssentialsXSpawn", "EssentialsXGeoIP"];
|
||||||
@@ -115,8 +114,8 @@ const handleJenkins = async (url) => {
|
|||||||
const lower = fileName.toLowerCase();
|
const lower = fileName.toLowerCase();
|
||||||
if (skip.some((term) => lower.includes(term))) return null;
|
if (skip.some((term) => lower.includes(term))) return null;
|
||||||
if (fileName.startsWith("EssentialsX")) {
|
if (fileName.startsWith("EssentialsX")) {
|
||||||
const base = fileName.split("-")[0];
|
const baseName = fileName.split("-")[0];
|
||||||
if (!essentialsOK.includes(base)) return null;
|
if (!essentialsOK.includes(baseName)) return null;
|
||||||
}
|
}
|
||||||
return { href, fileName: lower };
|
return { href, fileName: lower };
|
||||||
})
|
})
|
||||||
@@ -373,29 +372,26 @@ const uploadToSFTP = async () => {
|
|||||||
|
|
||||||
await downloadLatestPaperMC();
|
await downloadLatestPaperMC();
|
||||||
|
|
||||||
console.log("\n🔍 Starting plugin downloads from configured URLs...");
|
console.log("\n🔍 Starting plugin downloads from configured URLs...");
|
||||||
for (const url of config.urls) {
|
|
||||||
console.log(`\n📥 ${url}`);
|
const limit = pLimit(6);
|
||||||
try {
|
|
||||||
if (url.includes("github.com")) {
|
await Promise.all(
|
||||||
await handleGitHub(url);
|
config.urls.map(url =>
|
||||||
} else if (url.includes("modrinth.com")) {
|
limit(async () => {
|
||||||
await handleModrinth(url);
|
try {
|
||||||
} else if (url.includes("papermc.io")) {
|
if (url.includes("github.com")) return handleGitHub(url);
|
||||||
await handlePaperMC(url);
|
if (url.includes("modrinth.com")) return handleModrinth(url);
|
||||||
} else if (url.includes("dev.bukkit.org")) {
|
if (url.includes("papermc.io")) return handlePaperMC(url);
|
||||||
await handleBukkit(url);
|
if (url.includes("dev.bukkit.org")) return handleBukkit(url);
|
||||||
} else if (url.includes("/job/")) {
|
if (url.includes("/job/")) return handleJenkins(url);
|
||||||
await handleJenkins(url);
|
if (url.endsWith(".jar") || url.includes("download.geysermc.org")) return handleDirect(url);
|
||||||
} else if (url.endsWith(".jar") || url.includes("download.geysermc.org")) {
|
} catch (err) {
|
||||||
await handleDirect(url);
|
console.error(`❌ Failed: ${err.message}`);
|
||||||
} else {
|
|
||||||
console.warn("⚠️ Skipping unknown URL format.");
|
|
||||||
}
|
}
|
||||||
} catch (err) {
|
})
|
||||||
console.error(`❌ Failed: ${err.message}`);
|
)
|
||||||
}
|
);
|
||||||
}
|
|
||||||
|
|
||||||
await uploadToSFTP();
|
await uploadToSFTP();
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "download-plugs",
|
"name": "download-plugs",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"run": "node index.js"
|
"run": "node index.js"
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
"cheerio": "^1.0.0",
|
"cheerio": "^1.0.0",
|
||||||
"cli-progress": "^3.12.0",
|
"p-limit": "^7.2.0",
|
||||||
"ssh2-sftp-client": "^12.0.0"
|
"ssh2-sftp-client": "^12.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user