forked from groob/radigast
/
radigast.go
99 lines (85 loc) · 1.87 KB
/
radigast.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main
import (
"flag"
"fmt"
"log"
"os"
"os/signal"
"github.com/FogCreek/victor"
"github.com/FogCreek/victor/pkg/chat/slackRealtime"
"github.com/FogCreek/victor/pkg/events"
"github.com/groob/radigast"
)
var fConfig = flag.String("config", "", "configuration file to load")
var fVersion = flag.Bool("version", false, "display the version")
// Version string
var Version = "unreleased"
func main() {
flag.Parse()
if *fVersion {
fmt.Printf("Radigast Slack Bot - Version %s\n", Version)
return
}
var (
config *radigast.Config
err error
)
if *fConfig != "" {
config, err = radigast.LoadConfig(*fConfig)
if err != nil {
log.Fatal(err)
}
} else {
log.Fatal("No config file specified.")
}
bot := victor.New(victor.Config{
ChatAdapter: "slackRealtime",
AdapterConfig: slackRealtime.NewConfig(config.SlackToken),
Name: config.BotName,
})
// load radigast plugins
config.LoadPlugins(bot)
// Enable in-chat help command
bot.EnableHelpCommand()
// run the bot
runBot(bot)
}
// run and recover from panic during bot.Stop()
// the upstream slack adapter has not implemented bot.Stop() yet
func runBot(bot victor.Robot) {
defer func() {
if e := recover(); e != nil {
fmt.Println("bot.Stop() exited with panic: ", e)
os.Exit(0)
}
}()
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.Panic(err.Error())
}
log.Println("Chat Adapter Error Event:", err.Error())
}
}
func monitorEvents(eventsChannel chan events.ChatEvent) {
for {
e, ok := <-eventsChannel
if !ok {
return
}
log.Printf("Chat Event: %+v", e)
}
}