93 lines
2.0 KiB
Go
93 lines
2.0 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"git.bullercodeworks.com/brian/boltease"
|
|
"github.com/slack-go/slack"
|
|
)
|
|
|
|
type BotModel struct {
|
|
debug bool
|
|
db *boltease.DB
|
|
|
|
messages chan BotMessage
|
|
|
|
slackApiToken string
|
|
slackApi *slack.Client
|
|
slackRTM *slack.RTM
|
|
slackRTMLatency time.Duration
|
|
|
|
incomingSlackMessages chan *slack.MessageEvent
|
|
otherRTMEvents chan *slack.RTMEvent
|
|
|
|
messageWatchers []func(msg BotMessage) bool
|
|
rtmWatchers []func(event *slack.RTMEvent) bool
|
|
}
|
|
|
|
func NewBotModel(debug bool) (*BotModel, error) {
|
|
var err error
|
|
m := new(BotModel)
|
|
m.debug = debug
|
|
m.messages = make(chan BotMessage, 100)
|
|
m.messageWatchers = make([]func(msg BotMessage) bool, 1)
|
|
m.AddMessageWatcher(m.DebugMessageWatcher)
|
|
m.AddRTMWatcher(m.DebugRTMWatcher)
|
|
m.db, err = boltease.Create("helperbot.db", 0600, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err = m.NewSlack(); err != nil {
|
|
return nil, err
|
|
}
|
|
go m.monitorSlackMessages()
|
|
return m, nil
|
|
}
|
|
|
|
func (m *BotModel) DebugMessageWatcher(msg BotMessage) bool {
|
|
if m.debug {
|
|
fmt.Printf("Received Message: %s\n", msg)
|
|
}
|
|
return false
|
|
}
|
|
func (m *BotModel) DebugRTMWatcher(event *slack.RTMEvent) bool {
|
|
if m.debug {
|
|
fmt.Printf("RTMEvent: %s\n", event)
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (m *BotModel) SendMessage(msg BotMessage) {
|
|
fmt.Println("Sending:", msg)
|
|
m.messages <- msg
|
|
}
|
|
|
|
func (m *BotModel) AddMessageWatcher(watcher func(msg BotMessage) bool) {
|
|
m.messageWatchers = append(m.messageWatchers, watcher)
|
|
}
|
|
func (m *BotModel) AddRTMWatcher(watcher func(event *slack.RTMEvent) bool) {
|
|
m.rtmWatchers = append(m.rtmWatchers, watcher)
|
|
}
|
|
|
|
func (m *BotModel) ProcessMessageChannel() {
|
|
msg := <-m.messages
|
|
for _, v := range m.messageWatchers {
|
|
// Pass the message to the watcher
|
|
if v(msg) {
|
|
// if a watcher returns true, the message was consumed
|
|
break
|
|
}
|
|
}
|
|
}
|
|
func (m *BotModel) ProcessRTMChannel() {
|
|
msg := <-m.otherRTMEvents
|
|
for _, v := range m.rtmWatchers {
|
|
// Pass the event to the watcher
|
|
if v(msg) {
|
|
// if a watcher returns true, the message was consumed
|
|
break
|
|
}
|
|
}
|
|
}
|