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, slackDMid string
|
|
|
|
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
|
2019-11-15 19:50:22 +00:00
|
|
|
} 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
|
|
|
}
|