package telegram import ( "encoding/json" "io/ioutil" "net/http" "net/url" "strconv" "strings" ) const badChars = "_*[]()~`>#+-=|{}.!" type Client struct { Token string Offset int64 PollTimeout int64 } func (c *Client) Get(url string) ([]byte, error) { resp, err := http.Get("https://api.telegram.org/bot" + c.Token + url) if err != nil { return nil, err } return ioutil.ReadAll(resp.Body) } func (c *Client) Post(url string, data url.Values) ([]byte, error) { res, err := http.PostForm("https://api.telegram.org/bot"+c.Token+url, data) if err != nil { return nil, err } return ioutil.ReadAll(res.Body) } func (c *Client) GetUpdates() (Response, error) { var res Response values := url.Values{} values.Set("offset", strconv.FormatInt(c.Offset, 10)) values.Set("timeout", strconv.FormatInt(c.PollTimeout, 10)) body, err := c.Get("/getUpdates?" + values.Encode()) if err != nil { return res, err } res.Raw = string(body) err = json.Unmarshal(body, &res) if len(res.Result) > 0 { c.Offset = res.Result[len(res.Result)-1].UpdateID + 1 } return res, err } func EscapeMarkdown(msg string) string { for _, char := range badChars { ch := string(char) msg = strings.Replace(msg, ch, "\\"+ch, -1) } return msg } func (c *Client) SendMarkdownMessage(chatId, body string) (*SendMessageResponse, error) { return c.SendMessage(chatId, body, url.Values{"parse_mode": {"MarkdownV2"}}) } func mergeValues(a url.Values, b []url.Values) { for _, vals := range b { for key, val := range vals { a[key] = val } } } func (c *Client) SendMessage(chatId, text string, options ...url.Values) (ret *SendMessageResponse, err error) { values := url.Values{ "chat_id": {chatId}, "text": {text}, } mergeValues(values, options) body, err := c.Post("/sendMessage", values) if err != nil { return nil, err } var res SendMessageResponse err = json.Unmarshal(body, &res) return &res, err } func (c *Client) EditMessageText(chatId, messageId, text string, options ...url.Values) (ret *SendMessageResponse, err error) { values := url.Values{ "chat_id": {chatId}, "message_id": {messageId}, "text": {text}, } mergeValues(values, options) body, err := c.Post("/editMessageText", values) if err != nil { return nil, err } var res SendMessageResponse err = json.Unmarshal(body, &res) return &res, err }