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) } } }
Output:
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) } }
Output:
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) } }
Output:
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.