From 75dc7d14eccf4daa1bbceb0d5888da2635a5206e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 17 Dec 2024 11:42:52 +0300 Subject: [PATCH] feat: add plugins folder feature --- src/lib/modules/pluginsFolder.ts | 46 ++++++++++++++++++++++++++++++++ src/modules.ts | 1 + 2 files changed, 47 insertions(+) create mode 100644 src/lib/modules/pluginsFolder.ts diff --git a/src/lib/modules/pluginsFolder.ts b/src/lib/modules/pluginsFolder.ts new file mode 100644 index 00000000..c768084c --- /dev/null +++ b/src/lib/modules/pluginsFolder.ts @@ -0,0 +1,46 @@ +import path from 'path' +import fs from 'fs' + +let loadedPlugins: Record = {} + +export const player = function (player: Player, serv: Server) { + for (const plugin of Object.values(loadedPlugins)) { + plugin.player.call(plugin, player, serv) + } +} + +export const entity = function (entity: Entity, serv: Server) { + for (const plugin of Object.values(loadedPlugins)) { + plugin.entity.call(plugin, entity, serv) + } +} + +export const server = async function (serv: Server, settings: Options) { + loadedPlugins = {} + if (!settings.pluginsFolder || !settings.worldFolder) return + const plugins = fs.readdirSync(path.join(settings.worldFolder, 'plugins')) + + for (const plugin of plugins) { + // match .js but not .disabled.js + if (plugin.match(/\.[js,mjs]$/) && !plugin.includes('.disabled.')) { + const pluginName = plugin.split('.').slice(0, -1).join('.') + const moduleContent = fs.readFileSync(path.join(settings.worldFolder, 'plugins', plugin), 'utf8') + const module = await loadPlugin(moduleContent) + loadedPlugins[pluginName] = module + serv.info(`Loading plugin: ${pluginName}`) + module.server.call(module, serv, settings) + } + } +} + +const loadPlugin = (moduleContent: string) => { + // remove shebang + moduleContent = moduleContent.replace(/^#!.*\n/, '') + const blob = new Blob([moduleContent], { type: 'application/javascript' }) + const moduleUrl = URL.createObjectURL(blob) + + return import(moduleUrl).then(module => { + URL.revokeObjectURL(moduleUrl) + return module + }) +} diff --git a/src/modules.ts b/src/modules.ts index ba768374..a6ece047 100644 --- a/src/modules.ts +++ b/src/modules.ts @@ -48,6 +48,7 @@ declare global { _client: Client } interface Options { + pluginsFolder: boolean version: string /** * @deprecated will be reworked in the future