Documentation
¶
Index ¶
- Constants
- func GetSession(u *models.Update) (fmt.Stringer, error)
- func NewClient(ctx context.Context, token string) *client.TelegramBot
- func Recover(c *Context) (err error)
- type Context
- type Options
- type Router
- func (r *Router) All(route string, handlers ...func(*Context) error) error
- func (r *Router) CallbackQuery(route string, handlers ...func(*Context) error) error
- func (r *Router) ChannelPost(route string, handlers ...func(*Context) error) error
- func (r *Router) ChosenInlineResult(route string, handlers ...func(*Context) error) error
- func (r *Router) EditedChannelPost(route string, handlers ...func(*Context) error) error
- func (r *Router) EditedMessage(route string, handlers ...func(*Context) error) error
- func (r *Router) Handle(kind rkind, routeRegExp string, handlers ...func(*Context) error) error
- func (r *Router) InlineQuery(route string, handlers ...func(*Context) error) error
- func (r *Router) Message(route string, handlers ...func(*Context) error) error
- func (r *Router) Poll(ctx context.Context, allowed []models.AllowedUpdate) error
- func (r *Router) PreCheckout(route string, handlers ...func(*Context) error) error
- func (r *Router) Route(u *models.Update) error
- func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)
- func (r *Router) ShippingQuery(route string, handlers ...func(*Context) error) error
- func (r *Router) Use(middlewares ...func(*Context) error)
Examples ¶
Constants ¶
const ( // Kind is const to route different updates KindMessage rkind = 1 << iota KindEditedMessage KindChannelPost KindEditedChannelPost KindInlineQuery KindCallbackQuery KindChosenInlineResult KindShippingQuery KindPreCheckoutQuery KindAll rkind = (1 << iota) - 1 DefaultPollTimeout int64 = 29 )
Variables ¶
This section is empty.
Functions ¶
func GetSession ¶
GetSession is a default session repository. it's just extract a text from an update. Returns Stringer interface to be able to match the update.
func NewClient ¶
func NewClient(ctx context.Context, token string) *client.TelegramBot
Example ¶
package main
import (
"context"
"flag"
"log"
"time"
tgbot "github.com/olebedev/go-tgbot"
"github.com/olebedev/go-tgbot/client/users"
)
var token *string
func main() {
token = flag.String("token", "", "telegram bot token")
flag.Parse()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
api := tgbot.NewClient(ctx, *token)
log.Println(api.Users.GetMe(nil))
// Also, every calls could be done with given token and/or context
ctx, cancel = context.WithTimeout(ctx, 10*time.Second)
defer cancel()
t := "<overwrite default token>"
_, err := api.Users.GetMe(
users.NewGetMeParams().
WithContext(ctx).
WithToken(&t),
)
if err != nil {
// users.NewGetMeBadRequest()
if e, ok := err.(*users.GetMeBadRequest); ok {
log.Println(e.Payload.ErrorCode, e.Payload.Description)
}
}
}
Types ¶
type Context ¶
type Context struct {
Update *models.Update
Keys map[string]interface{}
Params []string
Session fmt.Stringer
Kind rkind
// contains filtered or unexported fields
}
func (*Context) FallThrough ¶
FallThrough shows that the next matched handlers should be applied.
func (*Context) Get ¶
Get returns the value for the given key, ie: (value, true). If the value does not exists it returns (nil, false)
type Options ¶
type Options struct {
Context context.Context
Token string
GetSession func(*models.Update) (fmt.Stringer, error)
}
Options ... All field are optional.
type Router ¶
type Router struct {
*client.TelegramBot
// contains filtered or unexported fields
}
Router ...
func New ¶
New returns a router.
Example ¶
package main
import (
"context"
"flag"
"log"
tgbot "github.com/olebedev/go-tgbot"
"github.com/olebedev/go-tgbot/client/messages"
"github.com/olebedev/go-tgbot/models"
)
var token *string
func main() {
token = flag.String("token", "", "telegram bot token")
flag.Parse()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
r := tgbot.New(&tgbot.Options{
Context: ctx,
Token: *token,
})
// setup global middleware
r.Use(tgbot.Recover)
// Bind handler
r.Message("^/start\\sstart$", func(c *tgbot.Context) error {
log.Println(c.Update.Message.Text)
// send greeting message back
message := "hi there what's up"
resp, err := r.Messages.SendMessage(
messages.NewSendMessageParams().WithBody(&models.SendMessageBody{
Text: &message,
ChatID: c.Update.Message.Chat.ID,
}),
)
if err != nil {
return err
}
if resp != nil {
log.Println(resp.Payload.Result.MessageID)
}
return nil
})
if err := r.Poll(ctx, []models.AllowedUpdate{models.AllowedUpdateMessage}); err != nil {
log.Fatal(err)
}
}
Example (Session) ¶
package main
import (
"context"
"flag"
"fmt"
"log"
tgbot "github.com/olebedev/go-tgbot"
"github.com/olebedev/go-tgbot/client/messages"
"github.com/olebedev/go-tgbot/models"
"app" // you application
)
type Session struct {
User *app.User
Billing *app.UserBillingInfo
// ... etc
Route string
}
func (s Session) String() string {
return s.Route
}
func GetSessionFunc(u *models.Update) (fmt.Stringer, error) {
sess, err := tgbot.GetSession(u)
if err != nil {
return nil, err
}
s := &Session{
Route: "~" + sess.String(),
}
s.User, err = app.GetUserByTgID(u.Message.From.ID)
if err != nil {
return err
}
s.Billing, err = app.GetBillingByID(s.User.ID)
if err != nil {
return err
}
if !s.Billing.Active {
s.Route = "/pay" + s.Route
}
return s, nil
}
func main() {
token := flag.String("token", "", "telegram bot token")
flag.Parse()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
r := tgbot.New(&tgbot.Options{
Context: ctx,
Token: *token,
GetSession: GetSessionFunc,
})
// setup global middleware
r.Use(tgbot.Recover)
// Bind handlers
r.Message("^/pay~.*", func(c *tgbot.Context) error {
s := c.Session.(*Session)
// TODO handle payment here before say hello
return r.Route(c.Update)
})
r.Message("^~/start\\sstart$", func(c *tgbot.Context) error {
log.Println(c.Update.Message.Text)
// send greeting message back
message := "hi there what's up"
resp, err := r.Messages.SendMessage(
messages.NewSendMessageParams().WithBody(&models.SendMessageBody{
Text: &message,
ChatID: c.Update.Message.Chat.ID,
}),
)
if err != nil {
return err
}
if resp != nil {
log.Println(resp.Payload.MessageID)
}
return nil
})
if err := r.Poll(ctx, []models.AllowedUpdate{models.AllowedUpdateMessage}); err != nil {
log.Fatal(err)
}
}
func (*Router) CallbackQuery ¶
CallbackQuery binds callback updates and the route through handler/handlers.
func (*Router) ChannelPost ¶
ChannelPost binds message updates and the route through handler/handlers.
func (*Router) ChosenInlineResult ¶
ChosenInlineResult binds chosen inline result updates and the route through handler/handlers.
func (*Router) EditedChannelPost ¶
EditedChannelPost binds message updates and the route through handler/handlers.
func (*Router) EditedMessage ¶
EditedMessage binss message updates and the route through handler/handlers.
func (*Router) InlineQuery ¶
InlineQuery binds inline queries and the route through handler/handlers.
func (*Router) Poll ¶
Poll does a polling of API endpoints and routes consumed updates. It returns an error if any of handlers return the error.
func (*Router) PreCheckout ¶
PreCheckout binds pre-checkout result updates and the route through handler/handlers.
func (*Router) Route ¶
Route routes given updates into the bound handlers through defined middlewares.
func (*Router) ServeHTTP ¶
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)
ServeHTTP implements http.ServeHTTP interface.
func (*Router) ShippingQuery ¶
ShippingQuery binds shipping result updates and the route through handler/handlers.