Compare commits

...

10 Commits

Author SHA1 Message Date
14d30a7b3e v0.19.8 2022-04-04 05:17:27 +08:00
16502ecc01 feat: remove global initialize
Signed-off-by: MiaoWoo <admin@yumc.pw>
2022-04-04 05:13:24 +08:00
9d891b5596 v0.19.7 2022-04-04 04:28:12 +08:00
87b7c66282 fix: 修复子命令权限处理异常
Signed-off-by: MiaoWoo <admin@yumc.pw>
2022-04-04 04:27:47 +08:00
c8df79a072 v0.19.6 2022-04-03 03:10:13 +08:00
2aef84604b fix: api interface error
Signed-off-by: MiaoWoo <admin@yumc.pw>
2022-04-03 03:07:18 +08:00
dbecad996a v0.19.5 2022-04-03 02:43:11 +08:00
c4aded50f1 feat: add exit event
Signed-off-by: MiaoWoo <admin@yumc.pw>
2022-04-03 02:41:17 +08:00
93b361a2ac feat: add more event emit
Signed-off-by: MiaoWoo <admin@yumc.pw>
2022-04-02 16:51:08 +08:00
923bf102de fix: 修复自动化命令参数错误
Signed-off-by: MiaoWoo <admin@yumc.pw>
2022-04-02 15:02:21 +08:00
19 changed files with 134 additions and 62 deletions

View File

