package main import ( "bufio" "fmt" "os" "strings" "github.com/nlopes/slack" ) 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 } bt, bterr := a.m.GetString([]string{"config", "plugin_dir"}) if bterr == nil { fmt.Println(bt) } 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 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() go a.watchRTMEventChannel() return nil } func (a *App) MonitorSlackMessages() { for msg := range a.m.IncomingSlackMessages { a.m.SendMessage("slack", "main", slack.Message(*msg)) } } func (a *App) watchMessageChannel() { for a.running { msg := <-a.m.messages slackMsg := msg.GetMessage() if slackMsg.Type == "control" && slackMsg.Text == "quit" { a.running = false break } else if msg.GetDestination() == "error" { fmt.Printf("ERROR: %s: %s\n", msg.GetSource(), msg.GetMessage().Text) } else if msg.GetDestination() == "slack" { a.m.SendSlackChannelMessage(&slackMsg) } for _, v := range a.plugins { v.State.ProcessMessage(msg) } } } func (a *App) watchRTMEventChannel() { for a.running { msg := <-a.m.OtherRTMEvents for _, v := range a.plugins { v.State.ProcessRTMEvent(*msg) } } }