qq_bot/handler/handler.go
2024-10-15 23:07:49 +08:00

93 lines
2.3 KiB
Go

package handler
import (
"log"
"strings"
"git.lxtend.com/qqbot/model"
)
type Handler func(msg model.Message) (reply model.Reply)
type TryCatchHandler func(msg model.Message) (reply model.Reply, catched bool)
var handlers = make(map[string]Handler)
var frontMatchHandlers = make(map[string]Handler)
var liveHandlers = make(map[int64]map[int64]TryCatchHandler)
var livePrivateHandlers = make(map[int64]TryCatchHandler)
var HelpInforms = make(map[string]string)
var privateAllHandler Handler
func RegisterPrivateHandler(handler Handler) {
privateAllHandler = handler
}
func RegisterHandler(trigger string, handler Handler) {
handlers[trigger] = handler
}
func RegisterFrontMatchHandler(trigger string, handler Handler) {
frontMatchHandlers[trigger] = handler
}
func RegisterLiveHandler(groupID int64, userID int64, handler TryCatchHandler) { //userID=-1 means for all users in groupID
if groupID == 0 {
livePrivateHandlers[userID] = handler
return
}
if _, ok := liveHandlers[groupID]; !ok {
liveHandlers[groupID] = make(map[int64]TryCatchHandler)
}
liveHandlers[groupID][userID] = handler
}
func MsgInHandler(msg model.Message) (reply model.Reply) {
defer func() {
if r := recover(); r != nil {
log.Default().Printf("Recovered in MsgInHandler: %v", r)
}
}()
if msg.RawMsg != "" {
log.Default().Printf("M:%v", msg)
} else {
return model.Reply{}
}
defer func() {
if reply.ReplyMsg != "" {
log.Default().Printf("R:%v", reply)
}
}()
if handlerUserID, ok := liveHandlers[msg.GroupInfo.GroupId]; ok {
if handler, ok := handlerUserID[msg.UserId]; ok {
defer func() { liveHandlers[msg.GroupInfo.GroupId][msg.UserId] = nil }()
reply, catched := handler(msg)
if catched {
return reply
}
}
}
if handler, ok := livePrivateHandlers[msg.UserId]; ok {
defer func() { livePrivateHandlers[msg.UserId] = nil }()
reply, catched := handler(msg)
if catched {
return reply
}
}
for trigger, handler := range frontMatchHandlers {
if strings.HasPrefix(msg.RawMsg, trigger) {
return handler(msg)
}
}
msgArray := strings.Split(msg.RawMsg, " ")
if handler, ok := handlers[msgArray[0]]; ok {
return handler(msg)
}
if !msg.GroupInfo.IsGroupMsg && privateAllHandler != nil {
return privateAllHandler(msg)
}
return model.Reply{}
}
func RegisterHelpInform(triggerName string, inform string) {
HelpInforms[triggerName] = inform
}