2015-06-26 07:34:10 +00:00
|
|
|
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"
|
2015-06-26 07:34:10 +00:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2015-06-27 15:44:12 +00:00
|
|
|
// Bot represents a separate Telegram bot instance.
|
2015-06-26 07:34:10 +00:00
|
|
|
type Bot struct {
|
2016-04-21 20:31:30 +00:00
|
|
|
Token string
|
|
|
|
Identity User
|
|
|
|
Messages chan Message
|
|
|
|
Queries chan Query
|
|
|
|
Callbacks chan Callback
|
2015-06-26 07:34:10 +00:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2015-06-27 15:44:12 +00:00
|
|
|
// Listen periodically looks for updates and delivers new messages
|
2015-11-16 10:22:37 +00:00
|
|
|
// to the subscription channel.
|
2016-01-22 11:38:45 +00:00
|
|
|
func (b *Bot) Listen(subscription chan Message, timeout time.Duration) {
|
2016-04-21 20:31:30 +00:00
|
|
|
go b.poll(subscription, nil, nil, timeout)
|
2016-01-22 11:38:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Start periodically polls messages and/or updates to corresponding channels
|
|
|
|
// from the bot object.
|
|
|
|
func (b *Bot) Start(timeout time.Duration) {
|
2016-04-21 20:31:30 +00:00
|
|
|
b.poll(b.Messages, b.Queries, b.Callbacks, timeout)
|
2016-01-22 11:38:45 +00:00
|
|
|
}
|
2015-11-16 10:22:37 +00:00
|
|
|
|
2016-01-22 11:38:45 +00:00
|
|
|
func (b *Bot) poll(
|
|
|
|
messages chan Message,
|
|
|
|
queries chan Query,
|
2016-04-21 20:31:30 +00:00
|
|
|
callbacks chan Callback,
|
2016-01-22 11:38:45 +00:00
|
|
|
timeout time.Duration,
|
|
|
|
) {
|
|
|
|
latestUpdate := 0
|
|
|
|
|
|
|
|
for {
|
|
|
|
updates, err := getUpdates(b.Token,
|
|
|
|
latestUpdate+1,
|
|
|
|
int(timeout/time.Second),
|
|
|
|
)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
log.Println("failed to get updates:", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, update := range updates {
|
2016-04-21 20:31:30 +00:00
|
|
|
if update.Payload != nil /* if message */ {
|
2016-01-22 11:38:45 +00:00
|
|
|
if messages == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2016-04-21 20:31:30 +00:00
|
|
|
messages <- *update.Payload
|
|
|
|
} else if update.Query != nil /* if query */ {
|
2016-01-22 11:38:45 +00:00
|
|
|
if queries == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
queries <- *update.Query
|
2016-04-21 20:31:30 +00:00
|
|
|
} else if update.Callback != nil {
|
|
|
|
if callbacks == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
callbacks <- *update.Callback
|
2015-06-27 10:30:25 +00:00
|
|
|
}
|
2016-01-22 11:38:45 +00:00
|
|
|
|
|
|
|
latestUpdate = update.ID
|
2015-06-26 07:34:10 +00:00
|
|
|
}
|
2016-01-22 11:38:45 +00:00
|
|
|
}
|
|
|
|
|
2015-06-26 07:34:10 +00:00
|
|
|
}
|
2015-06-26 16:12:54 +00:00
|
|
|
|
2015-07-02 11:04:45 +00:00
|
|
|
// SendMessage sends a text message to recipient.
|
2015-11-16 10:22:37 +00:00
|
|
|
func (b *Bot) SendMessage(recipient Recipient, message string, options *SendOptions) error {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"chat_id": recipient.Destination(),
|
|
|
|
"text": message,
|
|
|
|
}
|
2015-07-06 13:46:19 +00:00
|
|
|
|
|
|
|
if options != nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
embedSendOptions(params, options)
|
2015-07-06 13:46:19 +00:00
|
|
|
}
|
|
|
|
|
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 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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
return fmt.Errorf("telebot: %s", responseRecieved.Description)
|
2015-07-03 18:54:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 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 {
|
2016-06-26 14:05:37 +00:00
|
|
|
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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
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.
|
2015-11-16 10:22:37 +00:00
|
|
|
func (b *Bot) SendPhoto(recipient Recipient, photo *Photo, options *SendOptions) error {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"chat_id": recipient.Destination(),
|
|
|
|
"caption": photo.Caption,
|
|
|
|
}
|
2015-07-03 18:54:40 +00:00
|
|
|
|
2015-07-06 13:46:19 +00:00
|
|
|
if options != nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
embedSendOptions(params, options)
|
2015-07-06 13:46:19 +00:00
|
|
|
}
|
|
|
|
|
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() {
|
2016-06-26 14:05:37 +00:00
|
|
|
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 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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
return 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 nil
|
2015-07-02 18:39:39 +00:00
|
|
|
}
|
2015-07-03 12:27:18 +00:00
|
|
|
|
2015-07-03 16:25:04 +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 {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"chat_id": recipient.Destination(),
|
|
|
|
}
|
2015-07-03 18:54:40 +00:00
|
|
|
|
2015-07-06 13:46:19 +00:00
|
|
|
if options != nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
embedSendOptions(params, options)
|
2015-07-06 13:46:19 +00:00
|
|
|
}
|
|
|
|
|
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() {
|
2016-06-26 14:05:37 +00:00
|
|
|
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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
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
|
|
|
}
|
2015-07-03 16:25:04 +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 {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"chat_id": recipient.Destination(),
|
|
|
|
}
|
2015-07-03 18:54:40 +00:00
|
|
|
|
2015-07-06 13:46:19 +00:00
|
|
|
if options != nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
embedSendOptions(params, options)
|
2015-07-06 13:46:19 +00:00
|
|
|
}
|
|
|
|
|
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() {
|
2016-06-26 14:05:37 +00:00
|
|
|
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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
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
|
2015-07-03 16:25:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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.
|
2015-10-16 22:36:07 +00:00
|
|
|
func (b *Bot) SendSticker(recipient Recipient, sticker *Sticker, options *SendOptions) error {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"chat_id": recipient.Destination(),
|
|
|
|
}
|
2015-07-03 18:54:40 +00:00
|
|
|
|
2015-07-06 13:46:19 +00:00
|
|
|
if options != nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
embedSendOptions(params, options)
|
2015-07-06 13:46:19 +00:00
|
|
|
}
|
|
|
|
|
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() {
|
2016-06-26 14:05:37 +00:00
|
|
|
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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
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
|
2015-07-03 16:25:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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 {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"chat_id": recipient.Destination(),
|
|
|
|
}
|
2015-07-03 18:54:40 +00:00
|
|
|
|
2015-07-06 13:46:19 +00:00
|
|
|
if options != nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
embedSendOptions(params, options)
|
2015-07-06 13:46:19 +00:00
|
|
|
}
|
|
|
|
|
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() {
|
2016-06-26 14:05:37 +00:00
|
|
|
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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
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
|
2015-07-03 16:25:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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 {
|
2016-06-26 14:05:37 +00:00
|
|
|
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
|
|
|
|
2015-07-06 13:46:19 +00:00
|
|
|
if options != nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
embedSendOptions(params, options)
|
2015-07-06 13:46:19 +00:00
|
|
|
}
|
|
|
|
|
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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
return fmt.Errorf("telebot: %s", responseRecieved.Description)
|
2015-07-03 18:54:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2015-07-03 16:25:04 +00:00
|
|
|
}
|
2015-07-06 16:13:08 +00:00
|
|
|
|
2016-05-24 04:43:16 +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.Foursquare_id != "" {
|
|
|
|
params["foursquare_id"] = venue.Foursquare_id
|
|
|
|
}
|
2016-05-24 04:43:16 +00:00
|
|
|
|
|
|
|
if options != nil {
|
2016-07-04 14:45:08 +00:00
|
|
|
embedSendOptions(params, options)
|
2016-05-24 04:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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.
|
2015-11-16 10:22:37 +00:00
|
|
|
func (b *Bot) SendChatAction(recipient Recipient, action string) error {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"chat_id": recipient.Destination(),
|
|
|
|
"action": action,
|
|
|
|
}
|
2015-07-06 16:13:08 +00:00
|
|
|
|
|
|
|
responseJSON, err := sendCommand("sendChatAction", b.Token, params)
|
2016-01-22 11:38:45 +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)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Respond publishes a set of responses for an inline query.
|
2016-06-26 14:05:37 +00:00
|
|
|
// This function is deprecated in favor of AnswerInlineQuery.
|
2016-01-22 11:38:45 +00:00
|
|
|
func (b *Bot) Respond(query Query, results []Result) error {
|
2016-06-26 14:05:37 +00:00
|
|
|
params := map[string]string{
|
|
|
|
"inline_query_id": query.ID,
|
|
|
|
}
|
2016-01-22 11:38:45 +00:00
|
|
|
|
|
|
|
if res, err := json.Marshal(results); err == nil {
|
2016-06-26 14:05:37 +00:00
|
|
|
params["results"] = string(res)
|
2016-01-22 11:38:45 +00:00
|
|
|
} else {
|
|
|
|
return err
|
|
|
|
}
|
2015-07-06 16:13:08 +00:00
|
|
|
|
2016-01-22 11:38:45 +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 {
|
2015-10-15 15:17:09 +00:00
|
|
|
return fmt.Errorf("telebot: %s", responseRecieved.Description)
|
2015-07-06 16:13:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2016-06-26 14:05:37 +00:00
|
|
|
|
|
|
|
// 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
|
|
|
|
}
|
2016-09-27 12:04:13 +00:00
|
|
|
|
|
|
|
// 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{
|
|
|
|
"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
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
|
|
|
}
|
|
|
|
return "https://api.telegram.org/file/bot"+b.Token+"/"+f.FilePath, nil
|
|
|
|
}
|