Totally new, universal API

bot-api-6.1
Gleb Sinyavsky 2015-11-20 17:55:32 +03:00
parent d3f7ac7197
commit da026b435e
2 changed files with 70 additions and 136 deletions

162
bot.go
View File

@ -90,7 +90,7 @@ func (bot *BotAPI) MakeMessageRequest(endpoint string, params url.Values) (Messa
var message Message var message Message
json.Unmarshal(resp.Result, &message) json.Unmarshal(resp.Result, &message)
bot.DebugLog(endpoint, params, message) bot.debugLog(endpoint, params, message)
return message, nil return message, nil
} }
@ -188,11 +188,16 @@ func (bot *BotAPI) GetMe() (User, error) {
return user, nil return user, nil
} }
func (bot *BotAPI) Send(c BaseChat) error { func (bot *BotAPI) Send(c Chattable) (Message, error) {
return nil switch c.(type) {
case Fileable:
return bot.sendFile(c.(Fileable))
default:
return bot.sendChattable(c)
}
} }
func (bot *BotAPI) DebugLog(context string, v url.Values, message interface{}) { func (bot *BotAPI) debugLog(context string, v url.Values, message interface{}) {
if bot.Debug { if bot.Debug {
log.Printf("%s req : %+v\n", context, v) log.Printf("%s req : %+v\n", context, v)
log.Printf("%s resp: %+v\n", context, message) log.Printf("%s resp: %+v\n", context, message)
@ -237,25 +242,21 @@ func (bot *BotAPI) uploadAndSend(method string, config Fileable) (Message, error
return message, nil return message, nil
} }
func (bot *BotAPI) sendFile(method string, config Fileable) (Message, error) { func (bot *BotAPI) sendFile(config Fileable) (Message, error) {
if config.UseExistingFile() { if config.UseExistingFile() {
return bot.sendExisting(method, config) return bot.sendExisting(config.Method(), config)
} }
return bot.uploadAndSend(method, config) return bot.uploadAndSend(config.Method(), config)
} }
// SendMessage sends a Message to a chat. func (bot *BotAPI) sendChattable(config Chattable) (Message, error) {
//
// Requires ChatID and Text.
// DisableWebPagePreview, ReplyToMessageID, and ReplyMarkup are optional.
func (bot *BotAPI) SendMessage(config MessageConfig) (Message, error) {
v, err := config.Values() v, err := config.Values()
if err != nil { if err != nil {
return Message{}, err return Message{}, err
} }
message, err := bot.MakeMessageRequest("SendMessage", v) message, err := bot.MakeMessageRequest(config.Method(), v)
if err != nil { if err != nil {
return Message{}, err return Message{}, err
@ -264,120 +265,6 @@ func (bot *BotAPI) SendMessage(config MessageConfig) (Message, error) {
return message, nil return message, nil
} }
// ForwardMessage forwards a message from one chat to another.
//
// Requires ChatID (destination), FromChatID (source), and MessageID.
func (bot *BotAPI) ForwardMessage(config ForwardConfig) (Message, error) {
v, err := config.Values()
if err != nil {
return Message{}, err
}
message, err := bot.MakeMessageRequest("forwardMessage", v)
if err != nil {
return Message{}, err
}
return message, nil
}
// SendLocation sends a location to a chat.
//
// Requires ChatID, Latitude, and Longitude.
// ReplyToMessageID and ReplyMarkup are optional.
func (bot *BotAPI) SendLocation(config LocationConfig) (Message, error) {
v, err := config.Values()
if err != nil {
return Message{}, err
}
message, err := bot.MakeMessageRequest("sendLocation", v)
if err != nil {
return Message{}, err
}
return message, nil
}
// SendPhoto sends or uploads a photo to a chat.
//
// Requires ChatID and FileID OR File.
// Caption, ReplyToMessageID, and ReplyMarkup are optional.
// File should be either a string, FileBytes, or FileReader.
func (bot *BotAPI) SendPhoto(config PhotoConfig) (Message, error) {
return bot.sendFile("SendPhoto", config)
}
// SendAudio sends or uploads an audio clip to a chat.
// If using a file, the file must be in the .mp3 format.
//
// When the fields title and performer are both empty and
// the mime-type of the file to be sent is not audio/mpeg,
// the file must be an .ogg file encoded with OPUS.
// You may use the tgutils.EncodeAudio func to assist you with this, if needed.
//
// Requires ChatID and FileID OR File.
// ReplyToMessageID and ReplyMarkup are optional.
// File should be either a string, FileBytes, or FileReader.
func (bot *BotAPI) SendAudio(config AudioConfig) (Message, error) {
return bot.sendFile("sendAudio", config)
}
// SendDocument sends or uploads a document to a chat.
//
// Requires ChatID and FileID OR File.
// ReplyToMessageID and ReplyMarkup are optional.
// File should be either a string, FileBytes, or FileReader.
func (bot *BotAPI) SendDocument(config DocumentConfig) (Message, error) {
return bot.sendFile("sendDocument", config)
}
// SendVoice sends or uploads a playable voice to a chat.
// If using a file, the file must be encoded as an .ogg with OPUS.
// You may use the tgutils.EncodeAudio func to assist you with this, if needed.
//
// Requires ChatID and FileID OR File.
// ReplyToMessageID and ReplyMarkup are optional.
// File should be either a string, FileBytes, or FileReader.
func (bot *BotAPI) SendVoice(config VoiceConfig) (Message, error) {
return bot.sendFile("sendVoice", config)
}
// SendSticker sends or uploads a sticker to a chat.
//
// Requires ChatID and FileID OR File.
// ReplyToMessageID and ReplyMarkup are optional.
// File should be either a string, FileBytes, or FileReader.
func (bot *BotAPI) SendSticker(config StickerConfig) (Message, error) {
return bot.sendFile("sendSticker", config)
}
// SendVideo sends or uploads a video to a chat.
//
// Requires ChatID and FileID OR File.
// ReplyToMessageID and ReplyMarkup are optional.
// File should be either a string, FileBytes, or FileReader.
func (bot *BotAPI) SendVideo(config VideoConfig) (Message, error) {
return bot.sendFile("sendVideo", config)
}
// SendChatAction sets a current action in a chat.
//
// Requires ChatID and a valid Action (see Chat constants).
func (bot *BotAPI) SendChatAction(config ChatActionConfig) error {
v, err := config.Values()
if err != nil {
return err
}
_, err = bot.MakeRequest("sendChatAction", v)
if err != nil {
return err
}
return nil
}
// GetUserProfilePhotos gets a user's profile photos. // GetUserProfilePhotos gets a user's profile photos.
// //
// Requires UserID. // Requires UserID.
@ -400,7 +287,7 @@ func (bot *BotAPI) GetUserProfilePhotos(config UserProfilePhotosConfig) (UserPro
var profilePhotos UserProfilePhotos var profilePhotos UserProfilePhotos
json.Unmarshal(resp.Result, &profilePhotos) json.Unmarshal(resp.Result, &profilePhotos)
bot.DebugLog("GetUserProfilePhoto", v, profilePhotos) bot.debugLog("GetUserProfilePhoto", v, profilePhotos)
return profilePhotos, nil return profilePhotos, nil
} }
@ -420,7 +307,7 @@ func (bot *BotAPI) GetFile(config FileConfig) (File, error) {
var file File var file File
json.Unmarshal(resp.Result, &file) json.Unmarshal(resp.Result, &file)
bot.DebugLog("GetFile", v, file) bot.debugLog("GetFile", v, file)
return file, nil return file, nil
} }
@ -530,3 +417,20 @@ func (bot *BotAPI) ListenForWebhook(pattern string) {
bot.Updates <- update bot.Updates <- update
}) })
} }
// SendChatAction sets a current action in a chat.
//
// Requires ChatID and a valid Action (see Chat constants).
func (bot *BotAPI) SendChatAction(config ChatActionConfig) error {
v, err := config.Values()
if err != nil {
return err
}
_, err = bot.MakeRequest("sendChatAction", v)
if err != nil {
return err
}
return nil
}

