diff options
author | JoramWilander <jwawilander@gmail.com> | 2018-07-10 15:01:43 -0400 |
---|---|---|
committer | JoramWilander <jwawilander@gmail.com> | 2018-07-10 15:01:43 -0400 |
commit | 6c7dc2d29ccac5f9925402f6be1a4c2a3c46c005 (patch) | |
tree | 5564a47257bf6e85aaef711980c5b0fcb4d07dcc /app/plugin_commands.go | |
parent | c042ffa460296587579aff54b157a5109e022f7e (diff) | |
parent | 1e1a5e5e85240f25c4faddcb24c5a29a915fe6e4 (diff) | |
download | chat-6c7dc2d29ccac5f9925402f6be1a4c2a3c46c005.tar.gz chat-6c7dc2d29ccac5f9925402f6be1a4c2a3c46c005.tar.bz2 chat-6c7dc2d29ccac5f9925402f6be1a4c2a3c46c005.zip |
Merge branch 'plugins-2'
Diffstat (limited to 'app/plugin_commands.go')
-rw-r--r-- | app/plugin_commands.go | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/app/plugin_commands.go b/app/plugin_commands.go new file mode 100644 index 000000000..060defc86 --- /dev/null +++ b/app/plugin_commands.go @@ -0,0 +1,113 @@ +// 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" + "github.com/mattermost/mattermost-server/plugin" +) + +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(plugin.NewBlankContext(), args) + return pc.Command, response, appErr + } + } + return nil, nil, nil +} |