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 }