2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 10:17:17 +08:00
Files
panel/pkg/plugins/loader.go
2024-07-29 01:21:50 +08:00

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)
}