Created
October 30, 2015 03:56
-
-
Save ereyes01/90c8db2e56f8e6c3e55b to your computer and use it in GitHub Desktop.
Custom Slack Bot in Go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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