-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
84 lines (70 loc) · 1.86 KB
/
main.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
package main
import (
"log"
"os"
"github.com/Krognol/go-wolfram"
"github.com/christianrondeau/go-wit"
"github.com/nlopes/slack"
)
const confidenceThreshold = 0.5
var (
slackClient *slack.Client
witClient *wit.Client
wolframClient *wolfram.Client
)
func main() {
slackClient = slack.New(os.Getenv("SLACK_ACCESS_TOKEN"))
witClient = wit.NewClient(os.Getenv("WIT_AI_ACCESS_TOKEN"))
wolframClient = &wolfram.Client{AppID: os.Getenv("WOLFRAM_APP_ID")}
rtm := slackClient.NewRTM()
go rtm.ManageConnection()
for msg := range rtm.IncomingEvents {
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
if len(ev.BotID) == 0 {
go handleMessage(ev)
}
}
}
}
func handleMessage(ev *slack.MessageEvent) {
result, err := witClient.Message(ev.Msg.Text)
if err != nil {
log.Printf("unable to get wit.ai result: %v", err)
return
}
var (
topEntity wit.MessageEntity
topEntityKey string
)
for key, entityList := range result.Entities {
for _, entity := range entityList {
if entity.Confidence > confidenceThreshold && entity.Confidence > topEntity.Confidence {
topEntity = entity
topEntityKey = key
}
}
}
replyToUser(ev, topEntity, topEntityKey)
}
func replyToUser(ev *slack.MessageEvent, topEntity wit.MessageEntity, topEntityKey string) {
switch topEntityKey {
case "greetings":
slackClient.PostMessage(ev.User, "Hello user! How can I help you?", slack.PostMessageParameters{
AsUser: true,
})
return
case "wolfram_search_query":
res, err := wolframClient.GetSpokentAnswerQuery(topEntity.Value.(string), wolfram.Metric, 1000)
if err == nil {
slackClient.PostMessage(ev.User, res, slack.PostMessageParameters{
AsUser: true,
})
return
}
log.Printf("unable to get data from wolfram: %v", err)
}
slackClient.PostMessage(ev.User, "¯\\_(o_o)_/¯", slack.PostMessageParameters{
AsUser: true,
})
}