icq/messages.go
Alexander Kiryukhin 9efc5ffd51 New BotApi
2019-08-13 15:26:05 +03:00

265 lines
5.7 KiB
Go

package icq
import (
"bytes"
"encoding/json"
"io"
"log"
"mime/multipart"
"net/http"
"net/url"
"os"
)
type messages struct {
client *client
}
func newMessages(client *client) *messages {
return &messages{client: client}
}
func (f *messages) SendText(chatID string, text string, replyMsgID []string, forwardChatID string, forwardMsgID string) (*Msg, error) {
params := url.Values{
"chatId": []string{chatID},
"text": []string{text},
}
if replyMsgID != nil && len(replyMsgID) > 0 {
for _, msgID := range replyMsgID {
params.Add("replyMsgId", msgID)
}
}
if forwardChatID != "" {
params.Set("forwardChatId", forwardChatID)
}
if forwardMsgID != "" {
params.Set("forwardMsgId", forwardMsgID)
}
resp, err := f.client.request(
http.MethodGet,
"/messages/sendText",
params,
nil,
)
if err != nil {
return nil, err
}
result := new(Msg)
return result, json.NewDecoder(resp).Decode(result)
}
func (f *messages) SendExistsFile(chatID string, fileID string, caption string, replyMsgID []string, forwardChatID string, forwardMsgID string) (*Msg, error) {
params := url.Values{
"chatId": []string{chatID},
"fileId": []string{fileID},
"caption": []string{caption},
}
if replyMsgID != nil && len(replyMsgID) > 0 {
for _, msgID := range replyMsgID {
params.Add("replyMsgId", msgID)
}
}
if forwardChatID != "" {
params.Set("forwardChatId", forwardChatID)
}
if forwardMsgID != "" {
params.Set("forwardMsgId", forwardMsgID)
}
resp, err := f.client.request(
http.MethodGet,
"/messages/sendFile",
params,
nil,
)
if err != nil {
return nil, err
}
result := new(Msg)
return result, json.NewDecoder(resp).Decode(result)
}
func (f *messages) SendFile(chatID string, fileName string, caption string, replyMsgID []string, forwardChatID string, forwardMsgID string) (*MsgLoadFile, error) {
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
fileWriter, err := bodyWriter.CreateFormFile("file", fileName)
if err != nil {
return nil, err
}
fh, err := os.Open(fileName)
if err != nil {
return nil, err
}
defer func() {
if err := fh.Close(); err != nil {
log.Println(err)
}
}()
_, err = io.Copy(fileWriter, fh)
if err != nil {
return nil, err
}
if err := bodyWriter.Close(); err != nil {
return nil, err
}
contentType := bodyWriter.FormDataContentType()
params := url.Values{
"chatId": []string{chatID},
"caption": []string{caption},
}
if replyMsgID != nil && len(replyMsgID) > 0 {
for _, msgID := range replyMsgID {
params.Add("replyMsgId", msgID)
}
}
if forwardChatID != "" {
params.Set("forwardChatId", forwardChatID)
}
if forwardMsgID != "" {
params.Set("forwardMsgId", forwardMsgID)
}
resp, err := f.client.requestWithContentType(
http.MethodPost,
"/messages/sendFile",
params,
bodyBuf,
contentType,
)
if err != nil {
return nil, err
}
result := new(MsgLoadFile)
return result, json.NewDecoder(resp).Decode(result)
}
func (f *messages) SendExistsVoice(chatID string, fileID string, replyMsgID []string, forwardChatID string, forwardMsgID string) (*Msg, error) {
params := url.Values{
"chatId": []string{chatID},
"fileId": []string{fileID},
}
if replyMsgID != nil && len(replyMsgID) > 0 {
for _, msgID := range replyMsgID {
params.Add("replyMsgId", msgID)
}
}
if forwardChatID != "" {
params.Set("forwardChatId", forwardChatID)
}
if forwardMsgID != "" {
params.Set("forwardMsgId", forwardMsgID)
}
resp, err := f.client.request(
http.MethodGet,
"/messages/sendVoice",
params,
nil,
)
if err != nil {
return nil, err
}
result := new(Msg)
return result, json.NewDecoder(resp).Decode(result)
}
func (f *messages) SendVoice(chatID string, fileName string, replyMsgID []string, forwardChatID string, forwardMsgID string) (*MsgLoadFile, error) {
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
fileWriter, err := bodyWriter.CreateFormFile("file", fileName)
if err != nil {
return nil, err
}
fh, err := os.Open(fileName)
if err != nil {
return nil, err
}
defer func() {
if err := fh.Close(); err != nil {
log.Println(err)
}
}()
_, err = io.Copy(fileWriter, fh)
if err != nil {
return nil, err
}
if err := bodyWriter.Close(); err != nil {
return nil, err
}
contentType := bodyWriter.FormDataContentType()
params := url.Values{
"chatId": []string{chatID},
}
if replyMsgID != nil && len(replyMsgID) > 0 {
for _, msgID := range replyMsgID {
params.Add("replyMsgId", msgID)
}
}
if forwardChatID != "" {
params.Set("forwardChatId", forwardChatID)
}
if forwardMsgID != "" {
params.Set("forwardMsgId", forwardMsgID)
}
resp, err := f.client.requestWithContentType(
http.MethodPost,
"/messages/sendVoice",
params,
bodyBuf,
contentType,
)
if err != nil {
return nil, err
}
result := new(MsgLoadFile)
return result, json.NewDecoder(resp).Decode(result)
}
func (f *messages) EditText(chatID string, text string, msgID string) (bool, error) {
params := url.Values{
"msgId": []string{msgID},
"chatId": []string{chatID},
"text": []string{text},
}
resp, err := f.client.request(
http.MethodGet,
"/messages/editText",
params,
nil,
)
if err != nil {
return false, err
}
result := new(OK)
return result.OK, json.NewDecoder(resp).Decode(result)
}
func (f *messages) DeleteMessages(chatID string, msgIDs []string) (bool, error) {
params := url.Values{
"chatId": []string{chatID},
}
if msgIDs != nil && len(msgIDs) > 0 {
for _, msgID := range msgIDs {
params.Add("msgId", msgID)
}
}
resp, err := f.client.request(
http.MethodGet,
"/messages/deleteMessages",
params,
nil,
)
if err != nil {
return false, err
}
result := new(OK)
return result.OK, json.NewDecoder(resp).Decode(result)
}