Slack
Explore the following sections to learn more:
slack
import "github.com/gemini-oss/rego/pkg/slack"
pkg/slack/bot.go
pkg/slack/entities.go
pkg/slack/slack.go
pkg/slack/users.go
Index
- Constants
- Variables
- type Authorization
- type Block
- type Channel
- type Client
- func NewClient(verbosity int) *Client
- func (c *Client) BuildURL(endpoint string, identifiers …interface{}) string
- func (c *Client) CommandHandler(w http.ResponseWriter, r *http.Request)
- func (c *Client) EventHandler(w http.ResponseWriter, r *http.Request)
- func (c *Client) GetBotID() (string, error)
- func (c *Client) GetUserChannels(userID string) (*UserChannels, error)
- func (c *Client) ListUsers() (*Users, error)
- func (c *Client) SendMessage(e *Event, m *SlackMessage) error
- func (c *Client) SendReply(e *Event, m *SlackMessage) error
- func (c *Client) VerifyRequest(r *http.Request, body []byte) bool
- type Element
- type Error
- type Event
- type EventCallback
- type InnerElement
- type Member
- type Metadata
- type Profile
- type Purpose
- type ResponseMetadata
- type SlackChallenge
- type SlackMessage
- type SlackTokenPayload
- type SlashCommand
- type Topic
- type UserChannels
- type UserParameters
- type Users
Constants
const (
BaseURL = "https://slack.com/api" // https://slack.com/api/METHOD_FAMILY.method?pretty=1
)
Variables
# ErrorDetails is a map of error codes to error messages. - For errors that are not listed in the ErrorDetails map, you can refer to the source at https://api.slack.com/methods/chat.postMessage to understand the possible causes of the error.
var ErrorDetails = map[string]string{
"as_user_not_supported": "The as_user parameter does not function with workspace apps.",
"channel_not_found": "Value passed for channel was invalid.",
"duplicate_channel_not_found": "Channel associated with client_msg_id was invalid.",
"duplicate_message_not_found": "No duplicate message exists associated with client_msg_id.",
"ekm_access_denied": "Administrators have suspended the ability to post a message.",
"invalid_blocks": "Blocks submitted with this message are not valid",
"invalid_blocks_format": "The blocks is not a valid JSON object or doesn't match the Block Kit syntax.",
"invalid_metadata_format": "Invalid metadata format provided",
"invalid_metadata_schema": "Invalid metadata schema provided",
"is_archived": "Channel has been archived.",
"message_limit_exceeded": "Members on this team are sending too many messages. For more details, see https://slack.com/help/articles/115002422943-Usage-limits-for-free-workspaces",
"messages_tab_disabled": "Messages tab for the app is disabled.",
"metadata_must_be_sent_from_app": "Message metadata can only be posted or updated using an app token",
"metadata_too_large": "Metadata exceeds size limit",
"msg_too_long": "Message text is too long",
"no_text": "No message text provided",
"not_in_channel": "Cannot post user messages to a channel they are not in.",
"rate_limited": "Application has posted too many messages, read the Rate Limit documentation for more information",
"restricted_action": "A workspace preference prevents the authenticated user from posting.",
"restricted_action_non_threadable_channel": "Cannot post thread replies into a non_threadable channel.",
"restricted_action_read_only_channel": "Cannot post any message into a read-only channel.",
"restricted_action_thread_locked": "Cannot post replies to a thread that has been locked by admins.",
"restricted_action_thread_only_channel": "Cannot post top-level messages into a thread-only channel.",
"slack_connect_canvas_sharing_blocked": "Admin has disabled Canvas File sharing in all Slack Connect communications",
"slack_connect_file_link_sharing_blocked": "Admin has disabled Slack File sharing in all Slack Connect communications",
"team_access_not_granted": "The token used is not granted the specific workspace access required to complete this request.",
"too_many_attachments": "Too many attachments were provided with this message. A maximum of 100 attachments are allowed on a message.",
"too_many_contact_cards": "Too many contact_cards were provided with this message. A maximum of 10 contact cards are allowed on a message.",
"cannot_reply_to_message": "This message type cannot have thread replies.",
"access_denied": "Access to a resource specified in the request is denied.",
"account_inactive": "Authentication token is for a deleted user or workspace when using a bot token.",
"deprecated_endpoint": "The endpoint has been deprecated.",
"enterprise_is_restricted": "The method cannot be called from an Enterprise.",
"invalid_auth": "Some aspect of authentication cannot be validated. Either the provided token is invalid or the request originates from an IP address disallowed from making the request.",
"method_deprecated": "The method has been deprecated.",
"missing_scope": "The token used is not granted the specific scope permissions required to complete this request.",
"not_allowed_token_type": "The token type used in this request is not allowed.",
"not_authed": "No authentication token provided.",
"no_permission": "The workspace token used in this request does not have the permissions necessary to complete the request. Make sure your app is a member of the conversation it's attempting to post a message to.",
"org_login_required": "The workspace is undergoing an enterprise migration and will not be available until migration is complete.",
"token_expired": "Authentication token has expired",
"token_revoked": "Authentication token is for a deleted user or workspace or the app has been removed when using a user token.",
"two_factor_setup_required": "Two factor setup is required.",
"accesslimited": "Access to this method is limited on the current network",
"fatal_error": "The server could not complete your operation(s) without encountering a catastrophic error. It's possible some aspect of the operation succeeded before the error was raised.",
"internal_error": "The server could not complete your operation(s) without encountering an error, likely due to a transient issue on our end. It's possible some aspect of the operation succeeded before the error was raised.",
"invalid_arg_name": "The method was passed an argument whose name falls outside the bounds of accepted or expected values. This includes very long names and names with non-alphanumeric characters other than _. If you get this error, it is typically an indication that you have made a very malformed API call.",
"invalid_arguments": "The method was either called with invalid arguments or some detail about the arguments passed is invalid, which is more likely when using complex arguments like blocks or attachments.",
"invalid_array_arg": "The method was passed an array as an argument. Please only input valid strings.",
"invalid_charset": "The method was called via a POST request, but the charset specified in the Content-Type header was invalid. Valid charset names are: utf-8 iso-8859-1.",
"invalid_form_data": "The method was called via a POST request with Content-Type application/x-www-form-urlencoded or multipart/form-data, but the form data was either missing or syntactically invalid.",
"invalid_post_type": "The method was called via a POST request, but the specified Content-Type was invalid. Valid types are: application/json application/x-www-form-urlencoded multipart/form-data text/plain.",
"missing_post_type": "The method was called via a POST request and included a data payload, but the request did not include a Content-Type header.",
"ratelimited": "The request has been ratelimited. Refer to the Retry-After header for when you may make your next request.",
"request_timeout": "The method was called via a POST request, but the POST data was either missing or truncated.",
"service_unavailable": "The service is temporarily unavailable",
"team_added_to_org": "The workspace associated with your request is currently undergoing migration to an Enterprise Organization. Web API and other platform operations will be intermittently unavailable until the transition is complete.",
"user_access_not_granted": "The user token used in this request does not have the permissions necessary to complete the request.",
}
var WarningDetails = map[string]string{
"message_truncated": "The text field of a message should have no more than 40,000 characters. We truncate really long messages.",
"missing_charset": "The method was called via a POST request, and recommended practice for the specified Content-Type is to include a charset parameter. However, no charset was present. Specifically, non-form-data content types (e.g. text/plain) are the ones for which charset is recommended.",
"superfluous_charset": "The method was called via a POST request, and the specified Content-Type is not defined to understand the charset parameter. However, charset was in fact present. Specifically, form-data content types (e.g. multipart/form-data) are the ones for which charset is superfluous.",
}
type Authorization
type Authorization struct {
EnterpriseID interface{} `json:"enterprise_id,omitempty"` // ID of the enterprise (undefined, will revisit later)
TeamID string `json:"team_id,omitempty"` // ID of the team/workspace
UserID string `json:"user_id,omitempty"` // ID of the user or bot user in the workspace
IsBot bool `json:"is_bot,omitempty"` // Indicates whether this is a bot user
IsEnterpriseInstall bool `json:"is_enterprise_install,omitempty"` // Indicates whether this app was installed in an entire enterprise org
}
type Block
type Block struct {
Type string `json:"type,omitempty"` // Type of the block, here it's rich_text
BlockID string `json:"block_id,omitempty"` // ID of the block
Elements []Element `json:"elements,omitempty"` // Elements in the block
}
type Channel
Channel represents the information about a channel in the Slack ‘users.conversations’ method.
type Channel struct {
Created int64 `json:"created"` // Channel creation timestamp.
Creator string `json:"creator"` // User ID of the channel's creator.
ID string `json:"id"` // Channel ID.
IsArchived bool `json:"is_archived"` // Indicates if the channel is archived.
IsChannel bool `json:"is_channel"` // Indicates if the object is a channel.
IsExtShared bool `json:"is_ext_shared"` // Indicates if the channel is externally shared.
IsGeneral bool `json:"is_general"` // Indicates if the channel is a general channel.
IsGroup bool `json:"is_group"` // Indicates if the object is a group.
IsIM bool `json:"is_im"` // Indicates if the object is an instant message.
IsMPIM bool `json:"is_mpim"` // Indicates if the object is a multi-party instant message.
IsOpen bool `json:"is_open,omitempty"` // Indicates if the channel is open. Only applicable for certain channel types.
IsOrgShared bool `json:"is_org_shared"` // Indicates if the channel is organizationally shared.
IsPendingExtShared bool `json:"is_pending_ext_shared"` // Indicates if the channel is pending external sharing.
IsPrivate bool `json:"is_private"` // Indicates if the channel is private.
IsShared bool `json:"is_shared"` // Indicates if the channel is shared.
IsUserDeleted bool `json:"is_user_deleted,omitempty"` // Indicates if the user is deleted. Only applicable for certain channel types.
Name string `json:"name"` // Channel name.
NameNormalized string `json:"name_normalized"` // Normalized channel name.
PendingShared []interface{} `json:"pending_shared"` // List of pending shared channel IDs.
Priority float64 `json:"priority,omitempty"` // Channel priority.
PreviousNames []string `json:"previous_names"` // List of previous names for the channel.
Purpose Purpose `json:"purpose"` // Purpose information of the channel.
Topic Topic `json:"topic"` // Topic information of the channel.
Unlinked int `json:"unlinked"` // Unlinked count of the channel.
User string `json:"user,omitempty"` // User ID associated with the channel. Only applicable for certain channel types.
}
type Client
### Slack Client Structs ---------------------------------------------------------------------
type Client struct {
BaseURL string // BaseURL is the base URL for Slack API requests.
BotID string // The ID of the bot in current workspace
HTTP *requests.Client // HTTP client used to make HTTP requests.
Error *Error // Error is the error response from the last request made by the client.
Log *log.Logger // Log is the logger used to log information about the client.
Token string // Authentication token for the Slack API.
SigningSecret string // Signing secret for bots
Cache *cache.Cache // Cache is the cache used to store responses from the Slack API.
}
func NewClient
func NewClient(verbosity int) *Client
- # Generate Slack Client
- @param log *log.Logger
- @return *Client
- Example:
```go
startServer1 := flag.Bool("startServer1", false, "Start server 1")
flag.Parse()
s := slack.NewClient(log.DEBUG)
if *startServer1 {
handlers := server.Handler{
"/slack/events": s.EventHandler,
"/slack/command/userlist": s.CommandHandler,
}
go server.StartServer("127.0.0.1:8080", handlers)
}
```
func (*Client) BuildURL
func (c *Client) BuildURL(endpoint string, identifiers ...interface{}) string
BuildURL builds a URL for a given resource and identifiers.
func (*Client) CommandHandler
func (c *Client) CommandHandler(w http.ResponseWriter, r *http.Request)
func (*Client) EventHandler
func (c *Client) EventHandler(w http.ResponseWriter, r *http.Request)
func (*Client) GetBotID
func (c *Client) GetBotID() (string, error)
func (*Client) GetUserChannels
func (c *Client) GetUserChannels(userID string) (*UserChannels, error)
https://api.slack.com/methods/users.conversations
func (*Client) ListUsers
func (c *Client) ListUsers() (*Users, error)
https://api.slack.com/methods/users.list
func (*Client) SendMessage
func (c *Client) SendMessage(e *Event, m *SlackMessage) error
func (*Client) SendReply
func (c *Client) SendReply(e *Event, m *SlackMessage) error
func (*Client) VerifyRequest
func (c *Client) VerifyRequest(r *http.Request, body []byte) bool
type Element
type Element struct {
Type string `json:"type,omitempty"` // Type of the element, here it's rich_text_section
Elements []InnerElement `json:"elements,omitempty"` // Inner elements in the element
}
type Error
Error represents the common error response from the Slack methods.
type Error struct {
Ok bool `json:"ok,omitempty"` // Indicates whether the request was successful.
Error string `json:"error,omitempty"` // Describes the error that occurred.
}
type Event
https://api.slack.com/apis/connections/events-api#event-type-structure
type Event struct {
ClientMsgID string `json:"client_msg_id,omitempty"` // Client-specified ID for this message
Type string `json:"type,omitempty"` // Type of the event, here it's app_mention
Text string `json:"text,omitempty"` // Text in the message that mentions the app
User string `json:"user,omitempty"` // ID of the user that sent this message
TS string `json:"ts,omitempty"` // Timestamp when this message was sent
Blocks []Block `json:"blocks,omitempty"` // Blocks in the message
Team string `json:"team,omitempty"` // ID of the team/workspace where this event occurred
Channel string `json:"channel,omitempty"` // ID of the channel where this event occurred
EventTS string `json:"event_ts,omitempty"` // Timestamp when this event happened
}
type EventCallback
https://api.slack.com/apis/connections/events-api#callback-field
type EventCallback struct {
Token string `json:"token,omitempty"` // Verification token to verify that the incoming request is from Slack
TeamID string `json:"team_id,omitempty"` // ID of the team/workspace where the event occurred
APIAppID string `json:"api_app_id,omitempty"` // App ID of the app that has been installed in this workspace
Type string `json:"type,omitempty"` // Type of the callback, it's always event_callback
Event Event `json:"event,omitempty"` // Details of the event
EventID string `json:"event_id,omitempty"` // Globally unique ID for this event
EventTime int64 `json:"event_time,omitempty"` // Time when the event happened
Authorizations []Authorization `json:"authorizations,omitempty"` // Information about the authorizations for this workspace and event
IsExtSharedChannel bool `json:"is_ext_shared_channel,omitempty"` // Indicates whether the event is in a shared channel
EventContext string `json:"event_context,omitempty"` // Event context (undefined, will revisit later)
}
type InnerElement
type InnerElement struct {
Type string `json:"type,omitempty"` // Type of the inner element, it can be user or text
UserID string `json:"user_id,omitempty"` // ID of the user, this field is present when the type is user
Text string `json:"text,omitempty"` // Text of the inner element, this field is present when the type is text
}
type Member
Member represents a member in the Slack users.list method response.
type Member struct {
Color string `json:"color,omitempty"` // Member's color code.
Deleted bool `json:"deleted,omitempty"` // Whether the member is deleted.
Has2FA bool `json:"has_2fa,omitempty"` // Whether the member has two-factor authentication enabled.
ID string `json:"id"` // Member's unique identifier.
IsAdmin bool `json:"is_admin,omitempty"` // Whether the member is an administrator.
IsAppUser bool `json:"is_app_user,omitempty"` // Whether the member is an app user.
IsBot bool `json:"is_bot,omitempty"` // Whether the member is a bot.
IsOwner bool `json:"is_owner,omitempty"` // Whether the member is an owner.
IsPrimaryOwner bool `json:"is_primary_owner,omitempty"` // Whether the member is the primary owner.
IsRestricted bool `json:"is_restricted,omitempty"` // Whether the member is restricted.
IsUltraRestricted bool `json:"is_ultra_restricted,omitempty"` // Whether the member is ultra-restricted.
Name string `json:"name"` // Member's username.
Profile Profile `json:"profile,omitempty"` // Member's profile information.
RealName string `json:"real_name,omitempty"` // Member's real name.
TeamID string `json:"team_id"` // Team identifier.
TZ string `json:"tz,omitempty"` // Member's time zone.
TzLabel string `json:"tz_label,omitempty"` // Label for the time zone.
TzOffset int `json:"tz_offset,omitempty"` // Time zone offset in seconds.
Updated int64 `json:"updated,omitempty"` // Timestamp for when the member was updated.
}
type Metadata
Metadata represents the response metadata in the Slack users.list method response.
type Metadata struct {
NextCursor string `json:"next_cursor,omitempty"` // Next cursor for pagination.
}
type Profile
Profile represents a member’s profile in the Slack users.list method response.
type Profile struct {
AvatarHash string `json:"avatar_hash,omitempty"` // Avatar hash.
DisplayName string `json:"display_name,omitempty"` // Display name.
DisplayNameNormalized string `json:"display_name_normalized,omitempty"` // Normalized display name.
Email string `json:"email,omitempty"` // Email address.
FirstName string `json:"first_name,omitempty"` // First name.
Image1024 string `json:"image_1024,omitempty"` // Image URL (1024x1024).
Image192 string `json:"image_192,omitempty"` // Image URL (192x192).
Image24 string `json:"image_24,omitempty"` // Image URL (24x24).
Image32 string `json:"image_32,omitempty"` // Image URL (32x32).
Image48 string `json:"image_48,omitempty"` // Image URL (48x48).
Image512 string `json:"image_512,omitempty"` // Image URL (512x512).
Image72 string `json:"image_72,omitempty"` // Image URL (72x72).
ImageOriginal string `json:"image_original,omitempty"` // Original image URL.
LastName string `json:"last_name,omitempty"` // Last name.
Phone string `json:"phone,omitempty"` // Phone number.
RealName string `json:"real_name,omitempty"` // Real name.
RealNameNormalized string `json:"real_name_normalized,omitempty"` // Normalized real name.
Skype string `json:"skype,omitempty"` // Skype ID.
StatusEmoji string `json:"status_emoji,omitempty"` // Status emoji.
StatusText string `json:"status_text,omitempty"` // Status text.
Team string `json:"team,omitempty"` // Team ID.
Title string `json:"title,omitempty"` // Title.
}
type Purpose
Purpose represents the purpose information of a channel in the Slack ‘users.conversations’ method.
type Purpose struct {
Creator string `json:"creator"` // User ID of the purpose's creator.
LastSet int64 `json:"last_set"` // Timestamp of when the purpose was last set.
Value string `json:"value"` // Purpose value or content.
}
type ResponseMetadata
ResponseMetadata represents the metadata related to a response in the Slack ‘users.conversations’ method.
type ResponseMetadata struct {
NextCursor string `json:"next_cursor"` // Cursor for pagination.
}
type SlackChallenge
### Slack Event Structs ---------------------------------------------------------------------
type SlackChallenge struct {
Token string `json:"token,omitempty"` // Verification token to verify that the incoming request is from Slack
Challenge string `json:"challenge,omitempty"` // Challenge string used to verify the URL
Type string `json:"type,omitempty"` // Type of the callback, it's always url_verification
}
type SlackMessage
### Slack Message Structs --------------------------------------------------------------------- https://api.slack.com/methods/chat.postMessage#args
type SlackMessage struct {
AsUser bool `json:"as_user,omitempty"` // Optional. (Legacy) Post the message as the authed user instead of as a bot.
Attachments string `json:"attachments,omitempty"` // Optional. A JSON-based array of structured attachments, presented as a URL-encoded string.
Blocks string `json:"blocks,omitempty"` // Optional. A JSON-based array of structured blocks, presented as a URL-encoded string.
Channel string `json:"channel"` // Required. Channel, private group, or IM channel to send the message to. Can be an encoded ID, or a name.
IconEmoji string `json:"icon_emoji,omitempty"` // Optional. Emoji to use as the icon for this message. Overrides icon_url.
IconURL string `json:"icon_url,omitempty"` // Optional. URL to an image to use as the icon for this message.
LinkNames bool `json:"link_names,omitempty"` // Optional. Find and link user groups.
Metadata string `json:"metadata,omitempty"` // Optional. JSON object with event_type and event_payload fields. Metadata posted to Slack is accessible to members of that workspace.
Markdown bool `json:"mrkdwn,omitempty"` // Optional. Disable or enable Slack markup parsing.
Parse string `json:"parse,omitempty"` // Optional. Change how messages are treated.
ReplyBroadcast bool `json:"reply_broadcast,omitempty"` // Optional. Indicates whether reply should be visible to everyone in the channel or conversation.
Text string `json:"text,omitempty"` // Optional. The formatted text of the message to be published. Used as fallback text if blocks are included.
ThreadTS string `json:"thread_ts,omitempty"` // Optional. Provide another message's ts value to make this message a reply.
Token string `json:"token"` // Required. Authentication token bearing required scopes.
UnfurlLinks bool `json:"unfurl_links,omitempty"` // Optional. Enable unfurling of primarily text-based content.
UnfurlMedia bool `json:"unfurl_media,omitempty"` // Optional. Disable or enable unfurling of media content.
Username string `json:"username,omitempty"` // Optional. Set your bot's user name.
}
type SlackTokenPayload
type SlackTokenPayload struct {
T string // Token for authentication
}
type SlashCommand
### Slack Command Structs ---------------------------------------------------------------------
type SlashCommand struct {
Token string `url:"token,omitempty"`
TeamID string `url:"team_id,omitempty"`
ChannelID string `url:"channel_id,omitempty"`
UserName string `url:"user_name,omitempty"`
Command string `url:"command,omitempty"`
Text string `url:"text,omitempty"`
ResponseURL string `url:"response_url"`
}
type Topic
Topic represents the topic information of a channel in the Slack ‘users.conversations’ method.
type Topic struct {
Creator string `json:"creator"` // User ID of the topic's creator.
LastSet int64 `json:"last_set"` // Timestamp of when the topic was last set.
Value string `json:"value"` // Topic value or content.
}
type UserChannels
### Slack Channel Structs --------------------------------------------------------------------- UserChannels represents the response from the Slack ‘users.conversations’ method. https://api.slack.com/methods/users.conversations
type UserChannels struct {
Channels []Channel `json:"channels"` // List of channel information.
OK bool `json:"ok"` // Indicates the success status.
ResponseMetadata ResponseMetadata `json:"response_metadata"` // Metadata related to the response, including pagination information.
}
type UserParameters
UserParameters represents the common parameters for the Slack ‘users.list’ and ‘users.conversations’ methods. See the [source](//https://api.slack.com/methods/users.list) and [source](//https://api.slack.com/methods/users.conversations) for more details.
type UserParameters struct {
Cursor string `json:"cursor,omitempty"` // Paginate through collections by setting the cursor parameter to a next_cursor attribute returned by a previous request's response_metadata.
ExcludeArchived bool `json:"exclude_archived,omitempty"` // Set to true to exclude archived channels from the list.
IncludeLocale bool `json:"include_locale,omitempty"` // Set this to true to receive the locale for users.
Limit int `json:"limit,omitempty"` // The maximum number of items to return, up to 999.
Pretty bool `json:"pretty,omitempty"` // Make the response pretty JSON or not
TeamID string `json:"team_id,omitempty"` // Encoded team id to list users in or conversations in, required if org token is used.
Token string `json:"token"` // Authentication token bearing required scopes.
Types string `json:"types,omitempty"` // Mix and match channel types, e.g., "im,mpim".
User string `json:"user,omitempty"` // Browse conversations by a specific user ID's membership.
}
type Users
### Slack User Structs --------------------------------------------------------------------- UsersListResponse represents the common successful response from the Slack users.list method. https://api.slack.com/methods/users.list
type Users struct {
CacheTS int64 `json:"cache_ts,omitempty"` // Cache timestamp.
Members []Member `json:"members,omitempty"` // List of members.
OK bool `json:"ok"` // Response status.
ResponseMetadata Metadata `json:"response_metadata,omitempty"` // Metadata for the response.
}
Generated by gomarkdoc