2017-10-11 11:58:11 +00:00
|
|
|
|
package telegram
|
|
|
|
|
|
2017-10-12 09:49:05 +00:00
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
2017-10-17 11:11:20 +00:00
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"mime/multipart"
|
|
|
|
|
"os"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
2017-10-12 09:49:05 +00:00
|
|
|
|
|
|
|
|
|
json "github.com/pquerna/ffjson/ffjson"
|
2017-10-17 11:11:20 +00:00
|
|
|
|
http "github.com/valyala/fasthttp"
|
2017-10-12 09:49:05 +00:00
|
|
|
|
)
|
2017-10-11 11:58:11 +00:00
|
|
|
|
|
|
|
|
|
type SetWebhookParameters struct {
|
|
|
|
|
// HTTPS url to send updates to. Use an empty string to remove webhook
|
|
|
|
|
// integration
|
|
|
|
|
URL string `json:"url"`
|
|
|
|
|
|
|
|
|
|
// Upload your public key certificate so that the root certificate in use can
|
|
|
|
|
// be checked. See our self-signed guide for details.
|
|
|
|
|
Certificate *InputFile `json:"certificate,omitempty"`
|
|
|
|
|
|
|
|
|
|
// Maximum allowed number of simultaneous HTTPS connections to the webhook
|
|
|
|
|
// for update delivery, 1-100. Defaults to 40. Use lower values to limit the
|
|
|
|
|
// load on your bot‘s server, and higher values to increase your bot’s
|
|
|
|
|
// throughput.
|
|
|
|
|
MaxConnections int `json:"max_connections,omitempty"`
|
|
|
|
|
|
|
|
|
|
// List the types of updates you want your bot to receive. For example,
|
|
|
|
|
// specify [“message”, “edited_channel_post”, “callback_query”] to only
|
|
|
|
|
// receive updates of these types. See Update for a complete list of
|
|
|
|
|
// available update types. Specify an empty list to receive all updates
|
|
|
|
|
// regardless of type (default). If not specified, the previous setting will
|
|
|
|
|
// be used.
|
|
|
|
|
//
|
|
|
|
|
// Please note that this parameter doesn't affect updates created before the
|
|
|
|
|
// call to the setWebhook, so unwanted updates may be received for a short
|
|
|
|
|
// period of time.
|
|
|
|
|
AllowedUpdates []string `json:"allowed_updates,omitempty"`
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 11:08:09 +00:00
|
|
|
|
func NewWebhook(url string, file interface{}) *SetWebhookParameters {
|
|
|
|
|
params := &SetWebhookParameters{URL: url}
|
|
|
|
|
|
|
|
|
|
if file != nil {
|
|
|
|
|
var input InputFile = file
|
|
|
|
|
params.Certificate = &input
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return params
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-11 11:58:11 +00:00
|
|
|
|
// SetWebhook specify a url and receive incoming updates via an outgoing webhook.
|
|
|
|
|
// Whenever there is an update for the bot, we will send an HTTPS POST request to
|
|
|
|
|
// the specified url, containing a JSON-serialized Update. In case of an
|
|
|
|
|
// unsuccessful request, we will give up after a reasonable amount of attempts.
|
|
|
|
|
// Returns true.
|
|
|
|
|
//
|
|
|
|
|
// If you'd like to make sure that the Webhook request comes from Telegram, we
|
|
|
|
|
// recommend using a secret path in the URL, e.g. https://www.example.com/<token>.
|
|
|
|
|
// Since nobody else knows your bot‘s token, you can be pretty sure it’s us.
|
|
|
|
|
func (bot *Bot) SetWebhook(params *SetWebhookParameters) (bool, error) {
|
2017-10-17 11:11:20 +00:00
|
|
|
|
var args http.Args
|
|
|
|
|
args.Add("url", params.URL)
|
|
|
|
|
|
|
|
|
|
if len(params.AllowedUpdates) > 0 {
|
|
|
|
|
args.Add("allowed_updates", fmt.Sprint(`["`, strings.Join(params.AllowedUpdates, `","`), `"]`))
|
|
|
|
|
}
|
|
|
|
|
if params.MaxConnections > 0 {
|
|
|
|
|
args.Add("max_connections", strconv.Itoa(params.MaxConnections))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var buffer bytes.Buffer
|
|
|
|
|
multi := multipart.NewWriter(&buffer)
|
|
|
|
|
|
2017-10-12 09:49:05 +00:00
|
|
|
|
if params.Certificate != nil {
|
|
|
|
|
cert := *params.Certificate
|
2017-10-17 11:11:20 +00:00
|
|
|
|
switch file := cert.(type) {
|
2017-10-12 09:49:05 +00:00
|
|
|
|
case string:
|
2017-10-17 11:11:20 +00:00
|
|
|
|
f, err := os.Open(file)
|
2017-10-12 09:49:05 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
2017-10-17 11:11:20 +00:00
|
|
|
|
defer f.Close()
|
2017-10-12 09:49:05 +00:00
|
|
|
|
|
2017-10-17 11:11:20 +00:00
|
|
|
|
formFile, err := multi.CreateFormFile("certificate", f.Name())
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
if _, err = io.Copy(formFile, f); err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
multi.Close()
|
|
|
|
|
default:
|
|
|
|
|
return false, errors.New("use string only (for current version of go-telegram)")
|
|
|
|
|
}
|
2017-10-11 11:58:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-17 11:11:20 +00:00
|
|
|
|
resp, err := bot.upload(buffer.Bytes(), multi.Boundary(), "setWebhook", &args)
|
2017-10-11 11:58:11 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var data bool
|
|
|
|
|
err = json.Unmarshal(*resp.Result, &data)
|
|
|
|
|
return data, err
|
|
|
|
|
}
|