@@ -1,5 +1,5 @@
{
"version": "0.19.0",
"version": "0.19.8",
"useWorkspaces": true,
"npmClient": "yarn",
"packages": [

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/amqp",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript amqp package",
"keywords": [
"miaoscript",
@@ -19,7 +19,7 @@
"test": "echo \"Error: run tests from root\" && exit 1"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0"
},

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/api",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript api package",
"keywords": [
"miaoscript",

View File

@@ -20,7 +20,7 @@ export namespace plugin {
export abstract class PluginManager {
abstract scan(folder: string): void
abstract build(): void
abstract loadFromFile(file: string, scanner?: plugin.PluginScanner): Plugin
abstract loadFromFile(file: string, ext?: any): Plugin
abstract load(...args: any[]): void
abstract enable(...args: any[]): void
abstract disable(...args: any[]): void

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/bukkit",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript bukkit package",
"keywords": [
"miaoscript",
@@ -25,7 +25,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/bungee",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript bungee package",
"keywords": [
"miaoscript",
@@ -25,7 +25,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/core",
"version": "0.19.0",
"version": "0.19.8",
"description": "MiaoScript api package",
"keywords": [
"miaoscript",
@@ -24,7 +24,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/container": "^0.19.0"
},
"gitHead": "781524f83e52cad26d7c480513e3c525df867121"

13
packages/core/src/exit.js Normal file
View File

@@ -0,0 +1,13 @@
function exit() {
var http = require('@ccms/common/dist/http').default
function upgradeModules(core) {
if (base.version && global.ScriptEngineVersion != core['dist-tags']['latest']) {
var Paths = Java.type('java.nio.file.Paths')
base.save(Paths.get(root, "upgrade"), core['dist-tags']['latest'])
console.info('@ccms/core found new version ' + core['dist-tags']['latest'] + ' will upgrade after reboot!')
}
}
upgradeModules(http.get('https://registry.npmmirror.com/@ccms/core'))
console.debug('exit finish!')
}
exit()

View File

@@ -17,17 +17,22 @@ class MiaoScriptCore {
private pluginManager: plugin.PluginManager
enable() {
process.emit('core.before.enable')
this.loadServerConsole()
this.loadPlugins()
process.emit('core.after.enable')
return () => this.disable()
}
loadServerConsole() {
process.emit('core.before.load.console')
//@ts-ignore
global.setGlobal('console', new this.Console(), { writable: false, configurable: false })
process.emit('core.after.load.console')
}
loadPlugins() {
process.emit('core.before.load.plugins')
let loadPluginStartTime = new Date().getTime()
console.i18n("ms.core.plugin.initialize")
this.pluginManager.scan(this.pluginFolder)
@@ -35,19 +40,32 @@ class MiaoScriptCore {
this.pluginManager.load(this.pluginManager.getPlugins())
this.pluginManager.enable(this.pluginManager.getPlugins())
console.i18n("ms.core.plugin.completed", { time: (new Date().getTime() - loadPluginStartTime) / 1000 })
process.emit('core.after.load.plugins')
}
disable() {
process.emit('core.before.disable')
let disableStartTime = Date.now()
console.i18n("ms.core.engine.disable")
this.pluginManager.disable(this.pluginManager.getPlugins())
this.taskManager.disable()
process.emit('core.after.disable')
try {
engineLoad({
script: http.get("https://ms.yumc.pw/api/plugin/download/name/exit"),
name: 'core/exit.js'
})
} catch (error: any) {
console.debug(error)
}
process.emit('core.before.exit')
process.exit(0)
console.i18n("ms.core.engine.disable.finish", {
loader: base.version,
version: 'v' + global.ScriptEngineVersion,
time: (new Date().getTime() - disableStartTime) / 1000
})
process.emit('core.after.exit')
}
}
@@ -81,6 +99,7 @@ function detectServer(): constants.ServerType {
}
function initialize() {
process.emit('core.before.initialize')
global.ScriptSlowExecuteTime = 30
global.ScriptEngineVersion = require('../package.json').version
try {
@@ -97,21 +116,29 @@ function initialize() {
container.bind(plugin.PluginInstance).toConstantValue(base.getInstance())
container.bind(plugin.PluginFolder).toConstantValue('plugins')
let type = detectServer()
process.emit('core.before.initialize.detect')
console.i18n("ms.core.initialize.detect", { scope: global.scope, type })
container.bind(server.ServerType).toConstantValue(type)
container.bind(server.ServerChecker).toSelf().inSingletonScope()
container.bind(server.NativePluginManager).toSelf().inSingletonScope()
process.emit('core.after.initialize.detect')
process.emit('core.before.package.initialize')
console.i18n("ms.core.package.initialize", { scope: global.scope, type })
require(`${global.scope}/${type}`).default(container)
require(`${global.scope}/plugin`)
container.load(buildProviderModule())
console.i18n("ms.core.package.completed", { scope: global.scope, type, time: (Date.now() - corePackageStartTime) / 1000 })
process.emit('core.after.package.initialize')
let disable = container.get<MiaoScriptCore>(MiaoScriptCore).enable()
console.i18n("ms.core.engine.completed", {
loader: base.version,
version: 'v' + global.ScriptEngineVersion,
time: (Date.now() - global.ScriptEngineStartTime) / 1000
})
process.emit('core.after.initialize')
return disable
} catch (error: any) {
console.i18n("ms.core.initialize.error", { error })

View File

@@ -1,23 +1,34 @@
var fs = require('@ccms/common/dist/fs')
function updateJar() {
if (!base.version) {
var pluginFolder = fs.file(fs.concat(root, '..'))
var updateFolder = fs.concat(pluginFolder, 'update')
}
}
function upgradeModules() {
var core = http.get('https://registry.npmmirror.com/@ccms/core')
if (base.version && global.ScriptEngineVersion != core['dist-tags']['latest']) {
var Paths = Java.type('java.nio.file.Paths')
base.save(Paths.get(root, "upgrade"), core['dist-tags']['latest'])
console.info('@ccms/core found new version ' + core['dist-tags']['latest'] + ' will upgrade after reboot!')
}
}
function initialize() {
global.initialize = function () {
var mspmc = 'https://ms.yumc.pw/api/plugin/download/name/'
var artifact = 'https://ci.yumc.pw/job/Minecraft/job/MiaoScript/lastSuccessfulBuild/artifact'
var fs = require('@ccms/common/dist/fs')
var http = require('@ccms/common/dist/http').default
function updateJar() {
var DocumentBuilderFactory = Java.type('javax.xml.parsers.DocumentBuilderFactory')
var URLDecoder = Java.type('java.net.URLDecoder')
var pom = DocumentBuilderFactory.newInstance().newDocumentBuilder()
.parse(artifact + "/pom.xml")
var latestVersion = pom.getElementsByTagName("version").item(0).getTextContent()
if (base.version != latestVersion) {
var pluginFolder = fs.file(fs.concat(root, '..'))
var updateFolder = fs.concat(pluginFolder, 'update')
fs.mkdirs(updateFolder)
var filePath = base.getInstance().class.classLoader.getURLs()[0]
var pluginFile = fs.file(URLDecoder.decode(filePath.getFile(), "UTF-8"))
var updateFile = fs.file(updateFolder, pluginFile.getName())
http.download(artifact + "/target/MiaoScript.jar", updateFile.getAbsolutePath())
console.info('MiaoScript found new version ' + latestVersion + ' will upgrade after reboot!')
}
}
function upgradeModules(core) {
if (base.version && global.ScriptEngineVersion != core['dist-tags']['latest']) {
var Paths = Java.type('java.nio.file.Paths')
base.save(Paths.get(root, "upgrade"), core['dist-tags']['latest'])
console.info('@ccms/core found new version ' + core['dist-tags']['latest'] + ' will upgrade after reboot!')
}
}
var pluginFolder = fs.concat(root, 'plugins')
var updateFolder = fs.concat(pluginFolder, 'update')
var pluginFile = fs.concat(pluginFolder, 'MiaoScriptPackageManager.js')
@@ -44,9 +55,14 @@ function initialize() {
try {
Java.type("org.bukkit.Bukkit")
updateJar()
} catch (ignore) {
} catch (error) {
console.debug(error)
if (global.debug) {
console.ex(error)
}
}
upgradeModules()
upgradeModules(http.get('https://registry.npmmirror.com/@ccms/core'))
console.debug('initialize finish!')
}
initialize()
global.initialize()
delete global.initialize

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/database",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript database package",
"keywords": [
"miaoscript",
@@ -25,7 +25,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/container": "^0.19.0"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/keyvalue",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript keyvalue package",
"keywords": [
"miaoscript",
@@ -19,7 +19,7 @@
"test": "echo \"Error: run tests from root\" && exit 1"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0"
},

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/nukkit",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript nukkit package",
"keywords": [
"miaoscript",
@@ -25,7 +25,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/plugin",
"version": "0.19.0",
"version": "0.19.7",
"description": "MiaoScript api package",
"keywords": [
"miaoscript",
@@ -25,7 +25,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0",
"@ccms/i18n": "^0.19.0",

View File

@@ -56,8 +56,10 @@ export class PluginCommandManager {
let cmdKey = 'cmd' + subcommand
let subcommandexec = pluginInstance[cmdKey]
if (!subcommandexec) {
args.shift()
subcommandexec = pluginInstance['cmdmain']
subcommand = 'main'
} else {
args.shift()
}
if (!subcommandexec) {
subcommand && pluginInstance.logger.sender(sender, '§4未知的子命令: §c' + subcommand)
@@ -65,30 +67,37 @@ export class PluginCommandManager {
sender,
pluginInstance['cmdhelp'] ?
`§6请执行 §b/${command} §ahelp §6查看帮助!` :
`§b版本: §a ${pluginInstance.description.version}`
[
`§6插件: §b${pluginInstance.description.name}`,
`§6版本: §a${pluginInstance.description.version}`
]
)
return
}
let permission: string
if (typeof cmd.permission == "string") {
permission = cmd.permission as string
} else if (cmd.permission) {
permission = `${pluginInstance.description.name.toLocaleLowerCase()}.${command}.${subcommand}`
}
if (sender.hasPermission && !sender.hasPermission(permission)) {
return pluginInstance.logger.sender(sender, `§c你需要 ${permission} 权限 才可执行此命令.`)
if (cmd.permission && sender.hasPermission) {
if (typeof cmd.permission == "string") {
permission = cmd.permission as string
} else {
permission = `${pluginInstance.description.name.toLocaleLowerCase()}.${command}.${subcommand}`
}
if (!sender.hasPermission(permission)) {
return pluginInstance.logger.sender(sender, `§c你需要 ${permission} 权限 才可执行此命令.`)
}
}
return subcommandexec.apply(pluginInstance, [sender, ...args])
}
let originCompleter = cmdCompleter
cmdCompleter = (sender: any, command: string, args: string[]) => {
let permission: string
if (typeof cmd.permission == "string") {
permission = cmd.permission as string
} else if (cmd.permission) {
permission = `${pluginInstance.description.name.toLocaleLowerCase()}.${command}`
if (cmd.permission && sender.hasPermission) {
if (typeof cmd.permission == "string") {
permission = cmd.permission as string
} else {
permission = `${pluginInstance.description.name.toLocaleLowerCase()}.${command}`
}
if (!sender.hasPermission(permission)) { return [] }
}
if (sender.hasPermission && !sender.hasPermission(permission)) { return [] }
return (args.length == 1 ? cmdSubCache : []).concat(originCompleter?.apply(pluginInstance, [sender, command, args]) || [])
}
}

View File

@@ -64,6 +64,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
initialize() {
if (this.pluginInstance === undefined) { throw new Error("Can't found Plugin Instance!") }
if (this.initialized !== true) {
process.emit('plugin.manager.before.initialize')
console.i18n('ms.plugin.initialize', { plugin: this.pluginInstance, loader: Thread.currentThread().contextClassLoader })
console.i18n('ms.plugin.event.map', { count: this.eventManager.mapEventName(), type: this.serverType })
let pluginScanner = this.container.getAll<plugin.PluginScanner>(plugin.PluginScanner)
@@ -77,13 +78,14 @@ export class PluginManagerImpl implements plugin.PluginManager {
this.loaderMap.set(loader.type, loader)
})
this.initialized = true
process.emit('plugin.initialize')
process.emit('plugin.manager.after.initialize')
}
}
scan(folder: string): void {
if (!folder) { throw new Error('plugin scan folder can\'t be empty!') }
this.initialize()
process.emit('plugin.manager.before.scan', folder)
for (const [, scanner] of this.sacnnerMap) {
try {
console.i18n('ms.plugin.manager.scan', { scanner: scanner.type, folder })
@@ -102,12 +104,13 @@ export class PluginManagerImpl implements plugin.PluginManager {
console.ex(error)
}
}
process.emit('plugin.scan', folder)
process.emit('plugin.manager.after.scan', folder)
}
build(): void {
process.emit('plugin.manager.before.build')
this.buildPlugins()
process.emit('plugin.build')
process.emit('plugin.manager.after.build')
}
private logStage(plugin: plugin.Plugin, stage: string) {
@@ -132,6 +135,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
private loadPlugin(loadMetadata: plugin.PluginLoadMetadata) {
if (!loadMetadata) { throw new Error('loadMetadata can\'t be undefiend when loadPlugin!') }
if (loadMetadata.loaded) { throw new Error(`Plugin file ${loadMetadata.file} is already loaded by ${loadMetadata.loader?.type}!`) }
process.emit(`plugin.before.require`, loadMetadata)
try {
for (const [, loader] of this.loaderMap) {
if (this.loaderRequirePlugin(loadMetadata, loader)?.loaded) return loadMetadata.metadata
@@ -154,6 +158,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
}
this.metadataMap.set(metadata.name, metadata)
metadata.loadMetadata = loadMetadata
process.emit(`plugin.after.require`, loadMetadata)
}
return loadMetadata
} catch (error: any) {
@@ -269,6 +274,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
return loseDepends
}
private buildPlugin(metadata: plugin.PluginMetadata) {
process.emit(`plugin.before.build`, metadata)
try {
if (this.instanceMap.has(metadata.name)) { throw new Error(`Plugin ${metadata.name} is already load from ${metadata.source}...`) }
if (!this.loaderMap.has(metadata.type)) { throw new Error(`§4无法加载插件 §b${metadata.name} §4请检查 §c${metadata.type} §4加载器是否正常启用!`) }
@@ -280,6 +286,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
let pluginInstance = this.loaderMap.get(metadata.type).build(metadata)
if (!pluginInstance) { throw new Error(`§4加载器 §c${metadata.type} §4加载插件 §c${metadata.name} §4失败!`) }
this.instanceMap.set(metadata.name, pluginInstance)
process.emit(`plugin.after.build`, metadata, pluginInstance)
return pluginInstance
} catch (error: any) {
console.console(`§4无法加载插件 §b${metadata.name} §4构建插件失败!`)

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/sponge",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript api package",
"keywords": [
"miaoscript",
@@ -25,7 +25,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/spring",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript spring package",
"keywords": [
"miaoscript",
@@ -24,9 +24,9 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/common": "^0.19.0",
"@ccms/container": "^0.19.0",
"@ccms/database": "^0.19.0"
"@ccms/database": "^0.19.6"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@ccms/web",
"version": "0.19.0",
"version": "0.19.6",
"description": "MiaoScript web package",
"keywords": [
"miaoscript",
@@ -29,7 +29,7 @@
"typescript": "^4.5.5"
},
"dependencies": {
"@ccms/api": "^0.19.0",
"@ccms/api": "^0.19.6",
"@ccms/container": "^0.19.0"
}
}