go-bot/workers/core.go
liyp cdb74588b2 重构配置加载方式并引入sync.Once确保单例
将配置加载逻辑从全局变量改为使用sync.Once确保单例模式,
优化了config包的结构,现在通过GetConfig方法来获取配置,
而不是直接访问全局变量。这种方式更加线程安全,并且
允许未来在不同包中异步加载配置而无需担心初始化顺序问题。

BREAKING CHANGE: 现在必须使用config.GetConfig()来获取配置,
而不是直接访问config.GlobalConfig。这可能需要更新任何
依赖于GlobalConfig的代码。
2024-06-30 16:12:26 +08:00

121 lines
2.8 KiB
Go

package workers
import (
"bytes"
"encoding/json"
"fmt"
"go-bot/config"
"net/http"
)
type StdAns struct {
AllowGroup []string
AllowUser []string
AllowRole []string
BlockGroup []string
BlockUser []string
GroupNotAllow string
UserNotAllow string
RoleNotAllow string
Parms []string
UID string
GID string
Role string
MID string
RawMsg string
}
var cfg map[string]interface{}
func init() {
cfg = config.GetConfig()
}
func NewStdAns(parms []string, uid, gid, role, mid, rawMsg string) *StdAns {
return &StdAns{
Parms: parms,
UID: uid,
GID: gid,
Role: role,
MID: mid,
RawMsg: rawMsg,
AllowGroup: cfg["AllowGroup"].([]string),
AllowUser: cfg["AllowUser"].([]string),
AllowRole: cfg["AllowRole"].([]string),
BlockGroup: cfg["BlockGroup"].([]string),
BlockUser: cfg["BlockUser"].([]string),
GroupNotAllow: "汝所在的群组不被允许这样命令咱呢.",
UserNotAllow: "汝不被允许呢.",
RoleNotAllow: "汝的角色不被允许哦.",
}
}
func (s *StdAns) CheckPermission() string {
if (len(s.AllowGroup) > 0 && !contains(s.AllowGroup, s.GID)) || contains(s.BlockGroup, s.GID) {
return s.GroupNotAllow
}
if (len(s.AllowUser) > 0 && !contains(s.AllowUser, s.UID)) || contains(s.BlockUser, s.UID) {
return s.UserNotAllow
}
if len(s.AllowRole) > 0 && !contains(s.AllowRole, s.Role) {
return s.RoleNotAllow
}
return "0"
}
func contains(slice []string, value string) 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) SendMsg(msg string) bool {
if msg == "-1" {
return false
}
requestBody, err := json.Marshal(map[string]interface{}{
"action": "send_msg",
"params": map[string]interface{}{
"group_id": s.GID,
"message": msg,
},
})
if err != nil {
fmt.Println("Error marshaling JSON:", err)
return false
}
_, err = json.MarshalIndent(requestBody, "", " ")
if err != nil {
fmt.Println("Error marshaling JSON:", err)
return false
}
// fmt.Println(string(re))
url := cfg["POSTURL"].(string)
// println("core:", url)
// fmt.Println("请求地址:", url)
fmt.Println("响应信息:\n", msg)
resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
if err != nil {
fmt.Println("Error sending request:", err)
return false
}
defer resp.Body.Close()
// res, _ := io.ReadAll(resp.Body)
// fmt.Println("响应返回:", string(res))
return true
}