Plugin Maneger #276
@ -8,6 +8,6 @@ module.exports = {
|
|||||||
ignore: [],
|
ignore: [],
|
||||||
},
|
},
|
||||||
addModuleEntry: false,
|
addModuleEntry: false,
|
||||||
addPackageJson: true,
|
addPackageJson: false,
|
||||||
filesWithShebang: [],
|
filesWithShebang: [],
|
||||||
};
|
};
|
5943
package-lock.json
generated
5943
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
74
src/PluginManeger.js
Normal file
74
src/PluginManeger.js
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
const request = require("./lib/Requests");
|
||||||
|
const BdsSettings = require("./lib/BdsSettings");
|
||||||
|
const path = require("path");
|
||||||
|
const fs = require("fs");
|
||||||
|
const js_yaml = require("js-yaml");
|
||||||
|
|
||||||
|
const RawGithubUrl = "https://raw.githubusercontent.com/The-Bds-Maneger/Plugins_Repository/main";
|
||||||
|
|
||||||
|
async function PluginManeger(BdsPlatform = BdsSettings.GetPlatform()) {
|
||||||
|
const GetPluginsPath = async () => {
|
||||||
|
return (await request.GithubTree("The-Bds-Maneger/Plugins_Repository", "main")).tree.filter(Tree => Tree.path.startsWith(BdsPlatform));
|
||||||
|
}
|
||||||
|
if ((await GetPluginsPath()).length === 0) throw new Error(`Bds Platform ${BdsPlatform} not found`);
|
||||||
|
const GetPlugin = async (pluginName = "") => {
|
||||||
|
if (!pluginName) throw new Error("Plugin name not found");
|
||||||
|
const RepositoryPlugins = (await GetPluginsPath());
|
||||||
|
if (RepositoryPlugins[0] === undefined) throw new Error(`Bds Platform ${BdsPlatform} not found`);
|
||||||
|
const PluginPath = `${BdsPlatform}/${pluginName.split("").filter(le => /[a-zA-Z0-9]/gi.test(le)).join("").charAt(0).toLocaleLowerCase()}/${pluginName}`;
|
||||||
|
const PluginArray = RepositoryPlugins.filter(Plugin => Plugin.path.startsWith(PluginPath));
|
||||||
|
if (PluginArray[0] === undefined) throw new Error(`Plugin ${pluginName} not found`);
|
||||||
|
const ConfigFile = js_yaml.load(await request.text(`${RawGithubUrl}/${PluginPath}/${path.basename(PluginArray.filter(A => /config\.y[a]ml$/gi.test(A.path))[0].path)}`));
|
||||||
|
console.log(ConfigFile);
|
||||||
|
const ParseConfigVersion = /* ConfigFile.revision.trim() || */ "v1"
|
||||||
|
if (fs.existsSync(path.resolve(__dirname, `./PluginManeger/revision/${ParseConfigVersion}/Config`))) throw new Error(`Plugin ${pluginName} is outdated`);
|
||||||
|
return require(`./PluginManeger/revision/${ParseConfigVersion}/Config`).Parse(PluginPath, BdsPlatform, ConfigFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
const InstallPlugin = async (PluginName = "", Version = "latest") => {
|
||||||
|
const Config = await GetPlugin(PluginName);
|
||||||
|
const Plugin = Config.versions.filter(Version => Version.version === Version)[0];
|
||||||
|
if (Plugin === undefined) throw new Error(`Plugin ${PluginName} version ${Version} not found`);
|
||||||
|
if (BdsPlatform === "pocketmine") {
|
||||||
|
if (Config.type === "plugin") {
|
||||||
|
const PluginPath = path.join(BdsSettings.GetServerPaths("pocketmine"), "plugins");
|
||||||
|
fs.writeFileSync(path.join(PluginPath, `${PluginName}.phar`), await request.buffer(Plugin.url));
|
||||||
|
} else if (Config.type === "resourcepack") {
|
||||||
|
const PluginPath = path.join(BdsSettings.GetServerPaths("pocketmine"), "resourcepacks");
|
||||||
|
fs.writeFileSync(path.join(PluginPath, `${PluginName}.zip`), await request.buffer(Plugin.url));
|
||||||
|
} else throw new Error(`Plugin ${PluginName} type (${Config.type}) not supported`);
|
||||||
|
} else if (BdsPlatform === "bedrock") {
|
||||||
|
if (Config.type === "texture") {
|
||||||
|
if (Plugin.type === "texture_addon") {
|
||||||
|
throw new Error("not implemented");
|
||||||
|
} else if (Plugin.type === "addon") {
|
||||||
|
throw new Error("not implemented");
|
||||||
|
} else if (Plugin.type === "texture") {
|
||||||
|
throw new Error("not implemented");
|
||||||
|
} else throw new Error(`Plugin ${PluginName} type (${Config.type}) not supported`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const PluginList = async () => {
|
||||||
|
const PluginList = (await GetPluginsPath()).filter(Plugin => /config\.y[a]ml$/gi.test(Plugin.path)).map(Plugin => Plugin.path.replace(/\/config\.y[a]ml$/gi, "").replace(RegExp(`^${BdsPlatform}/`), ""));
|
||||||
|
const NewObject = {};
|
||||||
|
for (const PluginPath of PluginList) {
|
||||||
|
const [Letter] = PluginPath.split("/");
|
||||||
|
if (NewObject[Letter] === undefined) NewObject[Letter] = [];
|
||||||
|
NewObject[Letter].push(PluginPath.replace(`${Letter}/`, ""))
|
||||||
|
}
|
||||||
|
console.log(NewObject);
|
||||||
|
return NewObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
GetPlugin,
|
||||||
|
InstallPlugin,
|
||||||
|
PluginList
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
PluginManeger
|
||||||
|
};
|
85
src/PluginManeger/revision/v1/Config.js
Normal file
85
src/PluginManeger/revision/v1/Config.js
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
const RawGithubUrl = "https://raw.githubusercontent.com/The-Bds-Maneger/Plugins_Repository/main";
|
||||||
|
/**
|
||||||
|
* Parse /Config.y[a]ml/ to return a object with url, type and versions
|
||||||
|
*/
|
||||||
|
function Parse(RepositoryPath = "", BdsPlatform = "pocketmine", Config = {}) {
|
||||||
|
for (let KeyArray of Object.keys(Config)) {
|
||||||
|
if (!(KeyArray === "revision" || KeyArray === "name" || KeyArray === "type" || KeyArray === "versions")) console.error(`${KeyArray} is not supported`);
|
||||||
|
}
|
||||||
|
if (Config.type === undefined) throw new Error("Config Error: type not found");
|
||||||
|
const NewConfig = {
|
||||||
|
revision: "v1",
|
||||||
|
type: String(Config.type).toLowerCase(),
|
||||||
|
name: String(Config.name||""),
|
||||||
|
versions: [
|
||||||
|
{
|
||||||
|
dependencies: [""],
|
||||||
|
version: "",
|
||||||
|
minimum: "",
|
||||||
|
url: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dependencies: [],
|
||||||
|
version: 0,
|
||||||
|
minimum: 0,
|
||||||
|
url: "",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}; NewConfig.versions = [];
|
||||||
|
if (BdsPlatform === "pocketmine") {
|
||||||
|
for (const Version of Config.versions) {
|
||||||
|
let AddObj = false;
|
||||||
|
const { version, from, minimum, dependencies } = Version;
|
||||||
|
if (version === undefined) throw new Error("Config Error: version not found");
|
||||||
|
if (from === undefined) throw new Error("Config Error: from not found");
|
||||||
|
const ObjVersion = {
|
||||||
|
dependencies: dependencies || [],
|
||||||
|
version: version,
|
||||||
|
minimum: 0,
|
||||||
|
url: "",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server Minimum version (0 is any version)
|
||||||
|
if (typeof minimum === "string") ObjVersion.minimum = minimum;
|
||||||
|
else if (typeof minimum === "number") ObjVersion.minimum = minimum;
|
||||||
|
else ObjVersion.minimum = 0;
|
||||||
|
|
||||||
|
if (version !== undefined) {
|
||||||
|
// Pocketmine from poggit
|
||||||
|
if (from === "poggit_pmmp") {
|
||||||
|
if (typeof Config.name === "undefined") throw new Error("Config Error: name not found");
|
||||||
|
const { poggit_id } = Version;
|
||||||
|
if (typeof poggit_id === "undefined") ObjVersion.url = `https://poggit.pmmp.io/get/${Config.name.trim()}/${version}`;
|
||||||
|
else ObjVersion.url = `https://poggit.pmmp.io/r/${typeof poggit_id === "number" ? parseInt(poggit_id) : poggit_id.trim()}/${Config.name}.phar`;
|
||||||
|
AddObj = true;
|
||||||
|
} else if (from === "file") {
|
||||||
|
const { file } = Version;
|
||||||
|
if (typeof RepositoryPath === "undefined") throw new Error("Config Error: RepositoryPath not found");
|
||||||
|
if (typeof file === "string") {
|
||||||
|
ObjVersion.url = `${RawGithubUrl}/${RepositoryPath}/${file.replace("./", "")}`;
|
||||||
|
AddObj = true;
|
||||||
|
} else throw new Error("Config Error: file not found");
|
||||||
|
} else if (from === "github_release") {
|
||||||
|
const { repository, file_name } = Version;
|
||||||
|
if (typeof repository === "undefined") throw new Error("Config Error: repository not found");
|
||||||
|
if (typeof file_name === "undefined") console.error("Config Error: file_name not defined, using default");
|
||||||
|
ObjVersion.url = `https://github.com/releases/download/${repository}/${file_name || Config.name}.phar`;
|
||||||
|
AddObj = true;
|
||||||
|
} else if (from === "url") {
|
||||||
|
const { url } = Version;
|
||||||
|
if (typeof url === "undefined") throw new Error("Config Error: url not found");
|
||||||
|
if (/^http[s]?:\/\//.test(url.trim())) {
|
||||||
|
ObjVersion.url = url.trim();
|
||||||
|
AddObj = true;
|
||||||
|
}
|
||||||
|
} else console.error(`Config Error: from ${from} not supported`);
|
||||||
|
}
|
||||||
|
if (AddObj) NewConfig.versions.push(ObjVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NewConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
Parse
|
||||||
|
};
|
@ -2,6 +2,7 @@ const fs = require("fs");
|
|||||||
const path = require("path");
|
const path = require("path");
|
||||||
const BdsSettings = require("./BdsSettings");
|
const BdsSettings = require("./BdsSettings");
|
||||||
|
|
||||||
|
const ModD = {};
|
||||||
function LoadPlugins() {
|
function LoadPlugins() {
|
||||||
return fs.readdirSync(BdsSettings.ExternalPlugins).filter(file => fs.fstatSync(path.join(BdsSettings.ExternalPlugins, file)).isFile()).map(files => {
|
return fs.readdirSync(BdsSettings.ExternalPlugins).filter(file => fs.fstatSync(path.join(BdsSettings.ExternalPlugins, file)).isFile()).map(files => {
|
||||||
try {
|
try {
|
||||||
@ -12,10 +13,11 @@ function LoadPlugins() {
|
|||||||
}
|
}
|
||||||
}).filter(plugin => plugin);
|
}).filter(plugin => plugin);
|
||||||
}
|
}
|
||||||
|
ModD.LoadPlugins = LoadPlugins;
|
||||||
|
|
||||||
module.exports.plugin = LoadPlugins();
|
ModD.plugin = LoadPlugins();
|
||||||
fs.watch(BdsSettings.ExternalPlugins, () => {
|
fs.watch(BdsSettings.ExternalPlugins, () => {
|
||||||
module.exports.plugin = LoadPlugins();
|
ModD.plugin = LoadPlugins();
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports.LoadPlugins = LoadPlugins;
|
module.exports = ModD;
|
@ -1,10 +1,12 @@
|
|||||||
if (typeof global.fetch !== "function") {
|
if (typeof global !== "undefined") {
|
||||||
global.fetch = (...args) => import("node-fetch").then(m => m.default(...args));
|
if (typeof global.fetch === "undefined") {
|
||||||
import("node-fetch").then(m => global.fetch = m.default);
|
global.fetch = (...args) => import("node-fetch").then(Fetch => Fetch.default(...args));
|
||||||
|
import("node-fetch").then(Fetch => global.fetch = Fetch.default);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function BufferHTTP(url = "", args = {}) {
|
async function BufferHTTP(url = "", args = {}) {
|
||||||
const res = await fetch(url, {
|
const Fetch = (await import("node-fetch")).default;
|
||||||
|
const res = await Fetch(url, {
|
||||||
mode: "cors",
|
mode: "cors",
|
||||||
...args
|
...args
|
||||||
});
|
});
|
||||||
@ -24,6 +26,33 @@ async function TextHTTP(url = "", args = {}) {
|
|||||||
return (await BufferHTTP(url, args)).toString();
|
return (await BufferHTTP(url, args)).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function GithubTree(repo = "The-Bds-Maneger/Plugins_Repository", branch = "main") {
|
||||||
|
let res = {
|
||||||
|
"sha": "db0e9588de141e033b62bb581ac65b89f5c57f5b",
|
||||||
|
"url": "https://api.github.com/repos/The-Bds-Maneger/Plugins_Repository/git/trees/db0e9588de141e033b62bb581ac65b89f5c57f5b",
|
||||||
|
"tree": [
|
||||||
|
{
|
||||||
|
"path": ".gitignore",
|
||||||
|
"mode": "100644",
|
||||||
|
"type": "blob",
|
||||||
|
"sha": "40b878db5b1c97fc77049537a71bb2e249abe5dc",
|
||||||
|
"size": 13,
|
||||||
|
"url": "https://api.github.com/repos/The-Bds-Maneger/Plugins_Repository/git/blobs/40b878db5b1c97fc77049537a71bb2e249abe5dc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "repository",
|
||||||
|
"mode": "040000",
|
||||||
|
"type": "tree",
|
||||||
|
"sha": "1dd3854f47e8c38200788f718058fac981a27227",
|
||||||
|
"url": "https://api.github.com/repos/The-Bds-Maneger/Plugins_Repository/git/trees/1dd3854f47e8c38200788f718058fac981a27227"
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"truncated": false
|
||||||
|
}
|
||||||
|
res = await JsonHTTP(`https://api.github.com/repos/${repo}/git/trees/${branch}?recursive=true`);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// Export Bds Request
|
// Export Bds Request
|
||||||
module.exports = {
|
module.exports = {
|
||||||
// JSON
|
// JSON
|
||||||
@ -36,5 +65,8 @@ module.exports = {
|
|||||||
|
|
||||||
// Buffer
|
// Buffer
|
||||||
BUFFER: BufferHTTP,
|
BUFFER: BufferHTTP,
|
||||||
buffer: BufferHTTP
|
buffer: BufferHTTP,
|
||||||
|
|
||||||
|
// Others
|
||||||
|
GithubTree
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user