1
0
mirror of https://github.com/badkaktus/gorocket.git synced 2024-12-12 11:15:05 +02:00
gorocket/chat.go
2024-02-03 21:54:40 +02:00

313 lines
7.9 KiB
Go

package gorocket
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"strconv"
"time"
)
type Message struct {
Alias string `json:"alias,omitempty"`
Avatar string `json:"avatar,omitempty"`
Channel string `json:"channel,omitempty"`
Emoji string `json:"emoji,omitempty"`
RoomID string `json:"roomId,omitempty"`
Text string `json:"text"`
Attachments []Attachment `json:"attachments"`
}
type Attachment struct {
AudioURL string `json:"audio_url,omitempty"`
AuthorIcon string `json:"author_icon,omitempty"`
AuthorLink string `json:"author_link,omitempty"`
AuthorName string `json:"author_name,omitempty"`
Collapsed bool `json:"collapsed,omitempty"`
Color string `json:"color,omitempty"`
Fields []AttachField `json:"fields,omitempty"`
ImageURL string `json:"image_url,omitempty"`
MessageLink string `json:"message_link,omitempty"`
Text string `json:"text,omitempty"`
ThumbURL string `json:"thumb_url,omitempty"`
Title string `json:"title,omitempty"`
TitleLink string `json:"title_link,omitempty"`
TitleLinkDownload bool `json:"title_link_download,omitempty"`
Ts time.Time `json:"ts,omitempty"`
VideoURL string `json:"video_url,omitempty"`
}
type AttachField struct {
Short bool `json:"short,omitempty"`
Title string `json:"title,omitempty"`
Value string `json:"value,omitempty"`
}
type RespPostMessage struct {
Ts int64 `json:"ts"`
Channel string `json:"channel"`
Message RespMessageData `json:"message"`
Success bool `json:"success"`
Error string `json:"error,omitempty"`
ErrorType string `json:"errorType,omitempty"`
}
type RespMessageData struct {
Alias string `json:"alias,omitempty"`
Msg string `json:"msg,omitempty"`
ParseUrls bool `json:"parseUrls,omitempty"`
Groupable bool `json:"groupable,omitempty"`
Ts time.Time `json:"ts,omitempty"`
U UChat `json:"u,omitempty"`
Rid string `json:"rid,omitempty"`
UpdatedAt time.Time `json:"_updatedAt,omitempty"`
ID string `json:"_id,omitempty"`
}
type UChat struct {
ID string `json:"_id,omitempty"`
Username string `json:"username,omitempty"`
}
type SingleMessageId struct {
MessageId string `json:"messageId"`
}
type GetMessageResponse struct {
Message MessageResp `json:"message"`
Success bool `json:"success"`
}
type MessageResp struct {
ID string `json:"_id"`
Rid string `json:"rid"`
Msg string `json:"msg"`
Ts time.Time `json:"ts"`
U struct {
ID string `json:"_id"`
Username string `json:"username"`
} `json:"u"`
}
type DeleteMessageRequest struct {
RoomID string `json:"roomId"`
MsgID string `json:"msgId"`
AsUser bool `json:"asUser,omitempty"`
}
// todo add the remaining fields
type DeleteMessageResponse struct {
ID string `json:"_id"`
Ts int64 `json:"ts"`
Success bool `json:"success"`
}
type GetPinnedMsgRequest struct {
RoomId string
Count int
Offset int
}
type GetPinnedMsgResponse struct {
Messages []PinnedMessage `json:"messages"`
Count int `json:"count"`
Offset int `json:"offset"`
Total int `json:"total"`
Success bool `json:"success"`
}
type PinnedMessage struct {
ID string `json:"_id"`
Rid string `json:"rid"`
Msg string `json:"msg"`
Ts time.Time `json:"ts"`
U struct {
ID string `json:"_id"`
Username string `json:"username"`
Name string `json:"name"`
} `json:"u"`
Mentions []interface{} `json:"mentions"`
Channels []interface{} `json:"channels"`
UpdatedAt time.Time `json:"_updatedAt"`
Pinned bool `json:"pinned"`
PinnedAt time.Time `json:"pinnedAt"`
PinnedBy struct {
ID string `json:"_id"`
Username string `json:"username"`
} `json:"pinnedBy"`
}
type PinMessageResponse struct {
Message struct {
T string `json:"t"`
Rid string `json:"rid"`
Ts time.Time `json:"ts"`
Msg string `json:"msg"`
U struct {
ID string `json:"_id"`
Username string `json:"username"`
} `json:"u"`
Groupable bool `json:"groupable"`
Attachments []struct {
Text string `json:"text"`
AuthorName string `json:"author_name"`
AuthorIcon string `json:"author_icon"`
Ts time.Time `json:"ts"`
} `json:"attachments"`
UpdatedAt time.Time `json:"_updatedAt"`
ID string `json:"_id"`
} `json:"message"`
Success bool `json:"success"`
}
// PostMessage posts a new chat message.
func (c *Client) PostMessage(msg *Message) (*RespPostMessage, error) {
opt, _ := json.Marshal(msg)
req, err := http.NewRequest("POST",
fmt.Sprintf("%s/%s/chat.postMessage", c.baseURL, c.apiVersion),
bytes.NewBuffer(opt))
if err != nil {
return nil, err
}
res := RespPostMessage{}
if err := c.sendRequest(req, &res); err != nil {
return nil, err
}
return &res, nil
}
// GetMessage retrieves a single chat message by the provided id.
// Callee must have permission to access the room where the message resides.
func (c *Client) GetMessage(param *SingleMessageId) (*GetMessageResponse, error) {
req, err := http.NewRequest("GET",
fmt.Sprintf("%s/%s/chat.getMessage", c.baseURL, c.apiVersion),
nil)
if param.MessageId == "" {
return nil, fmt.Errorf("false parameters")
}
url := req.URL.Query()
if param.MessageId != "" {
url.Add("msgId", param.MessageId)
}
req.URL.RawQuery = url.Encode()
if err != nil {
return nil, err
}
res := GetMessageResponse{}
if err := c.sendRequest(req, &res); err != nil {
return nil, err
}
return &res, nil
}
// DeleteMessage deletes an existing chat message.
func (c *Client) DeleteMessage(param *DeleteMessageRequest) (*DeleteMessageResponse, error) {
opt, _ := json.Marshal(param)
req, err := http.NewRequest("POST",
fmt.Sprintf("%s/%s/chat.delete", c.baseURL, c.apiVersion),
bytes.NewBuffer(opt))
if err != nil {
return nil, err
}
res := DeleteMessageResponse{}
if err := c.sendRequest(req, &res); err != nil {
return nil, err
}
return &res, nil
}
// GetPinnedMessages retrieve pinned messages from a room.
func (c *Client) GetPinnedMessages(param *GetPinnedMsgRequest) (*GetPinnedMsgResponse, error) {
req, err := http.NewRequest("GET",
fmt.Sprintf("%s/%s/chat.getPinnedMessages", c.baseURL, c.apiVersion),
nil)
if param.RoomId == "" {
return nil, fmt.Errorf("false parameters")
}
url := req.URL.Query()
if param.RoomId != "" {
url.Add("roomId", param.RoomId)
}
if param.Offset != 0 {
url.Add("offset", strconv.Itoa(param.Offset))
}
if param.Count != 0 {
url.Add("count", strconv.Itoa(param.Count))
}
req.URL.RawQuery = url.Encode()
if err != nil {
return nil, err
}
res := GetPinnedMsgResponse{}
if err := c.sendRequest(req, &res); err != nil {
return nil, err
}
return &res, nil
}
// PinMessage pins a chat message to the message's channel.
func (c *Client) PinMessage(param *SingleMessageId) (*PinMessageResponse, error) {
opt, _ := json.Marshal(param)
req, err := http.NewRequest("POST",
fmt.Sprintf("%s/%s/chat.pinMessage", c.baseURL, c.apiVersion),
bytes.NewBuffer(opt))
if err != nil {
return nil, err
}
res := PinMessageResponse{}
if err := c.sendRequest(req, &res); err != nil {
return nil, err
}
return &res, nil
}
// UnpinMessage unpins a chat message to the message's channel.
func (c *Client) UnpinMessage(param *SingleMessageId) (*SimpleSuccessResponse, error) {
opt, _ := json.Marshal(param)
req, err := http.NewRequest("POST",
fmt.Sprintf("%s/%s/chat.unPinMessage", c.baseURL, c.apiVersion),
bytes.NewBuffer(opt))
if err != nil {
return nil, err
}
res := SimpleSuccessResponse{}
if err := c.sendRequest(req, &res); err != nil {
return nil, err
}
return &res, nil
}