helperbot/cmd/app.go

106 lines
2.0 KiB
Go
Raw Normal View History

2019-11-13 00:45:56 +00:00
package main
import (
"bufio"
"fmt"
"os"
"strings"
2019-11-22 18:37:15 +00:00
"github.com/nlopes/slack"
2019-11-13 00:45:56 +00:00
)
type App struct {
DebugMode bool
running bool
m *BotModel
plugins []HelperPlugin
}
func NewApp() (*App, error) {
a := new(App)
if DebugMode {
fmt.Println("Running in Debug Mode. All messages will be sent to Admin DM")
}
a.DebugMode = DebugMode
err := a.initialize()
if err != nil {
return nil, err
}
2019-11-21 23:45:04 +00:00
a.running = true
2019-11-13 00:45:56 +00:00
go a.MonitorSlackMessages()
return a, nil
}
func (a *App) initialize() error {
var err error
if a.m, err = NewBotModel(); err != nil {
return err
}
2019-11-21 23:45:04 +00:00
bt, bterr := a.m.GetString([]string{"config", "plugin_dir"})
if bterr == nil {
fmt.Println(bt)
}
2019-11-13 00:45:56 +00:00
reader := bufio.NewReader(os.Stdin)
// Load up the plugins
pluginDir := strings.TrimSpace(a.m.getPluginDir())
a.LoadPluginsFromDirectory(pluginDir)
if err != nil {
fmt.Println("Error loading plugins")
fmt.Println(err.Error())
os.Exit(1)
}
// Now initialize the Slack stuff
var slackToken string
// var slackDmid string
2019-11-13 00:45:56 +00:00
slackToken, err = a.m.getSlackToken()
if err != nil || slackToken == "" {
fmt.Print("Slack API Token: ")
slackToken, _ = reader.ReadString('\n')
a.m.setSlackToken(strings.TrimSpace(slackToken))
}
go a.watchMessageChannel()
2019-11-22 18:37:15 +00:00
go a.watchRTMEventChannel()
2019-11-13 00:45:56 +00:00
return nil
}
2019-11-22 18:37:15 +00:00
func (a *App) MonitorSlackMessages() {
for msg := range a.m.IncomingSlackMessages {
a.m.SendMessage("slack", "main", slack.Message(*msg))
}
}
2019-11-13 00:45:56 +00:00
func (a *App) watchMessageChannel() {
for a.running {
msg := <-a.m.messages
slackMsg := msg.GetMessage()
2019-11-21 23:45:04 +00:00
if slackMsg.Type == "control" && slackMsg.Text == "quit" {
2019-11-13 00:45:56 +00:00
a.running = false
break
} else if msg.GetDestination() == "error" {
fmt.Printf("ERROR: %s: %s\n", msg.GetSource(), msg.GetMessage().Text)
2019-11-13 00:45:56 +00:00
} else if msg.GetDestination() == "slack" {
a.m.SendSlackChannelMessage(&slackMsg)
}
for _, v := range a.plugins {
v.State.ProcessMessage(msg)
}
}
2019-11-22 18:37:15 +00:00
}
func (a *App) watchRTMEventChannel() {
for a.running {
msg := <-a.m.OtherRTMEvents
for _, v := range a.plugins {
v.State.ProcessRTMEvent(*msg)
}
}
2019-11-13 00:45:56 +00:00
}