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