Skip to content

Instantly share code, notes, and snippets.

@ereyes01
Created October 30, 2015 03:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ereyes01/90c8db2e56f8e6c3e55b to your computer and use it in GitHub Desktop.
Save ereyes01/90c8db2e56f8e6c3e55b to your computer and use it in GitHub Desktop.
Custom Slack Bot in Go
package main
import (
"log"
"os"
"os/signal"
"strconv"
"github.com/FogCreek/victor"
"github.com/FogCreek/victor/pkg/chat/slackRealtime"
"github.com/FogCreek/victor/pkg/events"
"github.com/FogCreek/victor/pkg/events/definedEvents"
)
const (
SECRET_NUMBER = 42
BOT_NAME = "Guess the number"
)
func getVictorConfig(args []string) victor.Config {
if len(args) >= 2 && args[1] == "shell" {
return victor.Config{
ChatAdapter: "shell",
Name: BOT_NAME,
}
}
return victor.Config{
ChatAdapter: "slackRealtime",
AdapterConfig: slackRealtime.NewConfig(os.Getenv("SLACK_TOKEN")),
Name: BOT_NAME,
}
}
func main() {
victorConfig := getVictorConfig(os.Args)
bot := victor.New(victorConfig)
addHandlers(bot)
// optional help built in help command
bot.EnableHelpCommand()
bot.Run()
go monitorErrors(bot.ChatErrors())
go monitorEvents(bot.ChatEvents())
// keep the process (and bot) alive
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, os.Interrupt)
<-sigs
bot.Stop()
}
func monitorErrors(errorChannel chan events.ErrorEvent) {
for {
err, ok := <-errorChannel
if !ok {
return
}
if err.IsFatal() {
log.Fatal(err)
}
log.Println("Chat Adapter Error Event:", err)
}
}
func monitorEvents(eventsChannel chan events.ChatEvent) {
for {
event, ok := <-eventsChannel
if !ok {
return
}
switch e := event.(type) {
case *definedEvents.ConnectingEvent:
log.Println("Connecting Event fired")
case *definedEvents.ConnectedEvent:
log.Println("Connected Event fired")
case *definedEvents.UserEvent:
log.Printf("User Event: %+v", e)
case *definedEvents.ChannelEvent:
log.Printf("Channel Event: %+v", e)
default:
log.Println("Unrecognized Chat Event:", e)
}
}
}
func addHandlers(r victor.Robot) {
r.HandleCommand(&victor.HandlerDoc{
CmdHandler: guessFunc,
CmdName: "guess",
CmdDescription: "Guess a number from 1-100",
CmdUsage: []string{"<number>"},
})
// Add default handler to show "unrecognized command" on "command" messages
r.SetDefaultHandler(defaultFunc)
}
func guessFunc(s victor.State) {
params := s.Fields()
if len(params) != 1 {
s.Chat().Send(s.Message().Channel().ID(), "please supply just 1 number")
return
}
guess, err := strconv.Atoi(params[0])
if err != nil {
s.Chat().Send(s.Message().Channel().ID(), err.Error())
return
}
if guess == SECRET_NUMBER {
s.Chat().Send(s.Message().Channel().ID(), "Correct")
} else {
s.Chat().Send(s.Message().Channel().ID(), "Guess again")
}
return
}
func defaultFunc(s victor.State) {
s.Chat().Send(s.Message().Channel().ID(),
"Unrecognized command. Type `help` to see supported commands.")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment