Help us shape the future of Go! Take the 2026 Go Developer Survey

slackbot

package module
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 23, 2024 License: MIT Imports: 9 Imported by: 0

README

go-slackbot - Build Slackbots in Go

The go-slackbot project hopes to ease development of Slack bots by adding helpful methods and a mux-router style interface to the github.com/slack-go/slack package.

Incoming Slack RTM events are mapped to a handler in the following form:

bot.Hear("(?i)how are you(.*)").MessageHandler(HowAreYouHandler)

In addition to several useful functions in the utils.go file, the slackbot.Bot struct provides handy Reply and ReplyWithAttachments methods:

func HowAreYouHandler(ctx context.Context, bot *slackbot.Bot, evt *slack.MessageEvent) {
	bot.Reply(evt, "A bit tired. You get it? A bit?", slackbot.WithTyping)
}

 

func HowAreYouAttachmentsHandler(ctx context.Context, bot *slackbot.Bot, evt *slack.MessageEvent) {
	txt := "Beep Beep Boop is a ridiculously simple hosting platform for your Slackbots."
	attachment := slack.Attachment{
		Pretext:   "We bring bots to life. :sunglasses: :thumbsup:",
		Title:     "Host, deploy and share your bot in seconds.",
		TitleLink: "https:GrantStreetGroup.com/",
		Text:      txt,
		Fallback:  txt,
		ImageURL:  "https:storage.googleapis.com/GrantStreetGroup/_assets/bot-1.22f6fb.png",
		Color:     "#7CD197",
	}

	attachments := []slack.Attachment{attachment}
	bot.ReplyWithAttachments(evt, attachments, slackbot.WithTyping)
}

But wait, there's more! Well, until there's more, the slackbot package exposes github.com/slack-go/slack RTM and Client objects enabling a consumer to interact with the lower level package directly:

func HowAreYouHandler(ctx context.Context, bot *slackbot.Bot, evt *slack.MessageEvent) {
  bot.RTM.NewOutgoingMessage("Hello", "#random")
}

If you want to kick the tires, we would love feedback. Check out these two examples:

Events API SocketMode support

To enable SocketMode support over RTM you need an AppLevelToken for your bot app

bot := slackbot.New(token, slack.OptionAppLevelToken(app), ...options)
bot.EventMode = "Socket"
...

ReactionEvent

Bot can respond to the use of reactions in a slack message stream.

bot.ReactTo("reaction").ReactionHandler(handlerfunc)

Documentation

Overview

Package slackbot hopes to ease development of Slack bots by adding helpful methods and a mux-router style interface to the github.com/slack-go/slack package.

Incoming Slack RTM events are mapped to a handler in the following form:

bot.Hear("(?i)how are you(.*)").MessageHandler(HowAreYouHandler)

The package adds Reply and ReplyWithAttachments methods:

func HowAreYouHandler(ctx context.Context, bot *slackbot.Bot, evt *slack.MessageEvent) {
	bot.Reply(evt, "A bit tired. You get it? A bit?", slackbot.WithTyping)
}

func HowAreYouAttachmentsHandler(ctx context.Context, bot *slackbot.Bot, evt *slack.MessageEvent) {
	txt := "Beep Beep Boop is a ridiculously simple hosting platform for your Slackbots."
	attachment := slack.Attachment{
		Pretext:   "We bring bots to life. :sunglasses: :thumbsup:",
		Title:     "Host, deploy and share your bot in seconds.",
		TitleLink: "https://GrantStreetGroup.com/",
		Text:      txt,
		Fallback:  txt,
		ImageURL:  "https://storage.googleapis.com/GrantStreetGroup/_assets/bot-1.22f6fb.png",
		Color:     "#7CD197",
	}

	attachments := []slack.Attachment{attachment}
	bot.ReplyWithAttachments(evt, attachments, slackbot.WithTyping)
}

The slackbot package exposes github.com/slack-go/slack RTM and Client objects enabling a consumer to interact with the lower level package directly:

func HowAreYouHandler(ctx context.Context, bot *slackbot.Bot, evt *slack.MessageEvent) {
	bot.RTM.NewOutgoingMessage("Hello", "#random")
}

Project home and samples: https://github.com/GrantStreetGroup/go-slackbot

Index

Constants

View Source
const (
	WithTyping    bool = true
	WithoutTyping bool = false
)
View Source
const (
	BOT_CONTEXT      = "__BOT_CONTEXT__"
	MESSAGE_CONTEXT  = "__MESSAGE_CONTEXT__"
	REACTION_CONTEXT = "__REACTION_CONTEXT__"
	REACTION_EVENT   = "__REACTION_EVENT__"
	BOT_DEBUG        = "__BOT_DEBUG__"
)