View File

@ -40,6 +40,7 @@ const (
type Chattable interface { type Chattable interface {
Values() (url.Values, error) Values() (url.Values, error)
Method() string
} }
type Fileable interface { type Fileable interface {
@ -133,6 +134,10 @@ func (config MessageConfig) Values() (url.Values, error) {
return v, nil return v, nil
} }
func (config MessageConfig) Method() string {
return "SendMessage"
}
// ForwardConfig contains information about a ForwardMessage request. // ForwardConfig contains information about a ForwardMessage request.
type ForwardConfig struct { type ForwardConfig struct {
BaseChat BaseChat
@ -143,17 +148,14 @@ type ForwardConfig struct {
func (config ForwardConfig) Values() (url.Values, error) { func (config ForwardConfig) Values() (url.Values, error) {
v, _ := config.BaseChat.Values() v, _ := config.BaseChat.Values()
if config.FromChannelUsername != "" {
v.Add("chat_id", config.FromChannelUsername)
} else {
v.Add("chat_id", strconv.Itoa(config.FromChatID))
}
v.Add("message_id", strconv.Itoa(config.MessageID)) v.Add("message_id", strconv.Itoa(config.MessageID))
return v, nil return v, nil
} }
func (config ForwardConfig) Method() string {
return "forwardMessage"
}
// PhotoConfig contains information about a SendPhoto request. // PhotoConfig contains information about a SendPhoto request.
type PhotoConfig struct { type PhotoConfig struct {
BaseFile BaseFile
@ -209,6 +211,10 @@ func (config PhotoConfig) Name() string {
return "photo" return "photo"
} }
func (config PhotoConfig) Method() string {
return "SendPhoto"
}
// AudioConfig contains information about a SendAudio request. // AudioConfig contains information about a SendAudio request.
type AudioConfig struct { type AudioConfig struct {
BaseFile BaseFile
@ -278,6 +284,10 @@ func (config AudioConfig) Name() string {
return "audio" return "audio"
} }
func (config AudioConfig) Method() string {
return "SendAudio"
}
// DocumentConfig contains information about a SendDocument request. // DocumentConfig contains information about a SendDocument request.
type DocumentConfig struct { type DocumentConfig struct {
BaseFile BaseFile
@ -326,6 +336,10 @@ func (config DocumentConfig) Name() string {
return "document" return "document"
} }
func (config DocumentConfig) Method() string {
return "sendDocument"
}
// StickerConfig contains information about a SendSticker request. // StickerConfig contains information about a SendSticker request.
type StickerConfig struct { type StickerConfig struct {
BaseFile BaseFile
@ -374,6 +388,10 @@ func (config StickerConfig) Name() string {
return "sticker" return "sticker"
} }
func (config StickerConfig) Method() string {
return "sendSticker"
}
// VideoConfig contains information about a SendVideo request. // VideoConfig contains information about a SendVideo request.
type VideoConfig struct { type VideoConfig struct {
BaseFile BaseFile
@ -430,6 +448,10 @@ func (config VideoConfig) Name() string {
return "viceo" return "viceo"
} }
func (config VideoConfig) Method() string {
return "sendVideo"
}
// VoiceConfig contains information about a SendVoice request. // VoiceConfig contains information about a SendVoice request.
type VoiceConfig struct { type VoiceConfig struct {
BaseFile BaseFile
@ -485,6 +507,10 @@ func (config VoiceConfig) Name() string {
return "voice" return "voice"
} }
func (config VoiceConfig) Method() string {
return "sendVoice"
}
// LocationConfig contains information about a SendLocation request. // LocationConfig contains information about a SendLocation request.
type LocationConfig struct { type LocationConfig struct {
BaseChat BaseChat
@ -515,6 +541,10 @@ func (config LocationConfig) Values() (url.Values, error) {
return v, nil return v, nil
} }
func (config LocationConfig) Method() string {
return "sendLocation"
}
// ChatActionConfig contains information about a SendChatAction request. // ChatActionConfig contains information about a SendChatAction request.
type ChatActionConfig struct { type ChatActionConfig struct {
BaseChat BaseChat