-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathslack.go
More file actions
83 lines (69 loc) · 1.81 KB
/
slack.go
File metadata and controls
83 lines (69 loc) · 1.81 KB
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
package main
import (
"context"
"fmt"
"log"
"regexp"
"strings"
"github.com/slack-go/slack"
)
var slackWeightRegexp = regexp.MustCompile("!weight")
type SlackBot struct {
APIToken string
Datastore *Datastore
rtm *slack.RTM
}
func (b *SlackBot) Run(ctx context.Context) func() error {
return func() error {
Loop:
for {
select {
case msg := <-b.getRTM().IncomingEvents:
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
//info := rtm.GetInfo()
text := ev.Text
text = strings.TrimSpace(text)
text = strings.ToLower(text)
// Let's see if someone asked us for something...
sendResponse, response := b.checkForCommands(text)
if sendResponse {
// ...yep, we sent something back, so let's send it to the channel
if err := b.SendMessage(ctx, ev.Channel, []byte(response)); err != nil {
log.Printf("Failed to respond to weight request with: %s\n", err)
}
}
case *slack.RTMError:
fmt.Printf("Error: %s\n", ev.Error())
case *slack.InvalidAuthEvent:
fmt.Printf("Invalid credentials")
break Loop
default:
// Nothin' to do
}
case <-ctx.Done():
log.Printf("SlackBot received Done with Error %q. Shutting down.\n", ctx.Err())
return nil
}
}
return nil
}
}
func (b *SlackBot) SendMessage(ctx context.Context, channel string, msg []byte) error {
_, _, _, err := b.getRTM().SendMessageContext(ctx, channel, slack.MsgOptionText(string(msg), false))
return err
}
func (b *SlackBot) getRTM() *slack.RTM {
if b.rtm == nil {
api := slack.New(b.APIToken)
b.rtm = api.NewRTM()
go b.rtm.ManageConnection()
}
return b.rtm
}
func (b *SlackBot) checkForCommands(input string) (bool, string) {
if slackWeightRegexp.MatchString(input) {
return true, b.Datastore.GetString()
}
return false, ""
}