Variables

This section is empty.

Functions

func AddBotToContext

func AddBotToContext(ctx context.Context, bot *Bot) context.Context

AddBotToContext sets the bot reference in context and returns the newly derived context

func AddMessageToContext

func AddMessageToContext(ctx context.Context, msg *slack.MessageEvent) context.Context

AddMessageToContext sets the Slack message event reference in context and returns the newly derived context

func AddReactionAddedToContext

func AddReactionAddedToContext(ctx context.Context, react *slack.ReactionAddedEvent) context.Context

AddReactionAddedToContext

func AddReactionRemovedToContext

func AddReactionRemovedToContext(ctx context.Context, react *slack.ReactionRemovedEvent) context.Context

AddReactionAddedToContext

func IsDebug

func IsDebug(ctx context.Context) bool

func IsDirectMention

func IsDirectMention(evt *slack.MessageEvent, userID string) bool

IsDirectMention returns true is message is a Direct Mention that mentions a specific user. A direct mention is a mention at the very beginning of the message

func IsDirectMessage

func IsDirectMessage(evt *slack.MessageEvent) bool

IsDirectMessage returns true if this message is in a direct message conversation

func IsMention

func IsMention(evt *slack.MessageEvent) bool

IsMention returns true the message contains a mention

func IsMentioned

func IsMentioned(evt *slack.MessageEvent, userID string) bool

IsMentioned returns true if this message contains a mention of a specific user

func MessageFromContext

func MessageFromContext(ctx context.Context) *slack.MessageEvent

func ReactionAddedFromContext

func ReactionAddedFromContext(ctx context.Context) *slack.ReactionAddedEvent

func ReactionRemovedFromContext

func ReactionRemovedFromContext(ctx context.Context) *slack.ReactionRemovedEvent

func ReactionTypeFromContext

func ReactionTypeFromContext(ctx context.Context) string

func SetDebug

func SetDebug(ctx context.Context) context.Context

func StripDirectMention

func StripDirectMention(text string) string

StripDirectMention removes a leading mention (aka direct mention) from a message string

func WhoMentioned

func WhoMentioned(evt *slack.MessageEvent) []string

WhoMentioned returns a list of userIDs mentioned in the message

Types

type Bot

type Bot struct {
	SimpleRouter

	// Slack API
	Client    *slack.Client
	RTM       *slack.RTM
	Socket    *socketmode.Client
	Debug     bool
	EventMode string
	// contains filtered or unexported fields
}

func BotFromContext

func BotFromContext(ctx context.Context) *Bot

func New

func New(slackToken string, options ...slack.Option) *Bot

New constructs a new Bot using the slackToken to authorize against the Slack service.

func (*Bot) BotUserID

func (b *Bot) BotUserID() string

Fetch the botUserID.

func (*Bot) ConvertMessageEvent

func (b *Bot) ConvertMessageEvent(evt *slackevents.MessageEvent) *slack.MessageEvent

func (*Bot) Reply

func (b *Bot) Reply(evt *slack.MessageEvent, msg string, typing bool)

Reply replies to a message event with a simple message.

func (*Bot) ReplyWithAttachments

func (b *Bot) ReplyWithAttachments(evt *slack.MessageEvent, attachments []slack.Attachment, typing bool)

ReplyWithAttachments replys to a message event with a Slack Attachments message.

func (*Bot) Run

func (b *Bot) Run()

Run listeners for incoming slack events via RTM or Socketmode, matching them to an appropriate handler.

func (*Bot) RunRTM

func (b *Bot) RunRTM()

Run listeners for incoming slack RTM events, matching them to an appropriate handler.

func (*Bot) RunSocketMode

func (b *Bot) RunSocketMode()

func (*Bot) SetBotID

func (b *Bot) SetBotID(ID string)

func (*Bot) Type

func (b *Bot) Type(evt *slack.MessageEvent, msg interface{})

Type sends a typing message and simulates delay (max 2000ms) based on message size.

type Handler

type Handler func(context.Context)

type Matcher

type Matcher interface {
	Match(context.Context) (bool, context.Context)
	SetBotID(botID string)
}

Matcher type for matching message routes

type MessageHandler

type MessageHandler func(ctx context.Context, bot *Bot, msg *slack.MessageEvent)

type MessageType

