1
bot/handlers.go

153 lines
2.9 KiB
Go
Raw Permalink Normal View History

2022-04-26 00:02:51 +08:00
package bot
import (
"regexp"
"strings"
"github.com/go-telegram/bot/models"
2022-04-26 00:02:51 +08:00
)
type HandlerType int
const (
HandlerTypeMessageText HandlerType = iota
HandlerTypeCallbackQueryData
HandlerTypeCallbackQueryGameShortName
HandlerTypePhotoCaption
2022-04-26 00:02:51 +08:00
)
type MatchType int
const (
MatchTypeExact MatchType = iota
MatchTypePrefix
MatchTypeContains
matchTypeRegexp
matchTypeFunc
2022-04-26 00:02:51 +08:00
)
type handler struct {
2024-09-16 16:38:22 +08:00
id string
2022-04-26 00:02:51 +08:00
handlerType HandlerType
matchType MatchType
handler HandlerFunc
pattern string
re *regexp.Regexp
matchFunc MatchFunc
2022-04-26 00:02:51 +08:00
}
func (h handler) match(update *models.Update) bool {
if h.matchType == matchTypeFunc {
return h.matchFunc(update)
}
var data string
2024-09-10 23:24:43 +08:00
switch h.handlerType {
case HandlerTypeMessageText:
2024-09-10 23:24:43 +08:00
if update.Message == nil {
return false
}
data = update.Message.Text
case HandlerTypeCallbackQueryData:
2024-09-10 23:24:43 +08:00
if update.CallbackQuery == nil {
return false
}
data = update.CallbackQuery.Data
case HandlerTypeCallbackQueryGameShortName:
2024-12-23 16:12:50 +08:00
if update.CallbackQuery == nil {
return false
}
data = update.CallbackQuery.GameShortName
case HandlerTypePhotoCaption:
2024-12-23 16:12:50 +08:00
if update.Message == nil {
return false
}
data = update.Message.Caption
}
2022-04-26 00:02:51 +08:00
if h.matchType == MatchTypeExact {
return data == h.pattern
}
if h.matchType == MatchTypePrefix {
return strings.HasPrefix(data, h.pattern)
}
if h.matchType == MatchTypeContains {
return strings.Contains(data, h.pattern)
}
if h.matchType == matchTypeRegexp {
2022-04-26 00:02:51 +08:00
return h.re.Match([]byte(data))
}
return false
}
func (b *Bot) RegisterHandlerMatchFunc(matchFunc MatchFunc, f HandlerFunc, m ...Middleware) string {
b.handlersMx.Lock()
defer b.handlersMx.Unlock()
id := RandomString(16)
h := handler{
2024-09-16 16:38:22 +08:00
id: id,
matchType: matchTypeFunc,
matchFunc: matchFunc,
handler: applyMiddlewares(f, m...),
}
2024-09-16 16:38:22 +08:00
b.handlers = append(b.handlers, h)
return id
}
func (b *Bot) RegisterHandlerRegexp(handlerType HandlerType, re *regexp.Regexp, f HandlerFunc, m ...Middleware) string {
2022-04-26 00:02:51 +08:00
b.handlersMx.Lock()
defer b.handlersMx.Unlock()
id := RandomString(16)
h := handler{
2024-09-16 16:38:22 +08:00
id: id,
2022-04-26 00:02:51 +08:00
handlerType: handlerType,
matchType: matchTypeRegexp,
re: re,
handler: applyMiddlewares(f, m...),
2022-04-26 00:02:51 +08:00
}
2024-09-16 16:38:22 +08:00
b.handlers = append(b.handlers, h)
return id
}
func (b *Bot) RegisterHandler(handlerType HandlerType, pattern string, matchType MatchType, f HandlerFunc, m ...Middleware) string {
b.handlersMx.Lock()
defer b.handlersMx.Unlock()
id := RandomString(16)
2022-04-26 00:02:51 +08:00
h := handler{
2024-09-16 16:38:22 +08:00
id: id,
handlerType: handlerType,
matchType: matchType,
pattern: pattern,
handler: applyMiddlewares(f, m...),
2022-04-26 00:02:51 +08:00
}
2024-09-16 16:38:22 +08:00
b.handlers = append(b.handlers, h)
2022-04-26 00:02:51 +08:00
return id
2022-04-26 00:02:51 +08:00
}
func (b *Bot) UnregisterHandler(id string) {
b.handlersMx.Lock()
defer b.handlersMx.Unlock()
2024-09-16 16:38:22 +08:00
for i, h := range b.handlers {
if h.id == id {
b.handlers = append(b.handlers[:i], b.handlers[i+1:]...)
return
}
}
2022-04-26 00:02:51 +08:00
}