2016-09-05 07:34:37 -07:00
|
|
|
package slack
|
|
|
|
|
|
|
|
// OutgoingMessage is used for the realtime API, and seems incomplete.
|
|
|
|
type OutgoingMessage struct {
|
2018-08-09 15:38:19 -07:00
|
|
|
ID int `json:"id"`
|
2018-01-08 13:41:38 -08:00
|
|
|
// channel ID
|
2018-12-01 10:55:35 -08:00
|
|
|
Channel string `json:"channel,omitempty"`
|
|
|
|
Text string `json:"text,omitempty"`
|
|
|
|
Type string `json:"type,omitempty"`
|
|
|
|
ThreadTimestamp string `json:"thread_ts,omitempty"`
|
|
|
|
ThreadBroadcast bool `json:"reply_broadcast,omitempty"`
|
|
|
|
IDs []string `json:"ids,omitempty"`
|
2016-09-05 07:34:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Message is an auxiliary type to allow us to have a message containing sub messages
|
|
|
|
type Message struct {
|
|
|
|
Msg
|
2020-03-01 11:59:19 -08:00
|
|
|
SubMessage *Msg `json:"message,omitempty"`
|
2019-09-07 13:46:58 -07:00
|
|
|
PreviousMessage *Msg `json:"previous_message,omitempty"`
|
2016-09-05 07:34:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Msg contains information about a slack message
|
|
|
|
type Msg struct {
|
|
|
|
// Basic Message
|
2020-03-01 11:59:19 -08:00
|
|
|
ClientMsgID string `json:"client_msg_id"`
|
2017-07-16 05:29:46 -07:00
|
|
|
Type string `json:"type,omitempty"`
|
|
|
|
Channel string `json:"channel,omitempty"`
|
|
|
|
User string `json:"user,omitempty"`
|
|
|
|
Text string `json:"text,omitempty"`
|
|
|
|
Timestamp string `json:"ts,omitempty"`
|
|
|
|
ThreadTimestamp string `json:"thread_ts,omitempty"`
|
|
|
|
IsStarred bool `json:"is_starred,omitempty"`
|
2018-08-09 15:38:19 -07:00
|
|
|
PinnedTo []string `json:"pinned_to,omitempty"`
|
2017-07-16 05:29:46 -07:00
|
|
|
Attachments []Attachment `json:"attachments,omitempty"`
|
|
|
|
Edited *Edited `json:"edited,omitempty"`
|
2018-08-09 15:38:19 -07:00
|
|
|
LastRead string `json:"last_read,omitempty"`
|
|
|
|
Subscribed bool `json:"subscribed,omitempty"`
|
|
|
|
UnreadCount int `json:"unread_count,omitempty"`
|
2016-09-05 07:34:37 -07:00
|
|
|
|
|
|
|
// Message Subtypes
|
|
|
|
SubType string `json:"subtype,omitempty"`
|
|
|
|
|
|
|
|
// Hidden Subtypes
|
|
|
|
Hidden bool `json:"hidden,omitempty"` // message_changed, message_deleted, unpinned_item
|
|
|
|
DeletedTimestamp string `json:"deleted_ts,omitempty"` // message_deleted
|
|
|
|
EventTimestamp string `json:"event_ts,omitempty"`
|
|
|
|
|
|
|
|
// bot_message (https://api.slack.com/events/message/bot_message)
|
|
|
|
BotID string `json:"bot_id,omitempty"`
|
|
|
|
Username string `json:"username,omitempty"`
|
|
|
|
Icons *Icon `json:"icons,omitempty"`
|
|
|
|
|
|
|
|
// channel_join, group_join
|
|
|
|
Inviter string `json:"inviter,omitempty"`
|
|
|
|
|
|
|
|
// channel_topic, group_topic
|
|
|
|
Topic string `json:"topic,omitempty"`
|
|
|
|
|
|
|
|
// channel_purpose, group_purpose
|
|
|
|
Purpose string `json:"purpose,omitempty"`
|
|
|
|
|
|
|
|
// channel_name, group_name
|
|
|
|
Name string `json:"name,omitempty"`
|
|
|
|
OldName string `json:"old_name,omitempty"`
|
|
|
|
|
|
|
|
// channel_archive, group_archive
|
|
|
|
Members []string `json:"members,omitempty"`
|
|
|
|
|
2017-07-16 05:29:46 -07:00
|
|
|
// 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"`
|
|
|
|
|
2016-09-05 07:34:37 -07:00
|
|
|
// file_share, file_comment, file_mention
|
2018-08-09 15:38:19 -07:00
|
|
|
Files []File `json:"files,omitempty"`
|
2016-09-05 07:34:37 -07:00
|
|
|
|
|
|
|
// file_share
|
|
|
|
Upload bool `json:"upload,omitempty"`
|
|
|
|
|
|
|
|
// file_comment
|
|
|
|
Comment *Comment `json:"comment,omitempty"`
|
|
|
|
|
|
|
|
// pinned_item
|
|
|
|
ItemType string `json:"item_type,omitempty"`
|
|
|
|
|
|
|
|
// https://api.slack.com/rtm
|
|
|
|
ReplyTo int `json:"reply_to,omitempty"`
|
|
|
|
Team string `json:"team,omitempty"`
|
|
|
|
|
|
|
|
// reactions
|
|
|
|
Reactions []ItemReaction `json:"reactions,omitempty"`
|
2018-08-09 15:38:19 -07:00
|
|
|
|
|
|
|
// slash commands and interactive messages
|
|
|
|
ResponseType string `json:"response_type,omitempty"`
|
|
|
|
ReplaceOriginal bool `json:"replace_original"`
|
|
|
|
DeleteOriginal bool `json:"delete_original"`
|
2019-09-07 13:46:58 -07:00
|
|
|
|
|
|
|
// Block type Message
|
|
|
|
Blocks Blocks `json:"blocks,omitempty"`
|
2016-09-05 07:34:37 -07:00
|
|
|
}
|
|
|
|
|
2019-09-07 13:46:58 -07:00
|
|
|
const (
|
|
|
|
// ResponseTypeInChannel in channel response for slash commands.
|
|
|
|
ResponseTypeInChannel = "in_channel"
|
2019-12-07 13:54:36 -08:00
|
|
|
// ResponseTypeEphemeral ephemeral response for slash commands.
|
2019-09-07 13:46:58 -07:00
|
|
|
ResponseTypeEphemeral = "ephemeral"
|
|
|
|
)
|
|
|
|
|
2016-09-05 07:34:37 -07:00
|
|
|
// Icon is used for bot messages
|
|
|
|
type Icon struct {
|
|
|
|
IconURL string `json:"icon_url,omitempty"`
|
|
|
|
IconEmoji string `json:"icon_emoji,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Edited indicates that a message has been edited.
|
|
|
|
type Edited struct {
|
|
|
|
User string `json:"user,omitempty"`
|
|
|
|
Timestamp string `json:"ts,omitempty"`
|
|
|
|
}
|
|
|
|
|
2017-07-16 05:29:46 -07:00
|
|
|
// Reply contains information about a reply for a thread
|
|
|
|
type Reply struct {
|
|
|
|
User string `json:"user,omitempty"`
|
|
|
|
Timestamp string `json:"ts,omitempty"`
|
|
|
|
}
|
|
|
|
|
2016-09-05 07:34:37 -07:00
|
|
|
// Event contains the event type
|
|
|
|
type Event struct {
|
|
|
|
Type string `json:"type,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ping contains information about a Ping Event
|
|
|
|
type Ping struct {
|
2018-08-09 15:38:19 -07:00
|
|
|
ID int `json:"id"`
|
|
|
|
Type string `json:"type"`
|
|
|
|
Timestamp int64 `json:"timestamp"`
|
2016-09-05 07:34:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Pong contains information about a Pong Event
|
|
|
|
type Pong struct {
|
2018-08-09 15:38:19 -07:00
|
|
|
Type string `json:"type"`
|
|
|
|
ReplyTo int `json:"reply_to"`
|
|
|
|
Timestamp int64 `json:"timestamp"`
|
2016-09-05 07:34:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewOutgoingMessage prepares an OutgoingMessage that the user can
|
|
|
|
// use to send a message. Use this function to properly set the
|
|
|
|
// messageID.
|
2018-08-09 15:38:19 -07:00
|
|
|
func (rtm *RTM) NewOutgoingMessage(text string, channelID string, options ...RTMsgOption) *OutgoingMessage {
|
2016-09-05 07:34:37 -07:00
|
|
|
id := rtm.idGen.Next()
|
2018-08-09 15:38:19 -07:00
|
|
|
msg := OutgoingMessage{
|
2016-09-05 07:34:37 -07:00
|
|
|
ID: id,
|
|
|
|
Type: "message",
|
2018-01-08 13:41:38 -08:00
|
|
|
Channel: channelID,
|
2016-09-05 07:34:37 -07:00
|
|
|
Text: text,
|
|
|
|
}
|
2018-08-09 15:38:19 -07:00
|
|
|
for _, option := range options {
|
|
|
|
option(&msg)
|
|
|
|
}
|
|
|
|
return &msg
|
2016-09-05 07:34:37 -07:00
|
|
|
}
|
|
|
|
|
2018-12-01 10:55:35 -08:00
|
|
|
// NewSubscribeUserPresence prepares an OutgoingMessage that the user can
|
|
|
|
// use to subscribe presence events for the specified users.
|
|
|
|
func (rtm *RTM) NewSubscribeUserPresence(ids []string) *OutgoingMessage {
|
|
|
|
return &OutgoingMessage{
|
|
|
|
Type: "presence_sub",
|
|
|
|
IDs: ids,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-05 07:34:37 -07:00
|
|
|
// NewTypingMessage prepares an OutgoingMessage that the user can
|
|
|
|
// use to send as a typing indicator. Use this function to properly set the
|
|
|
|
// messageID.
|
2018-01-08 13:41:38 -08:00
|
|
|
func (rtm *RTM) NewTypingMessage(channelID string) *OutgoingMessage {
|
2016-09-05 07:34:37 -07:00
|
|
|
id := rtm.idGen.Next()
|
|
|
|
return &OutgoingMessage{
|
|
|
|
ID: id,
|
|
|
|
Type: "typing",
|
2018-01-08 13:41:38 -08:00
|
|
|
Channel: channelID,
|
2016-09-05 07:34:37 -07:00
|
|
|
}
|
|
|
|
}
|
2018-08-09 15:38:19 -07:00
|
|
|
|
|
|
|
// RTMsgOption allows configuration of various options available for sending an RTM message
|
|
|
|
type RTMsgOption func(*OutgoingMessage)
|
|
|
|
|
|
|
|
// RTMsgOptionTS sets thead timestamp of an outgoing message in order to respond to a thread
|
|
|
|
func RTMsgOptionTS(threadTimestamp string) RTMsgOption {
|
|
|
|
return func(msg *OutgoingMessage) {
|
|
|
|
msg.ThreadTimestamp = threadTimestamp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// RTMsgOptionBroadcast sets broadcast reply to channel to "true"
|
|
|
|
func RTMsgOptionBroadcast() RTMsgOption {
|
|
|
|
return func(msg *OutgoingMessage) {
|
|
|
|
msg.ThreadBroadcast = true
|
|
|
|
}
|
|
|
|
}
|