go-bot/workers/core.go

218 lines
5.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package workers
import (
"fmt"
"go-bot/config"
"slices"
"github.com/imroc/req/v3"
)
type Worker interface {
CheckPermission() string
GetMsg() string
SendMsg(msg string) bool
GetImage(file string) string
GetHisMsg(id string) (string, string, string)
}
type StdAns struct {
AllowGroup []interface{}
AllowUser []interface{}
AllowRole []interface{}
BlockGroup []interface{}
BlockUser []interface{}
Master []interface{}
GroupNotAllow string
UserNotAllow string
RoleNotAllow string
Parms []string
UID string
GID string
Role string
MID string
RawMsg string
}
// 定义一个map类型的cfg用于存储配置信息
var cfg map[string]interface{}
// 定义一个WorkerFactory类型的函数用于创建Worker
type WorkerFactory func(parms []string, uid, gid, role, mid, rawMsg string) Worker
// 定义一个workerFactories的map用于存储WorkerFactory
var workerFactories = make(map[string]WorkerFactory)
// 定义一个RegisterWorkerFactory函数用于注册WorkerFactory
func RegisterWorkerFactory(name string, factory WorkerFactory) {
workerFactories[name] = factory
fmt.Printf("Register WorkerFactory: %s\n", name)
}
// 定义一个NewWorker函数用于创建Worker
func NewWorker(parms []string, uid, gid, role, mid, rawMsg string) Worker {
fmt.Printf("NewWorker: %s, %s, %s, %s, %s\n", parms, uid, gid, role, mid)
if factory, ok := workerFactories[parms[0]]; ok {
fmt.Printf("Use WorkerFactory: %s\n", parms[0])
return factory(parms, uid, gid, role, mid, rawMsg)
}
return &Emm{
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
}
}
func NewStdAns(parms []string, uid, gid, role, mid, rawMsg string) *StdAns {
// var cfg map[string]interface{}
cfg = config.GetConfig()
// println("AllowGroup:", cfg["AllowGroup"].([]interface{}))
return &StdAns{
Parms: parms,
UID: uid,
GID: gid,
Role: role,
MID: mid,
RawMsg: rawMsg,
AllowGroup: cfg["AllowGroup"].([]interface{}),
AllowUser: cfg["AllowUser"].([]interface{}),
AllowRole: cfg["AllowRole"].([]interface{}),
BlockGroup: cfg["BlockGroup"].([]interface{}),
BlockUser: cfg["BlockUser"].([]interface{}),
Master: cfg["Master"].([]interface{}),
GroupNotAllow: "汝所在的群组不被允许这样命令咱呢.",
UserNotAllow: "汝不被允许呢.",
RoleNotAllow: "汝的角色不被允许哦.",
}
}
// 将 []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 {
if (len(s.AllowGroup) > 0 && !slices.Contains(toStringSlice(s.AllowGroup), s.GID)) || slices.Contains(toStringSlice(s.BlockGroup), s.GID) {
return s.GroupNotAllow
}
if (len(s.AllowUser) > 0 && !slices.Contains(toStringSlice(s.AllowUser), s.UID)) || slices.Contains(toStringSlice(s.BlockUser), s.UID) {
return s.UserNotAllow
}
if len(s.AllowRole) > 0 && !slices.Contains(toStringSlice(s.AllowRole), s.Role) {
return s.RoleNotAllow
}
return "ok"
}
// func contains[T comparable](slice []T, value T) bool {
// for _, item := range slice {
// if item == value {
// return true
// }
// }
// return false
// }
func (s *StdAns) GetMsg() string {
// 暂时设置权限校验不通过什么都不提示
return "-1"
// if s.Parms[0] != "" {
// return "咱也不知道 " + s.Parms[0] + "是啥呢!"
// } else {
// return "汝再调戏咱,咱可就生气了!!"
// }
}
func (s *StdAns) GetHisMsg(id string) (string, string, string) {
if id == "" {
return "", "", ""
}
url := cfg["POSTURL"].(string) + "/get_msg?message_id=" + id
var data map[string]interface{}
cli := req.C()
resp, err := cli.R().
SetSuccessResult(&data).
Get(url)
if err != nil {
fmt.Println("Error sending request:", err)
return "", "", ""
}
defer resp.Body.Close()
if data["status"] == "ok" {
message := data["data"].(map[string]interface{})["message"].([]interface{})[0].(map[string]interface{})["data"].(map[string]interface{})
return message["file"].(string), message["url"].(string), message["file_size"].(string)
} else {
// fmt.Println("响应返回:", body)
return "", "", ""
// println("raw_message", raw_message)
}
}
func (s *StdAns) SendMsg(msg string) bool {
if msg == "-1" {
return false
}
url := cfg["POSTURL"].(string) + "/send_msg"
// println("core:", url)
// fmt.Println("请求地址:", url)
// fmt.Println("响应信息:\n", msg)
client := req.C()
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBodyJsonMarshal(map[string]interface{}{
// "action": "send_msg",
// "params": map[string]interface{}{
"group_id": s.GID,
"message": msg,
// },
}).
Post(url)
if err != nil {
fmt.Println("Error sending request:", err)
return false
}
defer resp.Body.Close()
// res, _ := io.ReadAll(resp.Body)
// fmt.Println("响应返回:", body)
return true
}
func (s *StdAns) GetImage(file string) string {
if file == "" {
return ""
}
url := cfg["POSTURL"].(string) + "/get_image?file=" + file
client := req.C()
var data map[string]interface{}
resp, err := client.R().
SetSuccessResult(&data).
Get(url)
if err != nil {
fmt.Println("Error sending request:", err)
return ""
}
defer resp.Body.Close()
// fmt.Println("url:", url)
path, ok := data["data"].(map[string]interface{})["file"].(string)
if !ok {
return ""
} else {
// fmt.Println("响应返回:", body)
return path
}
}