feat: 新增插件管理模块
This commit is contained in:
		
							
								
								
									
										150
									
								
								src/main/resources/plugins/MiaoScriptPackageManager.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								src/main/resources/plugins/MiaoScriptPackageManager.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,150 @@
 | 
				
			|||||||
 | 
					'use strict'
 | 
				
			||||||
 | 
					/*global Java, base, module, exports, require*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var wrapper = require('api/wrapper')
 | 
				
			||||||
 | 
					var command = require('api/command')
 | 
				
			||||||
 | 
					var manager = require('api/plugin')
 | 
				
			||||||
 | 
					var task = require('api/task')
 | 
				
			||||||
 | 
					var http = require('http')
 | 
				
			||||||
 | 
					var fs = require('fs')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var pluginCache = []
 | 
				
			||||||
 | 
					var packageCache = []
 | 
				
			||||||
 | 
					var packageNameCache = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var description = {
 | 
				
			||||||
 | 
					    name: 'MiaoScriptPackageManager',
 | 
				
			||||||
 | 
					    version: '1.0',
 | 
				
			||||||
 | 
					    author: '喵♂呜',
 | 
				
			||||||
 | 
					    description: 'MiaoScript包管理工具',
 | 
				
			||||||
 | 
					    commands: {
 | 
				
			||||||
 | 
					        'mpm': {
 | 
				
			||||||
 | 
					            description: 'MiaoScriptPackageManager主命令'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var help = [
 | 
				
			||||||
 | 
					    '==========   MiaoScript包管理工具   ==========',
 | 
				
			||||||
 | 
					    '/mpm list 查看现有插件列表',
 | 
				
			||||||
 | 
					    '/mpm install [插件名称] 安装插件',
 | 
				
			||||||
 | 
					    '/mpm update [插件名称] 更新缓存/更新插件'
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function load() {
 | 
				
			||||||
 | 
					    task.async(function () {
 | 
				
			||||||
 | 
					        var result = http.get('https://ms.yumc.pw/api/package/list')
 | 
				
			||||||
 | 
					        JSON.parse(result).data.forEach(function cachePackageName(pkg) {
 | 
				
			||||||
 | 
					            packageCache[pkg.name] = pkg
 | 
				
			||||||
 | 
					            packageNameCache.push(pkg.name)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        pluginCache = Object.keys(manager.plugins)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function enable() {
 | 
				
			||||||
 | 
					    command.on(this, 'mpm', {
 | 
				
			||||||
 | 
					        cmd: function (sender, command, args) {
 | 
				
			||||||
 | 
					            if (args.length > 0) {
 | 
				
			||||||
 | 
					                switch (args[0]) {
 | 
				
			||||||
 | 
					                    case "list":
 | 
				
			||||||
 | 
					                        console.sender(sender, '§6当前 §bMiaoScriptPackageCenter §6中存在下列插件:')
 | 
				
			||||||
 | 
					                        for (var pkgName in packageCache) {
 | 
				
			||||||
 | 
					                            var pkg = packageCache[pkgName]
 | 
				
			||||||
 | 
					                            console.sender(sender, '§6插件名称: §b%s §6版本: §a%s'.format(pkg.name, pkg.version))
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                    case "install":
 | 
				
			||||||
 | 
					                        if (args.length > 1) {
 | 
				
			||||||
 | 
					                            var pname = args[1];
 | 
				
			||||||
 | 
					                            var pkg = packageCache[pname]
 | 
				
			||||||
 | 
					                            if (pkg) {
 | 
				
			||||||
 | 
					                                task.async(function install() {
 | 
				
			||||||
 | 
					                                    var pfile = fs.file(__dirname, pname + '.js')
 | 
				
			||||||
 | 
					                                    console.sender(sender, '§a开始下载插件: §b%s'.format(pkg.name))
 | 
				
			||||||
 | 
					                                    console.sender(sender, '§a插件下载地址: §b%s'.format(pkg.url))
 | 
				
			||||||
 | 
					                                    fs.save(pfile, http.get(pkg.url))
 | 
				
			||||||
 | 
					                                    console.sender(sender, '§a插件 §b%s §a下载完毕 开始加载 ...'.format(pname))
 | 
				
			||||||
 | 
					                                    manager.loadPlugin(pfile)
 | 
				
			||||||
 | 
					                                    console.sender(sender, '§a插件 §b%s §a安装成功!'.format(pname))
 | 
				
			||||||
 | 
					                                })
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                console.log(sender, '§c插件 %s 不存在!'.format(pname))
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            console.log(sender, '§c请输入插件名称!')
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                    case "update":
 | 
				
			||||||
 | 
					                        if (args.length > 1) {
 | 
				
			||||||
 | 
					                            
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            load()
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                    case "upgrade":
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                    case "delete":
 | 
				
			||||||
 | 
					                        if (args.length > 1) {
 | 
				
			||||||
 | 
					                            var pname = args[1]
 | 
				
			||||||
 | 
					                            if (pluginCache.indexOf(pname) !== -1) {
 | 
				
			||||||
 | 
					                                var plugin = manager.plugins[pname]
 | 
				
			||||||
 | 
					                                manager.disable(plugin)
 | 
				
			||||||
 | 
					                                fs.delete(plugin.__FILE__)
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                console.log(sender, '§c插件 %s 不存在!'.format(pname))
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            console.log(sender, '§c请输入插件名称!')
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                    case "reload":
 | 
				
			||||||
 | 
					                        if (args.length > 1) {
 | 
				
			||||||
 | 
					                            var pname = args[1]
 | 
				
			||||||
 | 
					                            if (pluginCache.indexOf(pname) !== -1) {
 | 
				
			||||||
 | 
					                                manager.reload(pname)
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                console.log(sender, '§c插件 %s 不存在!'.format(pname))
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        tab: function (sender, command, args) {
 | 
				
			||||||
 | 
					            if (args.length === 1) return ['list', 'install', 'update', 'upgrade', 'reload']
 | 
				
			||||||
 | 
					            if (args.length > 1) {
 | 
				
			||||||
 | 
					                switch (args[0]) {
 | 
				
			||||||
 | 
					                    case "install":
 | 
				
			||||||
 | 
					                        return packageNameCache
 | 
				
			||||||
 | 
					                    case "update":
 | 
				
			||||||
 | 
					                    case "upgrade":
 | 
				
			||||||
 | 
					                    case "reload":
 | 
				
			||||||
 | 
					                        return pluginCache
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function download(sender, name) {
 | 
				
			||||||
 | 
					    var plugin = packageCache[name]
 | 
				
			||||||
 | 
					    if (!plugin) {
 | 
				
			||||||
 | 
					        console.sender(sender, '§c插件§b', name, '§c不存在')
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function disable() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = {
 | 
				
			||||||
 | 
					    description: description,
 | 
				
			||||||
 | 
					    load: load,
 | 
				
			||||||
 | 
					    enable: enable,
 | 
				
			||||||
 | 
					    disable: disable
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user