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 {
2016-10-09 19:57:08 +00:00
"file_id" : fileID ,
2016-09-27 12:04:13 +00:00
}
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
}
2016-10-09 19:57:08 +00:00
// Use this method for your bot to leave a group, supergroup or channel. Returns True on success.
func ( b * Bot ) LeaveChat ( recipient Recipient ) ( bool , error ) {
params := map [ string ] string {
"chat_id" : recipient . Destination ( ) ,
}
responseJSON , err := sendCommand ( "leaveChat" , b . Token , params )
if err != nil {
return false , err
}
var responseRecieved struct {
Ok bool
Result bool
}
err = json . Unmarshal ( responseJSON , & responseRecieved )
if err != nil {
return false , err
}
if ! responseRecieved . Ok {
2016-10-09 20:00:04 +00:00
return false , fmt . Errorf ( "telebot: leaveChat failure %s" , responseRecieved . Result )
}
return responseRecieved . Result , nil
}
// Use this method to get up to date information about the chat (current name of the user for one-on-one conversations, current username of a user, group or channel, etc.).
//
// 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
Result Chat
}
err = json . Unmarshal ( responseJSON , & responseRecieved )
if err != nil {
return Chat { } , err
}
if ! responseRecieved . Ok {
return Chat { } , fmt . Errorf ( "telebot: getChat failure %s" , responseRecieved . Result )
2016-10-09 19:57:08 +00:00
}
return responseRecieved . Result , nil
}
2016-09-27 12:04:13 +00:00
// 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
2016-09-27 12:04:13 +00:00
}