2024-12-05 01:00:07 +08:00
|
|
|
|
package core
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"ProjectWIND/LOG"
|
2025-04-01 01:20:35 +08:00
|
|
|
|
"ProjectWIND/database"
|
2024-12-07 17:16:44 +08:00
|
|
|
|
"ProjectWIND/wba"
|
2024-12-05 01:00:07 +08:00
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
2025-04-01 01:20:35 +08:00
|
|
|
|
"strconv"
|
2024-12-05 01:00:07 +08:00
|
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func HandleMessage(msgJson []byte) {
|
2024-12-07 17:16:44 +08:00
|
|
|
|
var msg wba.MessageEventInfo
|
2024-12-05 01:00:07 +08:00
|
|
|
|
err := json.Unmarshal(msgJson, &msg)
|
|
|
|
|
if err != nil {
|
2025-02-23 16:10:51 +08:00
|
|
|
|
LOG.Error("消息事件反序列化失败: %v", err)
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
// 处理消息
|
2025-02-23 16:10:51 +08:00
|
|
|
|
LOG.Info("收到消息:(来自:%v-%v:%v-%v)%v", msg.MessageType, msg.GroupId, msg.UserId, msg.Sender.Nickname, msg.RawMessage)
|
2025-04-22 12:28:44 +08:00
|
|
|
|
isCmd, ok, err := CmdHandle(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
LOG.Error("命令处理失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !isCmd && ok {
|
|
|
|
|
// 处理消息
|
|
|
|
|
// TODO: 处理消息
|
|
|
|
|
}
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func HandleNotice(msgJson []byte) {
|
2024-12-07 17:16:44 +08:00
|
|
|
|
var notice wba.NoticeEventInfo
|
2024-12-05 01:00:07 +08:00
|
|
|
|
err := json.Unmarshal(msgJson, ¬ice)
|
|
|
|
|
if err != nil {
|
2025-02-23 16:10:51 +08:00
|
|
|
|
LOG.Error("通知事件反序列化失败: %v", err)
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
// TODO: 处理通知
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func HandleRequest(msgJson []byte) {
|
2024-12-07 17:16:44 +08:00
|
|
|
|
var request wba.NoticeEventInfo
|
2024-12-05 01:00:07 +08:00
|
|
|
|
err := json.Unmarshal(msgJson, &request)
|
|
|
|
|
if err != nil {
|
2025-02-23 16:10:51 +08:00
|
|
|
|
LOG.Error("请求事件反序列化失败: %v", err)
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
// TODO: 处理请求
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func HandleMetaEvent(msgJson []byte) {
|
2024-12-07 17:16:44 +08:00
|
|
|
|
var meta wba.NoticeEventInfo
|
2024-12-05 01:00:07 +08:00
|
|
|
|
err := json.Unmarshal(msgJson, &meta)
|
|
|
|
|
if err != nil {
|
2025-02-23 16:10:51 +08:00
|
|
|
|
LOG.Error("元事件反序列化失败: %v", err)
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
// TODO: 处理元事件
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-22 12:28:44 +08:00
|
|
|
|
func CmdHandle(msg wba.MessageEventInfo) (isCmd bool, ok bool, err error) {
|
2025-04-01 01:20:35 +08:00
|
|
|
|
// 获取消息的原始文本
|
|
|
|
|
text := msg.GetText()
|
|
|
|
|
// 初始化会话工作状态
|
2025-04-22 12:28:44 +08:00
|
|
|
|
session := wba.SessionInfo{}
|
|
|
|
|
session = session.Load("QQ", msg)
|
|
|
|
|
// 从数据库加载配置
|
|
|
|
|
conf, ok := database.MasterGet("GCAS_Config", session.SessionType, strconv.FormatInt(session.SessionId, 10), "GCAS_Config")
|
|
|
|
|
if !ok {
|
|
|
|
|
conf = "{}"
|
|
|
|
|
}
|
|
|
|
|
if err = GlobalCmdAgentSelector.LoadConfig(session, conf.(string)); err != nil {
|
|
|
|
|
LOG.Error("加载配置失败: %v", err)
|
|
|
|
|
return false, false, err
|
|
|
|
|
}
|
2025-04-01 01:20:35 +08:00
|
|
|
|
|
2025-04-22 12:28:44 +08:00
|
|
|
|
// 检查命令前缀
|
|
|
|
|
for _, prefix := range cmdPrefix {
|
|
|
|
|
if strings.HasPrefix(text, prefix) {
|
|
|
|
|
// 解析命令
|
|
|
|
|
text = strings.TrimPrefix(text, prefix)
|
|
|
|
|
cmdSlice := strings.Split(text, " ")
|
|
|
|
|
if text == "" {
|
|
|
|
|
return false, true, nil
|
2025-04-01 01:20:35 +08:00
|
|
|
|
}
|
2025-04-22 12:28:44 +08:00
|
|
|
|
cmd := cmdSlice[0]
|
|
|
|
|
args := cmdSlice[1:]
|
2025-04-01 01:20:35 +08:00
|
|
|
|
|
2025-04-22 12:28:44 +08:00
|
|
|
|
result, count := GlobalCmdAgentSelector.FindCmd(cmd, true)
|
|
|
|
|
if count == 0 {
|
|
|
|
|
LOG.Debug("未找到命令: %s", cmd)
|
|
|
|
|
return false, true, nil
|
|
|
|
|
}
|
2025-04-01 01:20:35 +08:00
|
|
|
|
|
2025-04-22 12:28:44 +08:00
|
|
|
|
// 执行找到的第一个匹配命令
|
|
|
|
|
cmdFunc := result[0]
|
|
|
|
|
if err := safeExecuteCmd(cmdFunc, args, msg); err != nil {
|
|
|
|
|
LOG.Error("执行命令失败: %v", err)
|
|
|
|
|
return true, false, err
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
2025-04-22 12:28:44 +08:00
|
|
|
|
return true, true, nil
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-22 12:28:44 +08:00
|
|
|
|
return false, true, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func safeExecuteCmd(cmdFunc wba.Cmd, args []string, msg wba.MessageEventInfo) (err error) {
|
|
|
|
|
defer func() {
|
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
|
err = fmt.Errorf("%v", r)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
cmdFunc.Solve(args, msg)
|
|
|
|
|
return nil
|
2024-12-05 01:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var cmdPrefix = []string{"/", "!", "/", "!", ".", "。"}
|