Note:
This is a quick library to help with my development work at Nike Inc, please check the supported features before you use.
Feel free to fork and add your features if needed
A Simple Slack App library to help you quickly spin up Slack Apps that are capable of app distribution and signature checking without the hassle.
- All command, interactions, events endpoints are secured with slack signature checking.
- App distribution is automatically enabled, howered, you need to handle the token storage by using the
OnAppInstallfunction - You can enable custom routes if needed, such as for external select inputs for slack, or for your other service needs
- Block Kit UI:
- Button - Action
- Text Section
- Text Fields
- Modal
- Actions
- Plain Text Input
- (multi/single) Static Select Input
- (multi/single) External Select Input
- Multi-Conversation Select Input
- (multi/single) User Select Input
- Date Picker Input
- Time Picker Input
- Radio Input
- Checkbox Input
- Header
- Context
- Image
- Divider
- Slack API:
- Open View
- Update View
- Find User by Email
- Find User by Slack ID
- Update Message
- Post Message
- File upload
All handlers are functions with the loafer.SlackContext parameter passed to it, and the format is as followed:
type SlackContext struct {
Body []byte // Body of the request
Token string // Token of the corresponding workspace
Workspace string // Workspace where event is coming from
Req *http.Request // http request
Res http.ResponseWriter // http response
}package main
// TokenCache - Implementation of the loafer.TokensCache interface, this allows you to control how you store/access your tokens
type TokenCache struct {
tokens map[string]string
}
// Get - Getting the token for the corresponding workspace
func (t *TokenCache) Get(workspace string) string {
return t.tokens[workspace]
}
// Set - Setting the token for the corresponding workspace
func (t *TokenCache) Set(workspace string, token string) {
t.tokens[workspace] = token
}
// Remove - Removing the token for the corresponding workspace
func (t *TokenCache) Remove(workspace string) {
delete(t.tokens, workspace)
}
// main - entrypoint of program
func main {
// Initialize an instance of the TokenCache
myTokenCache := TokenCache{
tokens: make(map[string]string)}
// Set up the options for the slack app, clientId & client secret is not needed if you don't need app distribution
opts := loafer.SlackAppOptions{
Name: "Dev Bot",
Prefix: "dev",
TokensCache: &myTokenCache,
SigningSecret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
ClientID: "xxxxxxxxxxxx.xxxxxxxxxx",
ClientSecret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
// Initialize your Slack App with the options
app := loafer.InitializeSlackApp(&opts)
// Add handler to command /coaching
app.OnCommand("/coaching", handleDevCommand)
// Serve the app on PORT 8080, you can use callback here if needed
app.ServeApp(8080, nil)
}App will now serve on the route:
http://0.0.0.0:8080/{prefix}/install - For app distribution http://0.0.0.0:8080/{prefix}/events - For event subscription http://0.0.0.0:8080/{prefix}/commands - For app commands http://0.0.0.0:8080/{prefix}/interactions - For app interactions http://0.0.0.0:8080/{prefix}/${custom_route_pattern} - For app custom routes
Returns:
appSlackApp
Get an instance of a slack app with options:
Name- Name of slack appPrefix- Prefix of slack app routeTokensCache- Token cache that implemented the TokensCache interface from loaferClientSecret- Client secret of slack app, used for app distributionClientID- Client ID of slack app, used for app distributionSigningSecret- Signning secret for slack app, used for slack request verification
Serve Slack app on port and cb when server first starts
Shutdown Slack app
Add handler to command
Remove handler to command
Add handler to action
Add handler to shortcut
Add handler to view submission
Add handler to view close
Add handler to view close
Add handler to errors
OnAppInstall(cb func(installRes *SlackOauth2Response, res http.ResponseWriter, req *http.Request) bool
Returns:
avoidDefaultPagebool
handle the app distribute, once app distribution is successfull, it will call the cb function,
cb function should return a boolean value.
true- you want to use your own html/redirectionfalse- show default installation html page
Add handler to a custom pattern
Response back to Slack
Response interaction event state to your form state struct type
Returns:
errerror
Open a modal within slack
Returns:
errerror
Updates a modal within slack
Returns:
userSlackUsererrerror
Find a user within the slack workspace
Returns:
userSlackUsererrerror
Find a user within the slack workspace
Returns:
errerror
Post a message to a slack channel/user/conversation
Returns:
errerror
Update a message of a slack channel/user/conversation given a time stamp of the original message
Returns:
errerror
Upload a file to the Slack workspace and share to the list of channels/users/conversations
Returns:
buttonSlackBlockButton
Make a Block Kit Button
Returns:
sectionSlackBlockSection
Make a Block Kit text section
Returns:
textFieldSlackBlockTextFields
Make a Block Kit text field section
MakeSlackModal(title string, callbackID string, blocks ISlackBlockKitUI, submitText string, closeText string, notifyOnClose bool) SlackModal
Returns:
modalSlackModal
Make a Block Kit modal
Returns:
actionsSlackBlockActions
Make a Block Kit actions section
MakeSlackModalTextInput(label string, placeholder string, actionID string, isMultiline bool, isDispatch bool, maxLength uint16) SlackInputElement
Returns:
inputSlackInputElement
Make a Block Kit modal plain text input
MakeSlackModalStaticSelectInput(label string, placeholder string, options []SlackInputOption, initialOption *SlackInputOption, actionID string, isMulti bool, isOptional bool) SlackModalSelect
Returns:
selectSlackModalSelect
Make a Block Kit modal static select input
MakeSlackModalExternalStaticSelectInput(label string, placeholder string, initialOption *SlackInputOption, actionID string, isMulti bool, minQueryLength uint16, isOptional bool) SlackModalSelect
Returns:
externalSelectSlackModalSelect
Make a Block Kit modal external static select input
MakeSlackBlockExternalStaticSelectInput(label string, placeholder string, initialOptions []SlackInputOption, actionID string, isMulti bool, minQueryLength uint16) SlackBlockSection
Returns:
blockSectionSlackBlockSection
Make a Block Kit block section external section
MakeSlackBlockExternalStaticSelectInput(label string, placeholder string, initialOptions []SlackInputOption, actionID string, isMulti bool) SlackBlockSection
Returns:
blockSectionSlackBlockSection
Make a Block Kit block section static select section
Returns:
buttonSlackBlockSection
Make a Block Kit block section with button
MakeSlackModalMultiConversationSelectInput(label string, placeholder string, initialConversations []string, actionID string) SlackModalSelect
Returns:
selectSlackModalSelect
Make a Block Kit modal multi conversation select list
MakeSlackActionExternalStaticSelectInput(label string, placeholder string, initialOption *SlackInputOption, actionID string, isMulti bool, minQueryLength uint16) SlackActionSelect
Returns:
selectSlackActionSelect
Make a Block Kit modal external select list
MakeSlackModalMultiUserSelectInput(label string, placeholder string, initialUsers []string, actionID string) SlackModalSelect
Returns:
selectSlackModalSelect
Make a Block Kit modal multi user select list
MakeSlackModalUserSelectInput(label string, placeholder string, initialUser string, actionID string) SlackModalSelect
Returns:
selectSlackModalSelect
Make a Block Kit modal user select list
MakeSlackModalDatePickerInput(label string, placeholder string, initialDate string, actionID string) SlackInputElement
Returns:
pickerSlackInputElement
Make a Block Kit modal date picker
MakeSlackModalCheckboxesInput(label string, placeholder string, options []SlackInputOption, initialOptions []SlackInputOption, actionID string) SlackInputElement
Returns:
pickerSlackInputElement
Make a Block Kit modal checkbox picker
MakeSlackModalRadioInput(label string, placeholder string, options []SlackInputOption, actionID string) SlackInputElement
Returns:
pickerSlackInputElement
Make a Block Kit modal radio picker
Returns:
optionSlackInputOption
Make a Block Kit select option
MakeSlackModalTimePickerInput(label string, placeholder string, initialTime string, actionID string) SlackInputElement
Returns:
pickerSlackInputElement
Make a Block Kit time picker
Returns:
headerSlackBlockSection
Make a Block Kit header
Returns:
dividerSlackDivider
Make a Block Kit divider
Returns:
ctxSlackBlockActions
Make a Block Kit context section
Returns:
imgSlackBlockAccessory
Make a Block Kit image section
Kevin Xu
Apache 2.0