helperbot/models/model.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
}
}
}