/
Listener.go
111 lines (85 loc) · 2.92 KB
/
Listener.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
109
110
111
package slack
import "../Bot"
import "../Config"
import "../CmdProcessor"
import "../HistoryLogger"
import "github.com/nlopes/slack"
import "log"
type CmdId int
const (
CmdStop = 0
)
type ListenerCmd struct {
id CmdId
}
type Listener struct {
bot *bot.Context
api *slack.Client
rtm *slack.RTM
control chan ListenerCmd
logger *history.ServiceLogger
}
func NewListener(cfg *config.Config, botCtx *bot.Context, logger *history.Logger) (*Listener, error) {
this := &Listener { bot: botCtx,
api: slack.New(cfg.Slack.Token),
control: make(chan ListenerCmd) }
this.logger, _ = logger.GetServiceLogger("Slack")
this.rtm = this.api.NewRTM()
go this.rtm.ManageConnection()
return this, nil
}
func dumpEvent(event *slack.RTMEvent) {
log.Printf("=== New RTMEvent ===")
log.Printf("Type: %v", event.Type)
}
func (this *Listener) processEvent(event *slack.RTMEvent, cmdHandler *cmdprocessor.CmdRegistry) () {
switch ev := event.Data.(type) {
case *slack.MessageEvent:
if this.bot.Debug == true {
log.Printf("message event: \"%v\", from: \"%v\"", ev.Text, ev.User)
}
cmd, args := cmdHandler.SplitCommandAndArgs(ev.Text, ev.User)
cmdCtx := &CommandCtx { listener: this,
message: ev.Text,
command: cmd,
args: args,
userId: ev.User,
userName: ev.Username,
channelId: ev.Channel }
cmdHandler.HandleCommand(cmdCtx)
case *slack.ConnectingEvent:
log.Printf("connecting, attempt: %v, count: %v", ev.Attempt, ev.ConnectionCount)
case *slack.ConnectionErrorEvent:
log.Printf("Error: %s\n", ev.Error())
case *slack.LatencyReport:
// do nothing
default:
if this.bot.Debug == true {
dumpEvent(event)
}
}
}
func (this *Listener) listen(cmdHandler *cmdprocessor.CmdRegistry) () {
log.Printf("slack.Listener: Start listener thread")
isRunning := true
for isRunning == true {
select {
case ev := <- this.rtm.IncomingEvents:
this.processEvent(&ev, cmdHandler)
case cmd := <- this.control:
if cmd.id == CmdStop {
log.Printf("slack.Listener: Stop command received")
isRunning = false
}
}
}
log.Printf("slack.Listener: Exit listener thread")
}
func (this *Listener) Start(cmdHandler *cmdprocessor.CmdRegistry) () {
go this.listen(cmdHandler)
}
func (this *Listener) Stop() () {
this.control <- ListenerCmd { id: CmdStop }
}
func ( this* Listener ) PushMessage( cid string, cmdLine string ) () {
}