92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
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
|
||
|
}
|
||
|
a.running = true
|
||
|
|
||
|
go a.MonitorSlackMessages()
|
||
|
return a, nil
|
||
|
}
|
||
|
|
||
|
func (a *App) initialize() error {
|
||
|
var err error
|
||
|
if a.m, err = NewBotModel(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
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))
|
||
|
}
|
||
|
slackDMid, err = a.m.getSlackAdminDMId()
|
||
|
if err != nil || slackDMid == "" {
|
||
|
fmt.Print("Slack Admin DM ID: ")
|
||
|
slackDMid, _ = reader.ReadString('\n')
|
||
|
a.m.setSlackAdminDMId(strings.TrimSpace(slackDMid))
|
||
|
}
|
||
|
|
||
|
if err = a.m.NewSlack(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
go a.watchMessageChannel()
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (a *App) watchMessageChannel() {
|
||
|
for a.running {
|
||
|
msg := <-a.m.messages
|
||
|
slackMsg := msg.GetMessage()
|
||
|
if slackMsg.Type == "control" && slackMsg.Name == "quit" {
|
||
|
a.running = false
|
||
|
break
|
||
|
} else if msg.GetDestination() == "slack" {
|
||
|
a.m.SendSlackChannelMessage(&slackMsg)
|
||
|
}
|
||
|
|
||
|
for _, v := range a.plugins {
|
||
|
v.State.ProcessMessage(msg)
|
||
|
}
|
||
|
}
|
||
|
close(a.m.messages)
|
||
|
}
|