-
Notifications
You must be signed in to change notification settings - Fork 2
/
slack.go
90 lines (80 loc) · 2.04 KB
/
slack.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
package inputs
import (
"html"
"log"
"strings"
"github.com/hexbotio/hex/models"
"github.com/nlopes/slack"
)
// Slack struct
type Slack struct {
}
// Read function
func (x Slack) Read(inputMsgs chan<- models.Message, service models.Service) {
defer Recovery(service)
var useAt = false
if strings.ToLower(service.Config["UseAt"]) == "true" {
useAt = true
}
api := slack.New(service.Config["Key"])
var slackDebug = false
if strings.ToLower(service.Config["SlackDebug"]) == "true" {
slackDebug = true
}
api.SetDebug(slackDebug)
// get channel array
channels := make(map[string]string)
channelList, err := api.GetChannels(true)
if err != nil {
log.Printf("%s\n", err)
}
for _, channel := range channelList {
channels[channel.ID] = "#" + channel.Name
}
// get user array
bot := ""
users := make(map[string]string)
userList, err := api.GetUsers()
if err != nil {
log.Printf("%s\n", err)
}
for _, user := range userList {
users[user.ID] = user.Name
if service.BotName == user.Name {
bot = user.ID
}
}
// validate bot
if bot == "" {
log.Print("WARNING - Bot does not seem to be configured in Slack as '" + service.BotName + "'")
} else {
bot = "<@" + bot + ">"
}
// listen to messages
rtm := api.NewRTM()
go rtm.ManageConnection()
for {
select {
case msg := <-rtm.IncomingEvents:
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
if ev.User != "" {
channel, found := channels[ev.Channel]
if !found {
channel = ev.Channel
}
if useAt && strings.HasPrefix(ev.Text, bot) {
input := strings.Replace(html.UnescapeString(ev.Text), bot+" ", "", 1)
message := models.MakeMessage(service.Type, service.Name, channel, users[ev.User], input)
inputMsgs <- message
}
if !useAt && strings.HasPrefix(ev.Text, service.BotName) {
input := strings.Replace(html.UnescapeString(ev.Text), service.BotName+" ", "", 1)
message := models.MakeMessage(service.Type, service.Name, channel, users[ev.User], input)
inputMsgs <- message
}
}
}
}
}
}