summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/nlopes/slack/chat.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/nlopes/slack/chat.go')
-rw-r--r--vendor/github.com/nlopes/slack/chat.go200
1 files changed, 136 insertions, 64 deletions
diff --git a/vendor/github.com/nlopes/slack/chat.go b/vendor/github.com/nlopes/slack/chat.go
index 0eb042df..2b89a44c 100644
--- a/vendor/github.com/nlopes/slack/chat.go
+++ b/vendor/github.com/nlopes/slack/chat.go
@@ -3,17 +3,16 @@ package slack
import (
"context"
"encoding/json"
- "errors"
"net/url"
"strings"
)
const (
DEFAULT_MESSAGE_USERNAME = ""
- DEFAULT_MESSAGE_THREAD_TIMESTAMP = ""
DEFAULT_MESSAGE_REPLY_BROADCAST = false
DEFAULT_MESSAGE_ASUSER = false
DEFAULT_MESSAGE_PARSE = ""
+ DEFAULT_MESSAGE_THREAD_TIMESTAMP = ""
DEFAULT_MESSAGE_LINK_NAMES = 0
DEFAULT_MESSAGE_UNFURL_LINKS = false
DEFAULT_MESSAGE_UNFURL_MEDIA = true
@@ -24,16 +23,26 @@ const (
)
type chatResponseFull struct {
- Channel string `json:"channel"`
- Timestamp string `json:"ts"`
- Text string `json:"text"`
+ Channel string `json:"channel"`
+ Timestamp string `json:"ts"` //Regualr message timestamp
+ MessageTimeStamp string `json:"message_ts"` //Ephemeral message timestamp
+ Text string `json:"text"`
SlackResponse
}
+// getMessageTimestamp will inspect the `chatResponseFull` to ruturn a timestamp value
+// in `chat.postMessage` its under `ts`
+// in `chat.postEphemeral` its under `message_ts`
+func (c chatResponseFull) getMessageTimestamp() string {
+ if len(c.Timestamp) > 0 {
+ return c.Timestamp
+ }
+ return c.MessageTimeStamp
+}
+
// PostMessageParameters contains all the parameters necessary (including the optional ones) for a PostMessage() request
type PostMessageParameters struct {
- Text string `json:"text"`
- Username string `json:"user_name"`
+ Username string `json:"username"`
AsUser bool `json:"as_user"`
Parse string `json:"parse"`
ThreadTimestamp string `json:"thread_ts"`
@@ -55,18 +64,19 @@ type PostMessageParameters struct {
// NewPostMessageParameters provides an instance of PostMessageParameters with all the sane default values set
func NewPostMessageParameters() PostMessageParameters {
return PostMessageParameters{
- Username: DEFAULT_MESSAGE_USERNAME,
- User: DEFAULT_MESSAGE_USERNAME,
- AsUser: DEFAULT_MESSAGE_ASUSER,
- Parse: DEFAULT_MESSAGE_PARSE,
- LinkNames: DEFAULT_MESSAGE_LINK_NAMES,
- Attachments: nil,
- UnfurlLinks: DEFAULT_MESSAGE_UNFURL_LINKS,
- UnfurlMedia: DEFAULT_MESSAGE_UNFURL_MEDIA,
- IconURL: DEFAULT_MESSAGE_ICON_URL,
- IconEmoji: DEFAULT_MESSAGE_ICON_EMOJI,
- Markdown: DEFAULT_MESSAGE_MARKDOWN,
- EscapeText: DEFAULT_MESSAGE_ESCAPE_TEXT,
+ Username: DEFAULT_MESSAGE_USERNAME,
+ User: DEFAULT_MESSAGE_USERNAME,
+ AsUser: DEFAULT_MESSAGE_ASUSER,
+ Parse: DEFAULT_MESSAGE_PARSE,
+ ThreadTimestamp: DEFAULT_MESSAGE_THREAD_TIMESTAMP,
+ LinkNames: DEFAULT_MESSAGE_LINK_NAMES,
+ Attachments: nil,
+ UnfurlLinks: DEFAULT_MESSAGE_UNFURL_LINKS,
+ UnfurlMedia: DEFAULT_MESSAGE_UNFURL_MEDIA,
+ IconURL: DEFAULT_MESSAGE_ICON_URL,
+ IconEmoji: DEFAULT_MESSAGE_ICON_EMOJI,
+ Markdown: DEFAULT_MESSAGE_MARKDOWN,
+ EscapeText: DEFAULT_MESSAGE_ESCAPE_TEXT,
}
}
@@ -112,11 +122,10 @@ func (api *Client) PostMessageContext(ctx context.Context, channel, text string,
// PostEphemeral sends an ephemeral message to a user in a channel.
// Message is escaped by default according to https://api.slack.com/docs/formatting
// Use http://davestevens.github.io/slack-message-builder/ to help crafting your message.
-func (api *Client) PostEphemeral(channel, userID string, options ...MsgOption) (string, error) {
- options = append(options, MsgOptionPostEphemeral())
+func (api *Client) PostEphemeral(channelID, userID string, options ...MsgOption) (string, error) {
return api.PostEphemeralContext(
context.Background(),
- channel,
+ channelID,
userID,
options...,
)
@@ -124,30 +133,19 @@ func (api *Client) PostEphemeral(channel, userID string, options ...MsgOption) (
// PostEphemeralContext sends an ephemeal message to a user in a channel with a custom context
// For more details, see PostEphemeral documentation
-func (api *Client) PostEphemeralContext(ctx context.Context, channel, userID string, options ...MsgOption) (string, error) {
- path, values, err := ApplyMsgOptions(api.config.token, channel, options...)
- if err != nil {
- return "", err
- }
-
- values.Add("user", userID)
-
- response, err := chatRequest(ctx, path, values, api.debug)
- if err != nil {
- return "", err
- }
-
- return response.Timestamp, nil
+func (api *Client) PostEphemeralContext(ctx context.Context, channelID, userID string, options ...MsgOption) (timestamp string, err error) {
+ _, timestamp, _, err = api.SendMessageContext(ctx, channelID, append(options, MsgOptionPostEphemeral2(userID))...)
+ return timestamp, err
}
// UpdateMessage updates a message in a channel
-func (api *Client) UpdateMessage(channel, timestamp, text string) (string, string, string, error) {
- return api.UpdateMessageContext(context.Background(), channel, timestamp, text)
+func (api *Client) UpdateMessage(channelID, timestamp, text string) (string, string, string, error) {
+ return api.UpdateMessageContext(context.Background(), channelID, timestamp, text)
}
-// UpdateMessage updates a message in a channel
-func (api *Client) UpdateMessageContext(ctx context.Context, channel, timestamp, text string) (string, string, string, error) {
- return api.SendMessageContext(ctx, channel, MsgOptionUpdate(timestamp), MsgOptionText(text, true))
+// UpdateMessageContext updates a message in a channel
+func (api *Client) UpdateMessageContext(ctx context.Context, channelID, timestamp, text string) (string, string, string, error) {
+ return api.SendMessageContext(ctx, channelID, MsgOptionUpdate(timestamp), MsgOptionText(text, true))
}
// SendMessage more flexible method for configuring messages.
@@ -156,22 +154,30 @@ func (api *Client) SendMessage(channel string, options ...MsgOption) (string, st
}
// SendMessageContext more flexible method for configuring messages with a custom context.
-func (api *Client) SendMessageContext(ctx context.Context, channel string, options ...MsgOption) (string, string, string, error) {
- channel, values, err := ApplyMsgOptions(api.config.token, channel, options...)
- if err != nil {
+func (api *Client) SendMessageContext(ctx context.Context, channelID string, options ...MsgOption) (channel string, timestamp string, text string, err error) {
+ var (
+ config sendConfig
+ response chatResponseFull
+ )
+
+ if config, err = applyMsgOptions(api.token, channelID, options...); err != nil {
return "", "", "", err
}
- response, err := chatRequest(ctx, channel, values, api.debug)
- if err != nil {
+ if err = postSlackMethod(ctx, api.httpclient, string(config.mode), config.values, &response, api.debug); err != nil {
return "", "", "", err
}
- return response.Channel, response.Timestamp, response.Text, nil
+ return response.Channel, response.getMessageTimestamp(), response.Text, response.Err()
}
// ApplyMsgOptions utility function for debugging/testing chat requests.
func ApplyMsgOptions(token, channel string, options ...MsgOption) (string, url.Values, error) {
+ config, err := applyMsgOptions(token, channel, options...)
+ return string(config.mode), config.values, err
+}
+
+func applyMsgOptions(token, channel string, options ...MsgOption) (sendConfig, error) {
config := sendConfig{
mode: chatPostMessage,
values: url.Values{
@@ -182,11 +188,11 @@ func ApplyMsgOptions(token, channel string, options ...MsgOption) (string, url.V
for _, opt := range options {
if err := opt(&config); err != nil {
- return string(config.mode), config.values, err
+ return config, err
}
}
- return string(config.mode), config.values, nil
+ return config, nil
}
func escapeMessage(message string) string {
@@ -194,18 +200,6 @@ func escapeMessage(message string) string {
return replacer.Replace(message)
}
-func chatRequest(ctx context.Context, path string, values url.Values, debug bool) (*chatResponseFull, error) {
- response := &chatResponseFull{}
- err := post(ctx, path, values, response, debug)
- if err != nil {
- return nil, err
- }
- if !response.Ok {
- return nil, errors.New(response.Error)
- }
- return response, nil
-}
-
type sendMode string
const (
@@ -213,6 +207,7 @@ const (
chatPostMessage sendMode = "chat.postMessage"
chatDelete sendMode = "chat.delete"
chatPostEphemeral sendMode = "chat.postEphemeral"
+ chatMeMessage sendMode = "chat.meMessage"
)
type sendConfig struct {
@@ -232,7 +227,8 @@ func MsgOptionPost() MsgOption {
}
}
-// MsgOptionPostEphemeral posts an ephemeral message
+// MsgOptionPostEphemeral - DEPRECATED: use MsgOptionPostEphemeral2
+// posts an ephemeral message.
func MsgOptionPostEphemeral() MsgOption {
return func(config *sendConfig) error {
config.mode = chatPostEphemeral
@@ -241,6 +237,25 @@ func MsgOptionPostEphemeral() MsgOption {
}
}
+// MsgOptionPostEphemeral2 - posts an ephemeral message to the provided user.
+func MsgOptionPostEphemeral2(userID string) MsgOption {
+ return func(config *sendConfig) error {
+ config.mode = chatPostEphemeral
+ MsgOptionUser(userID)(config)
+ config.values.Del("ts")
+
+ return nil
+ }
+}
+
+// MsgOptionMeMessage posts a "me message" type from the calling user
+func MsgOptionMeMessage() MsgOption {
+ return func(config *sendConfig) error {
+ config.mode = chatMeMessage
+ return nil
+ }
+}
+
// MsgOptionUpdate updates a message based on the timestamp.
func MsgOptionUpdate(timestamp string) MsgOption {
return func(config *sendConfig) error {
@@ -269,6 +284,14 @@ func MsgOptionAsUser(b bool) MsgOption {
}
}
+// MsgOptionUser set the user for the message.
+func MsgOptionUser(userID string) MsgOption {
+ return func(config *sendConfig) error {
+ config.values.Set("user", userID)
+ return nil
+ }
+}
+
// MsgOptionText provide the text for the message, optionally escape the provided
// text.
func MsgOptionText(text string, escape bool) MsgOption {
@@ -304,6 +327,14 @@ func MsgOptionEnableLinkUnfurl() MsgOption {
}
}
+// MsgOptionDisableLinkUnfurl disables link unfurling
+func MsgOptionDisableLinkUnfurl() MsgOption {
+ return func(config *sendConfig) error {
+ config.values.Set("unfurl_links", "false")
+ return nil
+ }
+}
+
// MsgOptionDisableMediaUnfurl disables media unfurling.
func MsgOptionDisableMediaUnfurl() MsgOption {
return func(config *sendConfig) error {
@@ -320,11 +351,52 @@ func MsgOptionDisableMarkdown() MsgOption {
}
}
+// MsgOptionTS sets the thread TS of the message to enable creating or replying to a thread
+func MsgOptionTS(ts string) MsgOption {
+ return func(config *sendConfig) error {
+ config.values.Set("thread_ts", ts)
+ return nil
+ }
+}
+
+// MsgOptionBroadcast sets reply_broadcast to true
+func MsgOptionBroadcast() MsgOption {
+ return func(config *sendConfig) error {
+ config.values.Set("reply_broadcast", "true")
+ return nil
+ }
+}
+
+// this function combines multiple options into a single option.
+func MsgOptionCompose(options ...MsgOption) MsgOption {
+ return func(c *sendConfig) error {
+ for _, opt := range options {
+ if err := opt(c); err != nil {
+ return err
+ }
+ }
+ return nil
+ }
+}
+
+func MsgOptionParse(b bool) MsgOption {
+ return func(c *sendConfig) error {
+ var v string
+ if b {
+ v = "1"
+ } else {
+ v = "0"
+ }
+ c.values.Set("parse", v)
+ return nil
+ }
+}
+
// MsgOptionPostMessageParameters maintain backwards compatibility.
func MsgOptionPostMessageParameters(params PostMessageParameters) MsgOption {
return func(config *sendConfig) error {
if params.Username != DEFAULT_MESSAGE_USERNAME {
- config.values.Set("username", string(params.Username))
+ config.values.Set("username", params.Username)
}
// chat.postEphemeral support
@@ -336,7 +408,7 @@ func MsgOptionPostMessageParameters(params PostMessageParameters) MsgOption {
MsgOptionAsUser(params.AsUser)(config)
if params.Parse != DEFAULT_MESSAGE_PARSE {
- config.values.Set("parse", string(params.Parse))
+ config.values.Set("parse", params.Parse)
}
if params.LinkNames != DEFAULT_MESSAGE_LINK_NAMES {
config.values.Set("link_names", "1")