type MessageType string
const (
	DirectMessage MessageType = "direct_message"
	DirectMention MessageType = "direct_mention"
	Mention       MessageType = "mention"
	Ambient       MessageType = "ambient"
)

type Preprocessor

type Preprocessor func(context.Context) context.Context

type ReactionHandler

type ReactionHandler func(ctx context.Context, bot *Bot, added *slack.ReactionAddedEvent, removed *slack.ReactionRemovedEvent)

type ReactionMatcher

type ReactionMatcher struct {
	// contains filtered or unexported fields
}

func (*ReactionMatcher) Match

func (rm *ReactionMatcher) Match(ctx context.Context) (bool, context.Context)

func (*ReactionMatcher) SetBotID

func (rm *ReactionMatcher) SetBotID(botID string)

type Reactions

type Reactions string

type RegexpMatcher

type RegexpMatcher struct {
	// contains filtered or unexported fields
}

func (*RegexpMatcher) Match

func (rm *RegexpMatcher) Match(ctx context.Context) (bool, context.Context)

func (*RegexpMatcher) SetBotID

func (rm *RegexpMatcher) SetBotID(botID string)

type Route

type Route struct {
	// contains filtered or unexported fields
}

func (*Route) AddMatcher

func (r *Route) AddMatcher(m Matcher) *Route

addMatcher adds a matcher to the route.

func (*Route) Handler

func (r *Route) Handler(handler Handler) *Route

Handler sets a handler for the route.

func (*Route) Hear

func (r *Route) Hear(regex string) *Route

Hear adds a matcher for the message text

func (*Route) Match

func (r *Route) Match(ctx context.Context, match *RouteMatch) (bool, context.Context)

func (*Route) MessageHandler

func (r *Route) MessageHandler(fn MessageHandler) *Route

func (*Route) Messages

func (r *Route) Messages(types ...MessageType) *Route

func (*Route) Preprocess

func (r *Route) Preprocess(fn Preprocessor) *Route

func (*Route) ReactTo

func (r *Route) ReactTo(react string) *Route

Adds a reaction matcher

func (*Route) ReactionHandler

func (r *Route) ReactionHandler(fn ReactionHandler) *Route

func (*Route) Subrouter

func (r *Route) Subrouter() Router

type RouteMatch

type RouteMatch struct {
	Route   *Route
	Handler Handler
}

RouteMatch stores information about a matched route.

type Router

type Router interface {
	Match(context.Context, *RouteMatch) (bool, context.Context)
	NewRoute() *Route
	Hear(regex string) *Route
	Handler(handler Handler) *Route
	MessageHandler(handler MessageHandler) *Route
	ReactionHandler(handler ReactionHandler) *Route
	Messages(types ...MessageType) *Route
	AddMatcher(m Matcher) *Route
	SetBotID(botID string)
	ReactTo(react string) *Route
}

type SimpleRouter

type SimpleRouter struct {
	// contains filtered or unexported fields
}

func (*SimpleRouter) AddMatcher

func (r *SimpleRouter) AddMatcher(m Matcher) *Route

func (*SimpleRouter) Handler

func (r *SimpleRouter) Handler(handler Handler) *Route

func (*SimpleRouter) Hear

func (r *SimpleRouter) Hear(regex string) *Route

func (*SimpleRouter) Match

func (r *SimpleRouter) Match(ctx context.Context, match *RouteMatch) (bool, context.Context)

Match matches registered routes against the request.

func (*SimpleRouter) MessageHandler

func (r *SimpleRouter) MessageHandler(handler MessageHandler) *Route

func (*SimpleRouter) Messages

func (r *SimpleRouter) Messages(types ...MessageType) *Route

func (*SimpleRouter) NewRoute

func (r *SimpleRouter) NewRoute() *Route

NewRoute registers an empty route.

func (*SimpleRouter) ReactTo

func (r *SimpleRouter) ReactTo(react string) *Route

func (*SimpleRouter) ReactionHandler

func (r *SimpleRouter) ReactionHandler(handler ReactionHandler) *Route

func (*SimpleRouter) SetBotID

func (r *SimpleRouter) SetBotID(botID string)

type TypesMatcher

type TypesMatcher struct {
	// contains filtered or unexported fields
}

func (*TypesMatcher) Match

func (tm *TypesMatcher) Match(ctx context.Context) (bool, context.Context)

func (*TypesMatcher) SetBotID

func (tm *TypesMatcher) SetBotID(botID string)

Directories

Path Synopsis
examples
simple command
wit command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL