diff --git a/channels.go b/channels.go index 05cfbe1..b868e77 100644 --- a/channels.go +++ b/channels.go @@ -259,3 +259,17 @@ } return response.Topic, nil } + +// GetChannelReplies gets an entire thread (a message plus all the messages in reply to it). +func (api *Client) GetChannelReplies(channel, thread_ts string) ([]Message, error) { + values := url.Values{ + "token": {api.config.token}, + "channel": {channel}, + "thread_ts": {thread_ts}, + } + response, err := channelRequest("channels.replies", values, api.debug) + if err != nil { + return nil, err + } + return response.History.Messages, nil +} diff --git a/messages.go b/messages.go index f5c76b7..39f0d6b 100644 --- a/messages.go +++ b/messages.go @@ -58,6 +58,11 @@ // channel_archive, group_archive Members []string `json:"members,omitempty"` + // channels.replies, groups.replies, im.replies, mpim.replies + ReplyCount int `json:"reply_count,omitempty"` + Replies []Reply `json:"replies,omitempty"` + ParentUserId string `json:"parent_user_id,omitempty"` + // file_share, file_comment, file_mention File *File `json:"file,omitempty"` @@ -86,6 +91,12 @@ // Edited indicates that a message has been edited. type Edited struct { + User string `json:"user,omitempty"` + Timestamp string `json:"ts,omitempty"` +} + +// Reply contains information about a reply for a thread +type Reply struct { User string `json:"user,omitempty"` Timestamp string `json:"ts,omitempty"` } diff --git a/messages_test.go b/messages_test.go index c78066f..acdc020 100644 --- a/messages_test.go +++ b/messages_test.go @@ -526,6 +526,65 @@ assert.Equal(t, "U1234", message.User) } +var channelRepliesParentMessage = `{ + "type": "message", + "user": "U1234", + "text": "test", + "thread_ts": "1493305433.915644", + "reply_count": 2, + "replies": [ + { + "user": "U5678", + "ts": "1493305444.920992" + }, + { + "user": "U9012", + "ts": "1493305894.133936" + } + ], + "subscribed": true, + "last_read": "1493305894.133936", + "unread_count": 0, + "ts": "1493305433.915644" +}` + +func TestChannelRepliesParentMessage(t *testing.T) { + message, err := unmarshalMessage(channelRepliesParentMessage) + assert.Nil(t, err) + assert.NotNil(t, message) + assert.Equal(t, "message", message.Type) + assert.Equal(t, "U1234", message.User) + assert.Equal(t, "test", message.Text) + assert.Equal(t, "1493305433.915644", message.ThreadTimestamp) + assert.Equal(t, 2, message.ReplyCount) + assert.Equal(t, "U5678", message.Replies[0].User) + assert.Equal(t, "1493305444.920992", message.Replies[0].Timestamp) + assert.Equal(t, "U9012", message.Replies[1].User) + assert.Equal(t, "1493305894.133936", message.Replies[1].Timestamp) + assert.Equal(t, "1493305433.915644", message.Timestamp) +} + +var channelRepliesChildMessage = `{ + "type": "message", + "user": "U5678", + "text": "foo", + "thread_ts": "1493305433.915644", + "parent_user_id": "U1234", + "ts": "1493305444.920992" +}` + +func TestChannelRepliesChildMessage(t *testing.T) { + message, err := unmarshalMessage(channelRepliesChildMessage) + assert.Nil(t, err) + assert.NotNil(t, message) + assert.Equal(t, "message", message.Type) + assert.Equal(t, "U5678", message.User) + assert.Equal(t, "foo", message.Text) + assert.Equal(t, "1493305433.915644", message.ThreadTimestamp) + assert.Equal(t, "U1234", message.ParentUserId) + assert.Equal(t, "1493305444.920992", message.Timestamp) +} + var groupJoinMessage = `{ "type": "message", "subtype": "group_join",