summaryrefslogtreecommitdiffstats
path: root/app/plugin_commands.go
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2018-06-25 12:33:13 -0700
committerGitHub <noreply@github.com>2018-06-25 12:33:13 -0700
commit1e5c432e1029601a664454388ae366ef69618d62 (patch)
treecb9e8bfb66640ac3b29c934bb2c3202d25aeb368 /app/plugin_commands.go
parentecefa6cdd1e7376046bbec82c1b47f7756fea646 (diff)
downloadchat-1e5c432e1029601a664454388ae366ef69618d62.tar.gz
chat-1e5c432e1029601a664454388ae366ef69618d62.tar.bz2
chat-1e5c432e1029601a664454388ae366ef69618d62.zip
MM-10702 Moving plugins to use hashicorp go-plugin. (#8978)
* Moving plugins to use hashicorp go-plugin. * Tweaks from feedback.
Diffstat (limited to 'app/plugin_commands.go')
-rw-r--r--app/plugin_commands.go112
1 files changed, 112 insertions, 0 deletions
diff --git a/app/plugin_commands.go b/app/plugin_commands.go
new file mode 100644
index 000000000..0f361f410
--- /dev/null
+++ b/app/plugin_commands.go
@@ -0,0 +1,112 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See LICENSE.txt for license information.
+
+package app
+
+import (
+ "fmt"
+ "net/http"
+ "strings"
+
+ "github.com/mattermost/mattermost-server/model"
+)
+
+type PluginCommand struct {
+ Command *model.Command
+ PluginId string
+}
+
+func (a *App) RegisterPluginCommand(pluginId string, command *model.Command) error {
+ if command.Trigger == "" {
+ return fmt.Errorf("invalid command")
+ }
+
+ command = &model.Command{
+ Trigger: strings.ToLower(command.Trigger),
+ TeamId: command.TeamId,
+ AutoComplete: command.AutoComplete,
+ AutoCompleteDesc: command.AutoCompleteDesc,
+ AutoCompleteHint: command.AutoCompleteHint,
+ DisplayName: command.DisplayName,
+ }
+
+ a.pluginCommandsLock.Lock()
+ defer a.pluginCommandsLock.Unlock()
+
+ for _, pc := range a.pluginCommands {
+ if pc.Command.Trigger == command.Trigger && pc.Command.TeamId == command.TeamId {
+ if pc.PluginId == pluginId {
+ pc.Command = command
+ return nil
+ }
+ }
+ }
+
+ a.pluginCommands = append(a.pluginCommands, &PluginCommand{
+ Command: command,
+ PluginId: pluginId,
+ })
+ return nil
+}
+
+func (a *App) UnregisterPluginCommand(pluginId, teamId, trigger string) {
+ trigger = strings.ToLower(trigger)
+
+ a.pluginCommandsLock.Lock()
+ defer a.pluginCommandsLock.Unlock()
+
+ var remaining []*PluginCommand
+ for _, pc := range a.pluginCommands {
+ if pc.Command.TeamId != teamId || pc.Command.Trigger != trigger {
+ remaining = append(remaining, pc)
+ }
+ }
+ a.pluginCommands = remaining
+}
+
+func (a *App) UnregisterPluginCommands(pluginId string) {
+ a.pluginCommandsLock.Lock()
+ defer a.pluginCommandsLock.Unlock()
+
+ var remaining []*PluginCommand
+ for _, pc := range a.pluginCommands {
+ if pc.PluginId != pluginId {
+ remaining = append(remaining, pc)
+ }
+ }
+ a.pluginCommands = remaining
+}
+
+func (a *App) PluginCommandsForTeam(teamId string) []*model.Command {
+ a.pluginCommandsLock.RLock()
+ defer a.pluginCommandsLock.RUnlock()
+
+ var commands []*model.Command
+ for _, pc := range a.pluginCommands {
+ if pc.Command.TeamId == "" || pc.Command.TeamId == teamId {
+ commands = append(commands, pc.Command)
+ }
+ }
+ return commands
+}
+
+func (a *App) ExecutePluginCommand(args *model.CommandArgs) (*model.Command, *model.CommandResponse, *model.AppError) {
+ parts := strings.Split(args.Command, " ")
+ trigger := parts[0][1:]
+ trigger = strings.ToLower(trigger)
+
+ a.pluginCommandsLock.RLock()
+ defer a.pluginCommandsLock.RUnlock()
+
+ for _, pc := range a.pluginCommands {
+ if (pc.Command.TeamId == "" || pc.Command.TeamId == args.TeamId) && pc.Command.Trigger == trigger {
+ pluginHooks, err := a.Plugins.HooksForPlugin(pc.PluginId)
+ if err != nil {
+ return pc.Command, nil, model.NewAppError("ExecutePluginCommand", "model.plugin_command.error.app_error", nil, "err="+err.Error(), http.StatusInternalServerError)
+ }
+ response, appErr := pluginHooks.ExecuteCommand(args)
+ return pc.Command, response, appErr
+ }
+ }
+ return nil, nil, nil
+}