refactor(workers): 根据配置文件动态加载插件
This commit is contained in:
parent
b33e44e07c
commit
1a146d4bfb
15 changed files with 150 additions and 67 deletions
18
README.md
18
README.md
|
@ -48,11 +48,14 @@
|
||||||
package workers
|
package workers
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("ping", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Ping{
|
if slices.Contains(plugins, "ping") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("ping", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Ping{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ping struct {
|
type Ping struct {
|
||||||
|
@ -60,7 +63,10 @@ type Ping struct {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
上面的例子是实现里`ping`这个插件的注册,在群组中以`!ping`指令激活。
|
上面的例子是实现里`ping`这个插件的注册,在群组中以`!ping`指令激活。
|
||||||
同时所有的功能需要写在实现的`GetMsg()`方法里,如`!ping` 命令的:
|
|
||||||
|
同时可以通过修改配置文件的`PLUGINS = ["ai","pkg"]`来决定启用哪些插件。
|
||||||
|
|
||||||
|
所有的功能需要写在实现的`GetMsg()`方法里,如`!ping` 命令的:
|
||||||
```go
|
```go
|
||||||
func (a *Ping) GetMsg() string {
|
func (a *Ping) GetMsg() string {
|
||||||
return "Pong!"
|
return "Pong!"
|
||||||
|
|
|
@ -8,6 +8,8 @@ AllowRole = []
|
||||||
BlockGroup = [] # 群组黑名单
|
BlockGroup = [] # 群组黑名单
|
||||||
BlockUser = []
|
BlockUser = []
|
||||||
Master = []
|
Master = []
|
||||||
|
PLUGINS = ["ai","pkg"]
|
||||||
|
|
||||||
[OPENAI]
|
[OPENAI]
|
||||||
MODEL = "gpt-4o"
|
MODEL = "gpt-4o"
|
||||||
OPENAI_API_KEY = "sk-xxxx"
|
OPENAI_API_KEY = "sk-xxxx"
|
||||||
|
|
|
@ -34,6 +34,13 @@ func GetConfig() map[string]interface{} {
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetConfigValue 获取配置值
|
||||||
|
func GetConfigValue(key string) interface{} {
|
||||||
|
mu.RLock()
|
||||||
|
defer mu.RUnlock()
|
||||||
|
return config[key]
|
||||||
|
}
|
||||||
|
|
||||||
// ReloadConfig 重新加载配置文件
|
// ReloadConfig 重新加载配置文件
|
||||||
func ReloadConfig() error {
|
func ReloadConfig() error {
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
|
|
1
main.go
1
main.go
|
@ -127,6 +127,7 @@ func main() {
|
||||||
if !ok {
|
if !ok {
|
||||||
logrus.Fatalf("加载配置失败!")
|
logrus.Fatalf("加载配置失败!")
|
||||||
}
|
}
|
||||||
|
// config.PrintConfig(cfg, "")
|
||||||
|
|
||||||
// 在 App 初始化后统一使用 app.Logger
|
// 在 App 初始化后统一使用 app.Logger
|
||||||
if err := app.initDB(); err != nil {
|
if err := app.initDB(); err != nil {
|
||||||
|
|
|
@ -5,8 +5,10 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
"go-bot/tools"
|
"go-bot/tools"
|
||||||
"os"
|
"os"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
@ -19,11 +21,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("ai", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &AI{
|
if slices.Contains(plugins, "ai") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("ai", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &AI{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type AI struct {
|
type AI struct {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package workers
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"go-bot/config"
|
"go-bot/config"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"github.com/imroc/req/v3"
|
"github.com/imroc/req/v3"
|
||||||
)
|
)
|
||||||
|
@ -84,26 +85,36 @@ func NewStdAns(parms []string, uid, gid, role, mid, rawMsg string) *StdAns {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 将 []interface{} 转换为 []string 的辅助函数
|
||||||
|
func toStringSlice(slice []interface{}) []string {
|
||||||
|
strSlice := make([]string, len(slice))
|
||||||
|
for i, v := range slice {
|
||||||
|
strSlice[i] = v.(string) // 假设切片中的元素都是 string
|
||||||
|
}
|
||||||
|
return strSlice
|
||||||
|
}
|
||||||
|
|
||||||
func (s *StdAns) CheckPermission() string {
|
func (s *StdAns) CheckPermission() string {
|
||||||
if (len(s.AllowGroup) > 0 && !contains(s.AllowGroup, s.GID)) || contains(s.BlockGroup, s.GID) {
|
if (len(s.AllowGroup) > 0 && !slices.Contains(toStringSlice(s.AllowGroup), s.GID)) || slices.Contains(toStringSlice(s.BlockGroup), s.GID) {
|
||||||
return s.GroupNotAllow
|
return s.GroupNotAllow
|
||||||
}
|
}
|
||||||
if (len(s.AllowUser) > 0 && !contains(s.AllowUser, s.UID)) || contains(s.BlockUser, s.UID) {
|
if (len(s.AllowUser) > 0 && !slices.Contains(toStringSlice(s.AllowUser), s.UID)) || slices.Contains(toStringSlice(s.BlockUser), s.UID) {
|
||||||
return s.UserNotAllow
|
return s.UserNotAllow
|
||||||
}
|
}
|
||||||
if len(s.AllowRole) > 0 && !contains(s.AllowRole, s.Role) {
|
if len(s.AllowRole) > 0 && !slices.Contains(toStringSlice(s.AllowRole), s.Role) {
|
||||||
return s.RoleNotAllow
|
return s.RoleNotAllow
|
||||||
}
|
}
|
||||||
return "ok"
|
return "ok"
|
||||||
}
|
}
|
||||||
func contains(slice []interface{}, value string) bool {
|
|
||||||
for _, item := range slice {
|
// func contains[T comparable](slice []T, value T) bool {
|
||||||
if item == value {
|
// for _, item := range slice {
|
||||||
return true
|
// if item == value {
|
||||||
}
|
// return true
|
||||||
}
|
// }
|
||||||
return false
|
// }
|
||||||
}
|
// return false
|
||||||
|
// }
|
||||||
|
|
||||||
func (s *StdAns) GetMsg() string {
|
func (s *StdAns) GetMsg() string {
|
||||||
// 暂时设置权限校验不通过什么都不提示
|
// 暂时设置权限校验不通过什么都不提示
|
||||||
|
|
|
@ -1,11 +1,19 @@
|
||||||
package workers
|
package workers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go-bot/config"
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("emm", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Emm{
|
if slices.Contains(plugins, "emm") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("emm", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Emm{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Emm struct {
|
type Emm struct {
|
||||||
|
|
|
@ -2,6 +2,8 @@ package workers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -9,11 +11,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("hhsh", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Hhsh{
|
if slices.Contains(plugins, "hhsh") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("hhsh", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Hhsh{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Hhsh struct {
|
type Hhsh struct {
|
||||||
|
|
|
@ -3,7 +3,9 @@ package workers
|
||||||
import (
|
import (
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
"io"
|
"io"
|
||||||
|
"slices"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/PuerkitoBio/goquery"
|
"github.com/PuerkitoBio/goquery"
|
||||||
|
@ -13,11 +15,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("httpcat", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &HttpCat{
|
if slices.Contains(plugins, "httpcat") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("httpcat", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &HttpCat{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type HttpCat struct {
|
type HttpCat struct {
|
||||||
|
|
|
@ -3,7 +3,9 @@ package workers
|
||||||
import (
|
import (
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
"io"
|
"io"
|
||||||
|
"slices"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/PuerkitoBio/goquery"
|
"github.com/PuerkitoBio/goquery"
|
||||||
|
@ -13,11 +15,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("httpdog", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &HttpDog{
|
if slices.Contains(plugins, "httpdog") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("httpdog", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &HttpDog{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type HttpDog struct {
|
type HttpDog struct {
|
||||||
|
|
|
@ -2,7 +2,9 @@ package workers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
"net"
|
"net"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -10,11 +12,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("ip", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Ip{
|
if slices.Contains(plugins, "ip") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("ip", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Ip{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ip struct {
|
type Ip struct {
|
||||||
|
|
|
@ -2,6 +2,8 @@ package workers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"github.com/goccy/go-json"
|
"github.com/goccy/go-json"
|
||||||
|
|
||||||
|
@ -10,11 +12,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("lsp", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Lsp{
|
if slices.Contains(plugins, "lsp") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("lsp", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Lsp{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Lsp struct {
|
type Lsp struct {
|
||||||
|
|
|
@ -2,6 +2,8 @@ package workers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
|
"slices"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
@ -10,11 +12,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("mner", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Mner{
|
if slices.Contains(plugins, "mner") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("mner", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Mner{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Mner struct {
|
type Mner struct {
|
||||||
|
|
|
@ -1,11 +1,19 @@
|
||||||
package workers
|
package workers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go-bot/config"
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("ping", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Ping{
|
if slices.Contains(plugins, "ping") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("ping", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Ping{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ping struct {
|
type Ping struct {
|
||||||
|
|
|
@ -2,6 +2,8 @@ package workers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -9,11 +11,14 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RegisterWorkerFactory("pkg", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
plugins := config.GetConfig()["PLUGINS"].([]interface{})
|
||||||
return &Pkg{
|
if slices.Contains(plugins, "pkg") {
|
||||||
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
RegisterWorkerFactory("pkg", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
}
|
return &Pkg{
|
||||||
})
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Pkg struct {
|
type Pkg struct {
|
||||||
|
|
Loading…
Reference in a new issue