Skip to content

Commit

Permalink
Update Plugin Loading Adaptation
Browse files Browse the repository at this point in the history
  • Loading branch information
BoyChai committed May 19, 2023
1 parent eef0c9b commit 9f7b1ca
Show file tree
Hide file tree
Showing 9 changed files with 290 additions and 152 deletions.
5 changes: 0 additions & 5 deletions developers/config.go

This file was deleted.

103 changes: 103 additions & 0 deletions developers/deployment.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package developers

import (
"errors"
"fmt"
"github.com/BoyChai/CoralBot/action"
"github.com/BoyChai/CoralBot/task"
"gopkg.in/yaml.v3"
"os"
)

func init() {
var err error
handler, err = readConfig()
if err != nil {
fmt.Println("读取插件配置文件出现错误。")
return
}
}

func readConfig() (Handler, error) {
var c pluginConfig
var all Handler
var my Handler
var n Handler
data, err := os.ReadFile("./config.yaml")
if err != nil {
return n, err
}
err = yaml.Unmarshal(data, &c)
if err != nil {
return Handler{}, err
}
for _, value := range c.Handler {
if value.Name == information.Name {
my = value
continue
}
if value.Name == "all" {
all = value
continue
}
}

if my != n {
return my, nil
}
if all != n {
return all, nil
}
return Handler{}, errors.New("未读取到配置文件")
}

// func GetEvent() interface{} {
// return &event
// }

func GetConfigQQHandler() *action.QQHandle {
return &action.QQHandle{
Host: handler.Host,
Agreement: handler.Agreement,
}
}

func GetConfigDingDingHandler() *action.DingDingHandle {
return &action.DingDingHandle{
AppKey: handler.AppKey,
AppSecret: handler.AppSecret,
}
}

//func GetHandler() interface{} {
// return &han
//}

//func GetHandlers() []Handle {
// return handles
//}

func SetInfo(info task.Info) {
information = info
}

// NewTask 创建插件任务
func NewTask(t task.Task) {
//task.NewPluginTask(t)
task.Tasks = append(task.Tasks, t)
}

// func NewHandles(name string, run func(event *bot.Event) error) {
// func NewHandles(name string, run func(event *bot.QQEvent) error) {
//func NewHandles(name string, run func(event interface{}) error) {
// handles = append(handles, Handle{
// name: name,
// run: run,
// })
//}

//func BuildPlugin() {
// plugin := &Plugin{}
// pingo.Register(plugin)
// pingo.Run()
//}
44 changes: 44 additions & 0 deletions developers/init.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package developers

import (
"github.com/BoyChai/CoralBot/task"
)

//type Handle struct {
// name string
// //run func(event *bot.Event) error
// //run func(event *bot.QQEvent) error
// run func(event interface{}) error
//}

type pluginConfig struct {
Handler []Handler `yaml:"handler"`
}

type Handler struct {
Name string `yaml:"name"`
Host string `yaml:"host"`
Agreement string `yaml:"agreement"`
AppKey string `yaml:"appKey"`
AppSecret string `yaml:"appSecret"`
}

var handler Handler

// var event bot.Event
// var event bot.QQEvent
//var event interface{}

//var qqEvent bot.QQEvent

//var dingDingEvent bot.DingDingEvent

//var qqHan action.QQHandle

//var dingDingHan action.DingDingHandle

var information task.Info

//type Plugin struct{}

//var handles []Handle
119 changes: 47 additions & 72 deletions developers/plugin.go
Original file line number Diff line number Diff line change
@@ -1,87 +1,62 @@
package developers

import (
"encoding/gob"
"fmt"
"github.com/BoyChai/CoralBot/bot"
"github.com/BoyChai/CoralBot/task"
"github.com/BoyChai/CoralBot/plugin"
"net"
"os"
)

func RunPlugin() {
//// 删除已经存在的套接字文件
if err := os.RemoveAll(getSocketName(true)); err != nil {
fmt.Println("flow: 1;启动插件出现错误:", err)
return
}
//// 监听 Unix 域套接字
listener, err := net.Listen("unix", getSocketName(true))
if err != nil {
fmt.Println("flow: 2;启动插件出现错误:", err)
return
}
//func (p *Plugin) PluginInfo(n string, info *task.Info) error {
// *info = information
// c, err := readConfig()
// if err != nil {
// return err
// }
// switch info.Type {
// case task.QQ:
// h := GetQQHandler()
// h.Host = c.Host
// h.Agreement = c.Agreement
// case task.DingDing:
// h := GetDingDingHandler()
// h.AppKey = c.AppKey
// h.AppSecret = c.AppSecret
// }
//
// return nil
//}

// 第一次发包 声明我是谁
accept, err := listener.Accept()
if err != nil {
fmt.Println("flow: 3;启动插件出现错误:", err)
return
}
encoder := gob.NewEncoder(accept)
err = encoder.Encode(getSocketName(false))
if err != nil {
fmt.Println("flow: 4;启动插件出现错误:", err)
return
}
//func (p *Plugin) GetPlugin(e interface{}, Task *[]task.Task) error {
// //func (p *Plugin) GetPlugin(e *bot.Event, Task *[]task.Task) error {
// event = e
// *Task = task.Tasks
// return nil
//}

// 接收数据 确定CoralBot已经成功拿到数据并返回over
var over = false
decoder := gob.NewDecoder(accept)
decoder.Decode(&over)
if !over {
fmt.Println("flow: 5;启动插件出现错误: CoralBot服务端出现错误")
listener.Close()
os.RemoveAll(getSocketName(true))
return
}
listener.Close()
os.RemoveAll(getSocketName(true))
runTask()

}
//func (p *Plugin) Handles(e interface{}, n *string) error {
// //func (p *Plugin) Handles(e *bot.QQEvent, n *string) error {
// //func (p *Plugin) Handles(e bot.Event, n *string) error {
// for _, value := range handles {
// if e.(*bot.QQEvent).GetRunName() == value.name {
// err := value.run(e)
// if err != nil {
// return err
// }
// }
// }
// return nil
//}

