This repository has been archived by the owner on Jul 20, 2020. It is now read-only.
/
bot.go
108 lines (93 loc) · 2.56 KB
/
bot.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
100
101
102
103
104
105
106
107
108
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/jasonmoo/ghostmates"
"github.com/nlopes/slack"
"googlemaps.github.io/maps"
)
var g *Garcon
var sb *slack.Client
var rtm *slack.RTM
var allowedChannels []string
var errorEncounteredDoingSetup bool
func init() {
allowedChannels = []string{"food", "bot-tester", "garcon_test"}
sb = slack.New(os.Getenv("GARCON_TOKEN"))
rtm = sb.NewRTM()
g = NewGarcon()
g.SelfName = "garcon"
g.debug = true
users, err := sb.GetUsers()
if err != nil {
errorEncounteredDoingSetup = true
if fmt.Sprintf("%v", err) == "Post https://slack.com/api/users.list: dial tcp: lookup slack.com: no such host" {
log.Printf("No internet connectivity, skipping setup. :(")
return
}
log.Printf("Error retrieving users:\n%v\n", err)
}
g.Patrons = make(map[string]slack.User)
for _, u := range users {
g.Patrons[u.ID] = u
}
g.FindBotSlackID()
channels, err := sb.GetChannels(true)
if err != nil {
log.Fatal(err)
}
for _, ch := range channels {
if sliceContainsString(ch.Name, allowedChannels) {
g.AllowedChannels = append(g.AllowedChannels, ch.ID)
}
}
customerID := os.Getenv("POSTMATES_CUSTOMER_ID")
sandboxKey := os.Getenv("POSTMATES_API_TOKEN")
duration, err := time.ParseDuration("1m")
if err != nil {
log.Fatal(err)
}
g.PostmatesClient = ghostmates.NewClient(customerID, sandboxKey, duration)
g.OrderDestination = ghostmates.NewDeliverySpot(os.Getenv("GARCON_DESTINATION_NAME"), os.Getenv("GARCON_DESTINATION_ADDRESS"), os.Getenv("GARCON_DESTINATION_NUMBER"))
apiKey := os.Getenv("GOOGLE_MAPS_API_KEY")
c, err := maps.NewClient(maps.WithAPIKey(apiKey))
if err != nil {
log.Fatalf("fatal error establishing client: %s", err)
}
g.GoogleMapsClient = c
}
func makeIDToUserMap(in []slack.User) map[string]slack.User {
users := make(map[string]slack.User)
for _, u := range in {
users[u.ID] = u
}
return users
}
func handleMessage(m slack.Msg) {
responses := g.RespondToMessage(m)
for _, response := range responses {
if len(response.Text) > 0 && sliceContainsString(response.Channel, g.AllowedChannels) {
rtm.SendMessage(rtm.NewOutgoingMessage(response.Text, response.Channel))
} else {
log.Printf("I couldn't send this message\n\t%v\n", response.Text)
}
}
}
func main() {
if !errorEncounteredDoingSetup {
go rtm.ManageConnection()
for {
select {
case msg := <-rtm.IncomingEvents:
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
handleMessage(ev.Msg)
case *slack.RTMError:
log.Printf("I encountered a Slack related error: %s\n", ev.Error())
}
}
}
}
}