From cc43153a5401f7e79fd535f8b29267a57edc57ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 11 Jun 2022 00:55:16 +0800 Subject: [PATCH] extend regex to callbackquery --- README.md | 6 +++--- client.go | 17 ++++++++--------- engine.go | 13 ++++++++++++- event.go | 11 +++++++---- example/handler/main.go | 6 +++--- rules.go | 27 ++++++++++++++++++++------- 6 files changed, 53 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 34c335d..113e967 100644 --- a/README.md +++ b/README.md @@ -59,11 +59,11 @@ func main() { package main import ( - "log" "strings" rei "github.com/fumiama/ReiBot" tgba "github.com/go-telegram-bot-api/telegram-bot-api/v5" + log "github.com/sirupsen/logrus" ) func main() { @@ -86,7 +86,7 @@ func main() { } _, err := bot.Send(tgba.NewMessage(msg.Chat.ID, msg.Text[len("测试"):])) if err != nil { - log.Println("[ERRO]", err) + log.Errorln(err) } }, OnEditedMessage: func(updateid int, bot *rei.TelegramClient, msg *tgba.Message) { @@ -98,7 +98,7 @@ func main() { } _, err := bot.Send(tgba.NewMessage(msg.Chat.ID, "已编辑:"+msg.Text[len("测试"):])) if err != nil { - log.Println("[ERRO]", err) + log.Errorln(err) } }, }, diff --git a/client.go b/client.go index 0af4785..4fc2336 100644 --- a/client.go +++ b/client.go @@ -1,7 +1,6 @@ package rei import ( - "log" "reflect" "sync" "time" @@ -9,7 +8,7 @@ import ( "github.com/RomiChan/syncx" tgba "github.com/go-telegram-bot-api/telegram-bot-api/v5" - "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" ) // TelegramClient ... @@ -25,7 +24,7 @@ var ( func init() { logsetter.Do(func() { - _ = tgba.SetLogger(logrus.StandardLogger()) + _ = tgba.SetLogger(log.StandardLogger()) }) } @@ -42,7 +41,7 @@ func NewTelegramClient(c *Bot) (tc TelegramClient) { continue } tp := t.Field(i).Name[2:] - log.Println("[INFO] register handler", tp) + log.Println("register handler", tp) handler := f.Interface() tc.b.handlers[tp] = *(*GeneralHandleType)(unsafe.Add(unsafe.Pointer(&handler), unsafe.Sizeof(uintptr(0)))) } @@ -52,11 +51,11 @@ func NewTelegramClient(c *Bot) (tc TelegramClient) { // Connect ... func (tc *TelegramClient) Connect() { - log.Println("[INFO] 开始尝试连接到Telegram服务器, token:", tc.b.Token) + log.Println("开始尝试连接到Telegram服务器, token:", tc.b.Token) for { ba, err := tgba.NewBotAPI(tc.b.Token) if err != nil { - log.Println("[WARN] 连接到Telegram服务器时出现错误:", err, ", token:", tc.b.Token) + log.Warnln("连接到Telegram服务器时出现错误:", err, ", token:", tc.b.Token) time.Sleep(2 * time.Second) // 等待两秒后重新连接 continue } @@ -66,18 +65,18 @@ func (tc *TelegramClient) Connect() { break } clients.Store(tc.Self.ID, tc) - log.Println("[INFO] 连接到Telegram服务器成功, token:", tc.b.Token) + log.Println("连接到Telegram服务器成功, token:", tc.b.Token) } // Listen 开始监听事件 func (tc *TelegramClient) Listen() { - log.Println("[INFO] 开始监听", tc.Self.UserName, "的事件") + log.Println("开始监听", tc.Self.UserName, "的事件") for { updates := tc.GetUpdatesChan(tc.b.UpdateConfig) for update := range updates { tc.processEvent(update) } - log.Println("[WARN] Telegram服务器连接断开...") + log.Warnln("Telegram服务器连接断开...") clients.Delete(tc.Self.ID) time.Sleep(time.Millisecond * time.Duration(3)) tc.Connect() diff --git a/engine.go b/engine.go index 661c8e0..3a35d73 100644 --- a/engine.go +++ b/engine.go @@ -226,7 +226,7 @@ func OnMessageRegex(regexPattern string, rules ...Rule) *Matcher { return defaultEngine.OnMessageRegex(regexPattern, rules...) } -// OnRegex 正则触发器 +// OnMessageRegex 正则触发器 func (e *Engine) OnMessageRegex(regexPattern string, rules ...Rule) *Matcher { matcher := &Matcher{ Type: "Message", @@ -364,3 +364,14 @@ func (e *Engine) OnMessageShell(command string, model interface{}, rules ...Rule e.matchers = append(e.matchers, matcher) return StoreMatcher(matcher) } + +// OnCallbackQueryRegex 正则触发器 +func (e *Engine) OnCallbackQueryRegex(regexPattern string, rules ...Rule) *Matcher { + matcher := &Matcher{ + Type: "CallbackQuery", + Rules: append([]Rule{RegexRule(regexPattern)}, rules...), + Engine: e, + } + e.matchers = append(e.matchers, matcher) + return StoreMatcher(matcher) +} diff --git a/event.go b/event.go index 022cbb8..01dd7a7 100644 --- a/event.go +++ b/event.go @@ -1,10 +1,10 @@ package rei import ( - "log" "reflect" tgba "github.com/go-telegram-bot-api/telegram-bot-api/v5" + log "github.com/sirupsen/logrus" ) // Event ... @@ -33,7 +33,7 @@ func (tc *TelegramClient) processEvent(update tgba.Update) { matcherLock.RUnlock() continue } - log.Println("[INFO] pass", tp, "event to plugins") + log.Println("pass", tp, "event to plugins") matchers := make([]*Matcher, n) copy(matchers, matcherMap[tp]) matcherLock.RUnlock() @@ -46,8 +46,11 @@ func (tc *TelegramClient) processEvent(update tgba.Update) { State: State{}, Caller: tc, } - if tp == "Message" { + switch tp { + case "Message": ctx.Message = (*tgba.Message)(f.UnsafePointer()) + case "CallbackQuery": + ctx.Message = (*tgba.CallbackQuery)(f.UnsafePointer()).Message } match(ctx, matchers) continue @@ -56,7 +59,7 @@ func (tc *TelegramClient) processEvent(update tgba.Update) { if !ok { continue } - log.Println("[INFO] process", tp, "event") + log.Println("process", tp, "event") go h(update.UpdateID, tc, f.UnsafePointer()) } } diff --git a/example/handler/main.go b/example/handler/main.go index b702ccf..9636a98 100644 --- a/example/handler/main.go +++ b/example/handler/main.go @@ -1,11 +1,11 @@ package main import ( - "log" "strings" rei "github.com/fumiama/ReiBot" tgba "github.com/go-telegram-bot-api/telegram-bot-api/v5" + log "github.com/sirupsen/logrus" ) func main() { @@ -28,7 +28,7 @@ func main() { } _, err := bot.Send(tgba.NewMessage(msg.Chat.ID, msg.Text[len("测试"):])) if err != nil { - log.Println("[ERRO]", err) + log.Errorln(err) } }, OnEditedMessage: func(updateid int, bot *rei.TelegramClient, msg *tgba.Message) { @@ -40,7 +40,7 @@ func main() { } _, err := bot.Send(tgba.NewMessage(msg.Chat.ID, "已编辑:"+msg.Text[len("测试"):])) if err != nil { - log.Println("[ERRO]", err) + log.Errorln(err) } }, }, diff --git a/rules.go b/rules.go index e70270b..3c51522 100644 --- a/rules.go +++ b/rules.go @@ -100,15 +100,28 @@ func CommandRule(commands ...string) Rule { func RegexRule(regexPattern string) Rule { regex := regexp.MustCompile(regexPattern) return func(ctx *Ctx) bool { - msg, ok := ctx.Value.(*tgba.Message) - if !ok || msg.Text == "" { // 确保无空 + switch msg := ctx.Value.(type) { + case *tgba.Message: + if msg.Text == "" { // 确保无空 + return false + } + if matched := regex.FindStringSubmatch(msg.Text); matched != nil { + ctx.State["regex_matched"] = matched + return true + } + return false + case *tgba.CallbackQuery: + if msg.Data == "" { + return false + } + if matched := regex.FindStringSubmatch(msg.Data); matched != nil { + ctx.State["regex_matched"] = matched + return true + } + return false + default: return false } - if matched := regex.FindStringSubmatch(msg.Text); matched != nil { - ctx.State["regex_matched"] = matched - return true - } - return false } }