ProjectWIND/core/events_handler.go
2025-04-22 12:28:44 +08:00

115 lines
2.8 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 core
import (
"ProjectWIND/LOG"
"ProjectWIND/database"
"ProjectWIND/wba"
"encoding/json"
"fmt"
"strconv"
"strings"
)
func HandleMessage(msgJson []byte) {
var msg wba.MessageEventInfo
err := json.Unmarshal(msgJson, &msg)
if err != nil {
LOG.Error("消息事件反序列化失败: %v", err)
}
// 处理消息
LOG.Info("收到消息:(来自:%v-%v:%v-%v)%v", msg.MessageType, msg.GroupId, msg.UserId, msg.Sender.Nickname, msg.RawMessage)
isCmd, ok, err := CmdHandle(msg)
if err != nil {
LOG.Error("命令处理失败: %v", err)
}
if !isCmd && ok {
// 处理消息
// TODO: 处理消息
}
}
func HandleNotice(msgJson []byte) {
var notice wba.NoticeEventInfo
err := json.Unmarshal(msgJson, &notice)
if err != nil {
LOG.Error("通知事件反序列化失败: %v", err)
}
// TODO: 处理通知
}
func HandleRequest(msgJson []byte) {
var request wba.NoticeEventInfo
err := json.Unmarshal(msgJson, &request)
if err != nil {
LOG.Error("请求事件反序列化失败: %v", err)
}
// TODO: 处理请求
}
func HandleMetaEvent(msgJson []byte) {
var meta wba.NoticeEventInfo
err := json.Unmarshal(msgJson, &meta)
if err != nil {
LOG.Error("元事件反序列化失败: %v", err)
}
// TODO: 处理元事件
}
func CmdHandle(msg wba.MessageEventInfo) (isCmd bool, ok bool, err error) {
// 获取消息的原始文本
text := msg.GetText()
// 初始化会话工作状态
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
}
// 检查命令前缀
for _, prefix := range cmdPrefix {
if strings.HasPrefix(text, prefix) {
// 解析命令
text = strings.TrimPrefix(text, prefix)
cmdSlice := strings.Split(text, " ")
if text == "" {
return false, true, nil
}
cmd := cmdSlice[0]
args := cmdSlice[1:]
result, count := GlobalCmdAgentSelector.FindCmd(cmd, true)
if count == 0 {
LOG.Debug("未找到命令: %s", cmd)
return false, true, nil
}
// 执行找到的第一个匹配命令
cmdFunc := result[0]
if err := safeExecuteCmd(cmdFunc, args, msg); err != nil {
LOG.Error("执行命令失败: %v", err)
return true, false, err
}
return true, true, nil
}
}
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
}
var cmdPrefix = []string{"/", "!", "", "", ".", "。"}