From b19ffa1b4545f4b672d41b6da0d1fac162c42abe Mon Sep 17 00:00:00 2001 From: Ian Byrd Date: Tue, 15 Aug 2017 18:00:22 +0300 Subject: [PATCH 1/5] Experimental handlers API added. --- bot.go | 8 +++++++- handlers.go | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 handlers.go diff --git a/bot.go b/bot.go index 611a675..c70f770 100644 --- a/bot.go +++ b/bot.go @@ -6,6 +6,7 @@ import ( "strconv" "time" + "github.com/armon/go-radix" "github.com/pkg/errors" ) @@ -20,12 +21,17 @@ type Bot struct { // Telebot debugging channel. If present, Telebot // will use it to report all occuring errors. Errors chan error + + tree *radix.Tree } // NewBot does try to build a Bot with token `token`, which // is a secret API key assigned to particular bot. func NewBot(token string) (*Bot, error) { - bot := &Bot{Token: token} + bot := &Bot{ + Token: token, + tree: radix.New(), + } user, err := bot.getMe() if err != nil { diff --git a/handlers.go b/handlers.go new file mode 100644 index 0000000..dd78235 --- /dev/null +++ b/handlers.go @@ -0,0 +1,27 @@ +package telebot + +// Default handler prefix. +const Default string = "" + +type Context struct { + Bot *Bot + Msg *Message +} + +type Handler func(Context) + +func (b *Bot) Handle(prefix string, handler Handler) { + b.tree.Insert(prefix, handler) +} + +func (b *Bot) Serve(msg *Message) { + request := msg.Text + + _, value, _ := b.tree.LongestPrefix(request) + + if endpoint, ok := value.(Handler); ok { + endpoint(Context{b, msg}) + } else { + panic("telebot: couldn't find a route") + } +} From b718278f363555d095799155223ecfc9c91ccfd5 Mon Sep 17 00:00:00 2001 From: Ian Byrd Date: Thu, 17 Aug 2017 19:18:36 +0300 Subject: [PATCH 2/5] Fixing excessive panicing. --- handlers.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/handlers.go b/handlers.go index dd78235..fba7b90 100644 --- a/handlers.go +++ b/handlers.go @@ -21,7 +21,5 @@ func (b *Bot) Serve(msg *Message) { if endpoint, ok := value.(Handler); ok { endpoint(Context{b, msg}) - } else { - panic("telebot: couldn't find a route") } } From ad382bdb6bee9aaaec98abdfde1d45306d71de77 Mon Sep 17 00:00:00 2001 From: Ian Byrd Date: Thu, 17 Aug 2017 19:34:38 +0300 Subject: [PATCH 3/5] Context.Msg -> Context.Message (for consistency). --- handlers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/handlers.go b/handlers.go index fba7b90..a2de2a2 100644 --- a/handlers.go +++ b/handlers.go @@ -4,8 +4,8 @@ package telebot const Default string = "" type Context struct { - Bot *Bot - Msg *Message + Bot *Bot + Message *Message } type Handler func(Context) From 7acb52c3cf9ae326abf5c7ef4a573b9d6e41acd0 Mon Sep 17 00:00:00 2001 From: Ian Byrd Date: Sat, 19 Aug 2017 15:25:35 +0300 Subject: [PATCH 4/5] Handlers will be executed in separate goroutines. --- handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers.go b/handlers.go index a2de2a2..01bf058 100644 --- a/handlers.go +++ b/handlers.go @@ -20,6 +20,6 @@ func (b *Bot) Serve(msg *Message) { _, value, _ := b.tree.LongestPrefix(request) if endpoint, ok := value.(Handler); ok { - endpoint(Context{b, msg}) + go endpoint(Context{b, msg}) } } From f7a78ef0fc37733b61601927b17ec9c51b86157f Mon Sep 17 00:00:00 2001 From: Ian Byrd Date: Sat, 19 Aug 2017 18:58:10 +0300 Subject: [PATCH 5/5] Message should be passed by-value. --- handlers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/handlers.go b/handlers.go index 01bf058..1b9ea72 100644 --- a/handlers.go +++ b/handlers.go @@ -5,7 +5,7 @@ const Default string = "" type Context struct { Bot *Bot - Message *Message + Message Message } type Handler func(Context) @@ -14,7 +14,7 @@ func (b *Bot) Handle(prefix string, handler Handler) { b.tree.Insert(prefix, handler) } -func (b *Bot) Serve(msg *Message) { +func (b *Bot) Serve(msg Message) { request := msg.Text _, value, _ := b.tree.LongestPrefix(request)