telebot/bot.go

1098 lines
26 KiB
Go
Raw Normal View History

package telebot
import (
2015-07-03 18:54:40 +00:00
"encoding/json"
"fmt"
2015-11-16 10:22:37 +00:00
"log"
2015-07-03 18:54:40 +00:00
"strconv"
"time"
)
// Bot represents a separate Telegram bot instance.
type Bot struct {
Token string
Identity User
Messages chan Message
Queries chan Query
Callbacks chan Callback
}
2015-07-03 18:54:40 +00:00
// 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) {
user, err := getMe(token)
if err != nil {
return nil, err
}
return &Bot{
Token: token,
Identity: user,
}, nil
}
// Listen periodically looks for updates and delivers new messages
2015-11-16 10:22:37 +00:00
// to the subscription channel.
func (b *Bot) Listen(subscription chan Message, timeout time.Duration) {
go b.poll(subscription, nil, nil, timeout)
}
// Start periodically polls messages and/or updates to corresponding channels
// from the bot object.
func (b *Bot) Start(timeout time.Duration) {
b.poll(b.Messages, b.Queries, b.Callbacks, timeout)
}
2015-11-16 10:22:37 +00:00
func (b *Bot) poll(
messages chan Message,
queries chan Query,
callbacks chan Callback,
timeout time.Duration,
) {
var latestUpdate int64
for {
updates, err := getUpdates(b.Token,
latestUpdate+1,
int64(timeout/time.Second),
)
if err != nil {
log.Println("failed to get updates:", err)
continue
}
for _, update := range updates {
if update.Payload != nil /* if message */ {
if messages == nil {
continue
}
messages <- *update.Payload
} else if update.Query != nil /* if query */ {
if queries == nil {
continue
}
queries <- *update.Query
} else if update.Callback != nil {
if callbacks == nil {
continue
}
callbacks <- *update.Callback
}
latestUpdate = update.ID
}
}
}
2015-06-26 16:12:54 +00:00
2015-07-02 11:04:45 +00:00
// SendMessage sends a text message to recipient.
func (b *Bot) SendMessage(recipient Recipient, message string, options *SendOptions) (*Message, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
"text": message,
}
if options != nil {
embedSendOptions(params, options)
}
2015-07-06 13:52:50 +00:00
responseJSON, err := sendCommand("sendMessage", b.Token, params)
2015-07-03 18:54:40 +00:00
if err != nil {
return nil, err
2015-07-03 18:54:40 +00:00
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Result Message
2015-07-03 18:54:40 +00:00
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return nil, err
2015-07-03 18:54:40 +00:00
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
return &responseRecieved.Result, nil
2015-06-26 16:12:54 +00:00
}
2015-07-02 09:05:50 +00:00
2015-07-02 11:04:45 +00:00
// ForwardMessage forwards a message to recipient.
2015-11-16 10:22:37 +00:00
func (b *Bot) ForwardMessage(recipient Recipient, message Message) error {
params := map[string]string{
"chat_id": recipient.Destination(),
"from_chat_id": strconv.Itoa(message.Origin().ID),
"message_id": strconv.Itoa(message.ID),
}
2015-07-03 18:54:40 +00:00
2015-07-06 13:52:50 +00:00
responseJSON, err := sendCommand("forwardMessage", b.Token, params)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
return nil
2015-07-02 09:05:50 +00:00
}
2015-07-02 18:39:39 +00:00
// SendPhoto sends a photo object to recipient.
2015-07-03 12:27:18 +00:00
//
// On success, photo object would be aliased to its copy on
// the Telegram servers, so sending the same photo object
// again, won't issue a new upload, but would make a use
// of existing file on Telegram servers.
func (b *Bot) SendPhoto(recipient Recipient, photo *Photo, options *SendOptions) (*Message, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
"caption": photo.Caption,
}
2015-07-03 18:54:40 +00:00
if options != nil {
embedSendOptions(params, options)
}
2015-07-06 13:52:50 +00:00
var responseJSON []byte
2015-07-03 18:54:40 +00:00
var err error
if photo.Exists() {
params["photo"] = photo.FileID
2015-07-06 13:52:50 +00:00
responseJSON, err = sendCommand("sendPhoto", b.Token, params)
2015-07-03 18:54:40 +00:00
} else {
2015-07-06 13:52:50 +00:00
responseJSON, err = sendFile("sendPhoto", b.Token, "photo",
2015-07-03 18:54:40 +00:00
photo.filename, params)
}
if err != nil {
return nil, err
2015-07-03 18:54:40 +00:00
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Result Message
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return nil, err
2015-07-03 18:54:40 +00:00
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
2015-07-06 13:52:50 +00:00
thumbnails := &responseRecieved.Result.Photo
2015-07-06 16:58:54 +00:00
filename := photo.filename
2015-07-03 18:54:40 +00:00
photo.File = (*thumbnails)[len(*thumbnails)-1].File
2015-07-06 16:58:54 +00:00
photo.filename = filename
2015-07-03 18:54:40 +00:00
return &responseRecieved.Result, nil
2015-07-02 18:39:39 +00:00
}
2015-07-03 12:27:18 +00:00
// SendAudio sends an audio object to recipient.
2015-07-03 12:27:18 +00:00
//
// On success, audio object would be aliased to its copy on
// the Telegram servers, so sending the same audio object
// again, won't issue a new upload, but would make a use
// of existing file on Telegram servers.
2015-11-16 10:22:37 +00:00
func (b *Bot) SendAudio(recipient Recipient, audio *Audio, options *SendOptions) error {
params := map[string]string{
"chat_id": recipient.Destination(),
}
2015-07-03 18:54:40 +00:00
if options != nil {
embedSendOptions(params, options)
}
2015-07-06 13:52:50 +00:00
var responseJSON []byte
2015-07-03 18:54:40 +00:00
var err error
if audio.Exists() {
params["audio"] = audio.FileID
2015-07-06 13:52:50 +00:00
responseJSON, err = sendCommand("sendAudio", b.Token, params)
2015-07-03 18:54:40 +00:00
} else {
2015-07-06 13:52:50 +00:00
responseJSON, err = sendFile("sendAudio", b.Token, "audio",
2015-07-03 18:54:40 +00:00
audio.filename, params)
}
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Result Message
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
2015-07-06 16:58:54 +00:00
filename := audio.filename
2015-07-06 13:52:50 +00:00
*audio = responseRecieved.Result.Audio
2015-07-06 16:58:54 +00:00
audio.filename = filename
2015-07-03 18:54:40 +00:00
return nil
2015-07-03 12:27:18 +00:00
}
// SendDocument sends a general document object to recipient.
//
// On success, document object would be aliased to its copy on
// the Telegram servers, so sending the same document object
// again, won't issue a new upload, but would make a use
// of existing file on Telegram servers.
2015-11-16 10:22:37 +00:00
func (b *Bot) SendDocument(recipient Recipient, doc *Document, options *SendOptions) error {
params := map[string]string{
"chat_id": recipient.Destination(),
}
2015-07-03 18:54:40 +00:00
if options != nil {
embedSendOptions(params, options)
}
2015-07-06 13:52:50 +00:00
var responseJSON []byte
2015-07-03 18:54:40 +00:00
var err error
if doc.Exists() {
params["document"] = doc.FileID
2015-07-06 13:52:50 +00:00
responseJSON, err = sendCommand("sendDocument", b.Token, params)
2015-07-03 18:54:40 +00:00
} else {
2015-07-06 13:52:50 +00:00
responseJSON, err = sendFile("sendDocument", b.Token, "document",
2015-07-03 18:54:40 +00:00
doc.filename, params)
}
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Result Message
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
2015-07-06 16:58:54 +00:00
filename := doc.filename
2015-07-06 13:52:50 +00:00
*doc = responseRecieved.Result.Document
2015-07-06 16:58:54 +00:00
doc.filename = filename
2015-07-03 18:54:40 +00:00
return nil
}
// SendSticker sends a general document object to recipient.
//
// On success, sticker object would be aliased to its copy on
// the Telegram servers, so sending the same sticker object
// again, won't issue a new upload, but would make a use
// of existing file on Telegram servers.
func (b *Bot) SendSticker(recipient Recipient, sticker *Sticker, options *SendOptions) error {
params := map[string]string{
"chat_id": recipient.Destination(),
}
2015-07-03 18:54:40 +00:00
if options != nil {
embedSendOptions(params, options)
}
2015-07-06 13:52:50 +00:00
var responseJSON []byte
2015-07-03 18:54:40 +00:00
var err error
if sticker.Exists() {
params["sticker"] = sticker.FileID
2015-07-06 13:52:50 +00:00
responseJSON, err = sendCommand("sendSticker", b.Token, params)
2015-07-03 18:54:40 +00:00
} else {
2015-07-06 13:52:50 +00:00
responseJSON, err = sendFile("sendSticker", b.Token, "sticker",
2015-07-03 18:54:40 +00:00
sticker.filename, params)
}
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Result Message
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
2015-07-06 16:58:54 +00:00
filename := sticker.filename
2015-07-06 13:52:50 +00:00
*sticker = responseRecieved.Result.Sticker
2015-07-06 16:58:54 +00:00
sticker.filename = filename
2015-07-03 18:54:40 +00:00
return nil
}
// SendVideo sends a general document object to recipient.
//
// On success, video object would be aliased to its copy on
// the Telegram servers, so sending the same video object
// again, won't issue a new upload, but would make a use
// of existing file on Telegram servers.
2015-11-16 10:22:37 +00:00
func (b *Bot) SendVideo(recipient Recipient, video *Video, options *SendOptions) error {
params := map[string]string{
"chat_id": recipient.Destination(),
}
2015-07-03 18:54:40 +00:00
if options != nil {
embedSendOptions(params, options)
}
2015-07-06 13:52:50 +00:00
var responseJSON []byte
2015-07-03 18:54:40 +00:00
var err error
if video.Exists() {
params["video"] = video.FileID
2015-07-06 13:52:50 +00:00
responseJSON, err = sendCommand("sendVideo", b.Token, params)
2015-07-03 18:54:40 +00:00
} else {
2015-07-06 13:52:50 +00:00
responseJSON, err = sendFile("sendVideo", b.Token, "video",
2015-07-03 18:54:40 +00:00
video.filename, params)
}
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Result Message
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
2015-07-06 16:58:54 +00:00
filename := video.filename
2015-07-06 13:52:50 +00:00
*video = responseRecieved.Result.Video
2015-07-06 16:58:54 +00:00
video.filename = filename
2015-07-03 18:54:40 +00:00
return nil
}
// SendLocation sends a general document object to recipient.
//
// On success, video object would be aliased to its copy on
// the Telegram servers, so sending the same video object
// again, won't issue a new upload, but would make a use
// of existing file on Telegram servers.
2015-11-16 10:22:37 +00:00
func (b *Bot) SendLocation(recipient Recipient, geo *Location, options *SendOptions) error {
params := map[string]string{
"chat_id": recipient.Destination(),
"latitude": fmt.Sprintf("%f", geo.Latitude),
"longitude": fmt.Sprintf("%f", geo.Longitude),
}
2015-07-03 18:54:40 +00:00
if options != nil {
embedSendOptions(params, options)
}
2015-07-06 13:52:50 +00:00
responseJSON, err := sendCommand("sendLocation", b.Token, params)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
var responseRecieved struct {
2015-07-03 18:54:40 +00:00
Ok bool
Result Message
Description string
}
2015-07-06 13:52:50 +00:00
err = json.Unmarshal(responseJSON, &responseRecieved)
2015-07-03 18:54:40 +00:00
if err != nil {
return err
}
2015-07-06 13:52:50 +00:00
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-03 18:54:40 +00:00
}
return nil
}
2015-07-06 16:13:08 +00:00
// SendVenue sends a venue object to recipient.
func (b *Bot) SendVenue(recipient Recipient, venue *Venue, options *SendOptions) error {
2016-07-04 14:45:08 +00:00
params := map[string]string{
"chat_id": recipient.Destination(),
2016-07-04 14:48:20 +00:00
"latitude": fmt.Sprintf("%f", venue.Location.Latitude),
2016-07-04 14:45:08 +00:00
"longitude": fmt.Sprintf("%f", venue.Location.Longitude),
2016-07-04 14:48:20 +00:00
"title": venue.Title,
"address": venue.Address}
if venue.FoursquareID != "" {
params["foursquare_id"] = venue.FoursquareID
2016-07-04 14:48:20 +00:00
}
if options != nil {
2016-07-04 14:45:08 +00:00
embedSendOptions(params, options)
}
responseJSON, err := sendCommand("sendVenue", b.Token, params)
if err != nil {
return err
}
var responseRecieved struct {
Ok bool
Result Message
Description string
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return err
}
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return nil
}
2016-07-04 10:56:53 +00:00
2015-07-06 16:13:08 +00:00
// SendChatAction updates a chat action for recipient.
//
// Chat action is a status message that recipient would see where
// you typically see "Harry is typing" status message. The only
// difference is that bots' chat actions live only for 5 seconds
// and die just once the client recieves a message from the bot.
//
// Currently, Telegram supports only a narrow range of possible
// actions, these are aligned as constants of this package.
func (b *Bot) SendChatAction(recipient Recipient, action ChatAction) error {
params := map[string]string{
"chat_id": recipient.Destination(),
"action": string(action),
}
2015-07-06 16:13:08 +00:00
responseJSON, err := sendCommand("sendChatAction", b.Token, params)
if err != nil {
return err
}
var responseRecieved struct {
Ok bool
Description string
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return err
}
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return nil
}
// Respond publishes a set of responses for an inline query.
// This function is deprecated in favor of AnswerInlineQuery.
func (b *Bot) Respond(query Query, results []Result) error {
params := map[string]string{
"inline_query_id": query.ID,
}
if res, err := json.Marshal(results); err == nil {
params["results"] = string(res)
} else {
return err
}
2015-07-06 16:13:08 +00:00
responseJSON, err := sendCommand("answerInlineQuery", b.Token, params)
2015-07-06 16:13:08 +00:00
if err != nil {
return err
}
var responseRecieved struct {
Ok bool
Description string
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return err
}
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
2015-07-06 16:13:08 +00:00
}
return nil
}
// AnswerInlineQuery sends a response for a given inline query. A query can
// only be responded to once, subsequent attempts to respond to the same query
// will result in an error.
func (b *Bot) AnswerInlineQuery(query *Query, response *QueryResponse) error {
response.QueryID = query.ID
responseJSON, err := sendCommand("answerInlineQuery", b.Token, response)
if err != nil {
return err
}
var responseRecieved struct {
Ok bool
Description string
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return err
}
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return nil
}
2016-07-25 22:09:18 +00:00
// AnswerCallbackQuery sends a response for a given callback query. A callback can
// only be responded to once, subsequent attempts to respond to the same callback
// will result in an error.
func (b *Bot) AnswerCallbackQuery(callback *Callback, response *CallbackResponse) error {
response.CallbackID = callback.ID
responseJSON, err := sendCommand("answerCallbackQuery", b.Token, response)
if err != nil {
return err
}
var responseRecieved struct {
Ok bool
Description string
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return err
}
if !responseRecieved.Ok {
return fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return nil
}
// GetFile returns full file object including File.FilePath, which allow you to load file from Telegram
//
// Usually File objects does not contain any FilePath so you need to perform additional request
func (b *Bot) GetFile(fileID string) (File, error) {
params := map[string]string{
2016-10-09 19:57:08 +00:00
"file_id": fileID,
}
responseJSON, err := sendCommand("getFile", b.Token, params)
if err != nil {
return File{}, err
}
var responseRecieved struct {
Ok bool
Description string
Result File
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return File{}, err
}
if !responseRecieved.Ok {
return File{}, fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return responseRecieved.Result, nil
}
// LeaveChat makes bot leave a group, supergroup or channel.
2016-10-15 07:22:58 +00:00
func (b *Bot) LeaveChat(recipient Recipient) error {
2016-10-09 19:57:08 +00:00
params := map[string]string{
"chat_id": recipient.Destination(),
}
responseJSON, err := sendCommand("leaveChat", b.Token, params)
if err != nil {
2016-10-15 07:22:58 +00:00
return err
2016-10-09 19:57:08 +00:00
}
var responseRecieved struct {
Ok bool
Description string
Result bool
2016-10-09 19:57:08 +00:00
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
2016-10-15 07:22:58 +00:00
return err
2016-10-09 19:57:08 +00:00
}
if !responseRecieved.Ok {
return fmt.Errorf("telebot: leaveChat failure %s",
responseRecieved.Description)
2016-10-09 20:00:04 +00:00
}
2016-10-15 07:22:58 +00:00
return nil
2016-10-09 20:00:04 +00:00
}
// GetChat get up to date information about the chat.
//
// Including current name of the user for one-on-one conversations,
// current username of a user, group or channel, etc.
2016-10-09 20:00:04 +00:00
//
// Returns a Chat object on success.
func (b *Bot) GetChat(recipient Recipient) (Chat, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
}
responseJSON, err := sendCommand("getChat", b.Token, params)
if err != nil {
return Chat{}, err
}
var responseRecieved struct {
Ok bool
Description string
Result Chat
2016-10-09 20:00:04 +00:00
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return Chat{}, err
}
if !responseRecieved.Ok {
return Chat{}, fmt.Errorf("telebot: getChat failure %s",
responseRecieved.Description)
2016-10-09 19:57:08 +00:00
}
return responseRecieved.Result, nil
}
2016-10-14 15:01:45 +00:00
// GetChatAdministrators return list of administrators in a chat.
2016-10-09 20:09:07 +00:00
//
2016-10-09 20:42:07 +00:00
// On success, returns an Array of ChatMember objects that
// contains information about all chat administrators except other bots.
2016-10-09 20:09:07 +00:00
//
2016-10-09 20:42:07 +00:00
// If the chat is a group or a supergroup and
// no administrators were appointed, only the creator will be returned.
2016-10-09 20:09:07 +00:00
func (b *Bot) GetChatAdministrators(recipient Recipient) ([]ChatMember, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
}
responseJSON, err := sendCommand("getChatAdministrators", b.Token, params)
if err != nil {
return []ChatMember{}, err
}
var responseRecieved struct {
Ok bool
Result []ChatMember
Description string `json:"description"`
2016-10-09 20:09:07 +00:00
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return []ChatMember{}, err
}
if !responseRecieved.Ok {
return []ChatMember{}, fmt.Errorf("telebot: getChatAdministrators failure %s", responseRecieved.Description)
}
return responseRecieved.Result, nil
}
2016-10-14 15:01:45 +00:00
// GetChatMembersCount return the number of members in a chat.
2016-10-09 20:11:23 +00:00
//
// Returns Int on success.
func (b *Bot) GetChatMembersCount(recipient Recipient) (int, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
}
responseJSON, err := sendCommand("getChatMembersCount", b.Token, params)
if err != nil {
return 0, err
}
var responseRecieved struct {
Ok bool
Result int
Description string `json:"description"`
2016-10-09 20:11:23 +00:00
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return 0, err
}
if !responseRecieved.Ok {
return 0, fmt.Errorf("telebot: getChatMembersCount failure %s", responseRecieved.Description)
}
return responseRecieved.Result, nil
}
2016-10-14 15:01:45 +00:00
// GetUserProfilePhotos return list of profile pictures for a user.
2016-10-09 20:29:03 +00:00
//
// Returns a UserProfilePhotos object.
func (b *Bot) GetUserProfilePhotos(recipient Recipient) (UserProfilePhotos, error) {
params := map[string]string{
"user_id": recipient.Destination(),
}
responseJSON, err := sendCommand("getUserProfilePhotos", b.Token, params)
if err != nil {
return UserProfilePhotos{}, err
}
var responseRecieved struct {
Ok bool
Result UserProfilePhotos
Description string `json:"description"`
2016-10-09 20:29:03 +00:00
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return UserProfilePhotos{}, err
}
if !responseRecieved.Ok {
return UserProfilePhotos{}, fmt.Errorf("telebot: getUserProfilePhotos failure %s", responseRecieved.Description)
}
return responseRecieved.Result, nil
}
2016-10-14 15:01:45 +00:00
// GetChatMember return information about a member of a chat.
2016-10-09 20:16:33 +00:00
//
// Returns a ChatMember object on success.
func (b *Bot) GetChatMember(recipient Recipient, user User) (ChatMember, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
"user_id": user.Destination(),
}
responseJSON, err := sendCommand("getChatMember", b.Token, params)
if err != nil {
return ChatMember{}, err
}
var responseRecieved struct {
Ok bool
Result ChatMember
Description string `json:"description"`
2016-10-09 20:16:33 +00:00
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return ChatMember{}, err
}
if !responseRecieved.Ok {
return ChatMember{}, fmt.Errorf("telebot: getChatMember failure %s", responseRecieved.Description)
}
return responseRecieved.Result, nil
}
// GetFileDirectURL returns direct url for files using FileId which you can get from File object
func (b *Bot) GetFileDirectURL(fileID string) (string, error) {
f, err := b.GetFile(fileID)
if err != nil {
return "", err
}
2016-10-09 19:57:08 +00:00
return "https://api.telegram.org/file/bot" + b.Token + "/" + f.FilePath, nil
}
// EditMessageText used to edit already sent message with known recepient and message id.
//
// On success, returns edited message object
func (b *Bot) EditMessageText(recipient Recipient, messageID int, message string, inlineKeyboard *InlineKeyboardMarkup) (*Message, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
"message_id": strconv.Itoa(messageID),
"text": message,
}
if inlineKeyboard != nil {
embedSendOptions(params, &SendOptions{
ReplyMarkup: ReplyMarkup{
InlineKeyboard: inlineKeyboard.InlineKeyboard,
},
})
}
responseJSON, err := sendCommand("editMessageText", b.Token, params)
if err != nil {
return nil, err
}
var responseRecieved struct {
Ok bool
Description string
Message Message `json:"result"`
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return nil, err
}
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return &responseRecieved.Message, err
}
// EditInlineMessageText used to edit already sent inline message with known inline message id.
//
// On success, returns edited message object
func (b *Bot) EditInlineMessageText(messageID string, message string, inlineKeyboard *InlineKeyboardMarkup) (*Message, error) {
params := map[string]string{
"inline_message_id": messageID,
"text": message,
}
if inlineKeyboard != nil {
embedSendOptions(params, &SendOptions{
ReplyMarkup: ReplyMarkup{
InlineKeyboard: inlineKeyboard.InlineKeyboard,
},
})
}
responseJSON, err := sendCommand("editMessageText", b.Token, params)
if err != nil {
return nil, err
}
var responseRecieved struct {
Ok bool
Description string
Message Message `json:"result"`
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return nil, err
}
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return &responseRecieved.Message, err
}
// EditMessageCaption used to edit already sent photo caption with known recepient and message id.
//
// On success, returns edited message object
func (b *Bot) EditMessageCaption(recipient Recipient, messageID int, caption string, inlineKeyboard *InlineKeyboardMarkup) (*Message, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
"message_id": strconv.Itoa(messageID),
"caption": caption,
}
if inlineKeyboard != nil {
embedSendOptions(params, &SendOptions{
ReplyMarkup: ReplyMarkup{
InlineKeyboard: inlineKeyboard.InlineKeyboard,
},
})
}
responseJSON, err := sendCommand("editMessageCaption", b.Token, params)
if err != nil {
return nil, err
}
var responseRecieved struct {
Ok bool
Description string
Message Message `json:"result"`
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return nil, err
}
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return &responseRecieved.Message, err
}
// EditInlineMessageCaption used to edit already sent photo caption with known inline message id.
//
// On success, returns edited message object
func (b *Bot) EditInlineMessageCaption(messageID string, caption string, inlineKeyboard *InlineKeyboardMarkup) (*Message, error) {
params := map[string]string{
"inline_message_id": messageID,
"caption": caption,
}
if inlineKeyboard != nil {
embedSendOptions(params, &SendOptions{
ReplyMarkup: ReplyMarkup{
InlineKeyboard: inlineKeyboard.InlineKeyboard,
},
})
}
responseJSON, err := sendCommand("editMessageCaption", b.Token, params)
if err != nil {
return nil, err
}
var responseRecieved struct {
Ok bool
Description string
Message Message `json:"result"`
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return nil, err
}
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return &responseRecieved.Message, err
}
// EditMessageReplyMarkup used to edit already sent message inline keyboard markup with known recepient and message id.
//
// On success, returns edited message object
func (b *Bot) EditMessageReplyMarkup(recipient Recipient, messageID int, inlineKeyboard *InlineKeyboardMarkup) (*Message, error) {
params := map[string]string{
"chat_id": recipient.Destination(),
"message_id": strconv.Itoa(messageID),
}
if inlineKeyboard != nil {
embedSendOptions(params, &SendOptions{
ReplyMarkup: ReplyMarkup{
InlineKeyboard: inlineKeyboard.InlineKeyboard,
},
})
}
responseJSON, err := sendCommand("editMessageReplyMarkup", b.Token, params)
if err != nil {
return nil, err
}
var responseRecieved struct {
Ok bool
Description string
Message Message `json:"result"`
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return nil, err
}
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return &responseRecieved.Message, err
}
// EditInlineMessageReplyMarkup used to edit already sent message inline keyboard markup with known inline message id.
//
// On success, returns edited message object
func (b *Bot) EditInlineMessageReplyMarkup(messageID string, caption string, inlineKeyboard *InlineKeyboardMarkup) (*Message, error) {
params := map[string]string{
"inline_message_id": messageID,
}
if inlineKeyboard != nil {
embedSendOptions(params, &SendOptions{
ReplyMarkup: ReplyMarkup{
InlineKeyboard: inlineKeyboard.InlineKeyboard,
},
})
}
responseJSON, err := sendCommand("editMessageReplyMarkup", b.Token, params)
if err != nil {
return nil, err
}
var responseRecieved struct {
Ok bool
Description string
Message Message `json:"result"`
}
err = json.Unmarshal(responseJSON, &responseRecieved)
if err != nil {
return nil, err
}
if !responseRecieved.Ok {
return nil, fmt.Errorf("telebot: %s", responseRecieved.Description)
}
return &responseRecieved.Message, err
}