func getSocketName(t bool) string {
// 第一次发包的名字
if t {
return "." + Cfg.Name + ".sock"
}
// 第二次发包的名字
return fmt.Sprint("."+Cfg.Name+"@", os.Getpid(), ".sock")
}

func runTask() {
//// 监听 Unix 域套接字
listener, err := net.Listen("unix", getSocketName(false))
func RunPlugin(event bot.Event) {
SocketFile := "CoralBot.sock"
//conn, err := net.Dial("unix", config.SocketFile)
conn, err := net.Dial("unix", SocketFile)
if err != nil {
fmt.Println("flow: 6;启动插件出现错误:", err)
fmt.Println("socket连接失败。请检查CoralBot是否启动。")
return
}
for {
accept, err := listener.Accept()
if err != nil {
fmt.Println("flow: 7;启动插件出现错误:", err)
}
var bodyData []byte
decoder := gob.NewDecoder(accept)
decoder.Decode(&bodyData)
switch Cfg.Type {
case task.QQ:
var event bot.QQEvent
event.Explain(bodyData)
case task.DingDing:
var event bot.DingDingEvent
event.Explain(bodyData)
}
}
plugin.WriteInfo(information, conn)
data := plugin.ReadData(conn)
event.Explain(data)
}
12 changes: 12 additions & 0 deletions developers/template.config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
handler:
# qq的配置
- name: "all"
host: "192.168.1.1:5700"
agreement: "http"
- name: "demo"
host: "127.0.0.1:5700"
agreement: "http"
# 钉钉的配置
- name: "demo2"
appKey: ""
appSecret: ""
2 changes: 1 addition & 1 deletion plugin/gob.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func ReadInfo(network net.Conn) task.Info {
decoder := gob.NewDecoder(network)
err := decoder.Decode(&data)
if err != nil {
fmt.Println("插件读取错误,gob解码错误,err:", err)
fmt.Println("插件读取错误,gob解码错误或CoralBot已停止运行,err:", err)
}
return data
}
Expand Down
27 changes: 22 additions & 5 deletions plugin/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package plugin

import (
"fmt"
"github.com/BoyChai/CoralBot/config"
"github.com/BoyChai/CoralBot/task"
"net"
"os"
Expand All @@ -12,16 +13,16 @@ var Infos []task.Info
var accepts []net.Conn

func StartSocket() {
socketFile := "CoralBot.sock"

SocketFile := "CoralBot.sock"
// 删除已经存在的套接字文件
if err := os.RemoveAll(socketFile); err != nil {
//if err := os.RemoveAll(config.SocketFile); err != nil {
if err := os.RemoveAll(SocketFile); err != nil {
fmt.Println("removing plugin socket file:", err)
return
}

// 监听 Unix 域套接字
listener, err := net.Listen("unix", socketFile)
listener, err := net.Listen("unix", SocketFile)
if err != nil {
fmt.Println("Error listening on plugin socket:", err)
return
Expand All @@ -37,7 +38,23 @@ func receiveInformation(listener net.Listener) {
fmt.Println("Error accepting plugin connection:", err)
continue
}
Infos = append(Infos, ReadInfo(conn))
info := ReadInfo(conn)
Infos = append(Infos, info)
if config.Cfg.PluginInfo {
fmt.Println("Loading succeeded:", info.Name)
fmt.Println("===============Plugin-Info===============")
fmt.Println("插件名称:", info.Name)
fmt.Println("插件版本:", info.Version)
fmt.Println("插件概述:", info.Summary)
fmt.Println("插件作者:", info.Developer)
fmt.Println("作者邮箱:", info.Email)
fmt.Println("=========================================")
fmt.Println("CoralBot加载插件数量为:", len(Infos))
} else {
fmt.Println("Loading succeeded:", info.Name)
fmt.Println("CoralBot加载插件数量为:", len(Infos))
}

}
}

Expand Down
Loading

0 comments on commit 9f7b1ca

Please sign in to comment.