mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 10:17:17 +08:00
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package plugins
|
|
|
|
import (
|
|
"errors"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/goravel/framework/contracts/route"
|
|
"github.com/goravel/framework/facades"
|
|
|
|
"github.com/TheTNB/panel/v2/app/http/middleware"
|
|
)
|
|
|
|
var plugins sync.Map
|
|
|
|
type Plugin struct {
|
|
Name string // 插件名称
|
|
Description string // 插件描述
|
|
Slug string // 插件标识
|
|
Version string // 插件版本
|
|
Requires []string // 依赖插件
|
|
Excludes []string // 排除插件
|
|
Install string // 安装命令
|
|
Uninstall string // 卸载命令
|
|
Update string // 更新命令
|
|
OnEnable func() error // 启用插件后执行的命令
|
|
OnDisable func() error // 禁用插件后执行的命令
|
|
}
|
|
|
|
func NewPlugin() (*Plugin, error) {
|
|
pc, _, _, ok := runtime.Caller(1)
|
|
if !ok {
|
|
panic("unable to get caller")
|
|
}
|
|
name := runtime.FuncForPC(pc).Name()
|
|
a := strings.LastIndex(name, "/")
|
|
if a < 0 {
|
|
panic("invalid package name: " + name)
|
|
}
|
|
name = name[a+1:]
|
|
b := strings.Index(name, ".")
|
|
if b < 0 {
|
|
panic("invalid package name: " + name)
|
|
}
|
|
slug := name[:b]
|
|
|
|
if _, ok = plugins.Load(slug); ok {
|
|
return nil, errors.New("plugin already exists")
|
|
}
|
|
|
|
instance := &Plugin{
|
|
Slug: slug,
|
|
}
|
|
plugins.Store(slug, instance)
|
|
|
|
return instance, instance.OnEnable()
|
|
}
|
|
|
|
// Route 注册路由
|
|
func (r *Plugin) Route(group func(router route.Router)) {
|
|
facades.Route().Prefix("api/plugins/"+r.Slug).Middleware(middleware.Session(), middleware.MustInstall()).Group(group)
|
|
}
|