summaryrefslogtreecommitdiffstats
path: root/plugin/rpcplugin
diff options
context:
space:
mode:
authorChris <ccbrown112@gmail.com>2017-12-08 13:55:41 -0600
committerGitHub <noreply@github.com>2017-12-08 13:55:41 -0600
commit4c17bdff1bb871fb31520b7b547f584c53ed854f (patch)
treeedf1e3295d6ff7d67281efc585b2e913b4efda3d /plugin/rpcplugin
parent7ed1177a2b676aa4c93515268642c855cfe57a37 (diff)
downloadchat-4c17bdff1bb871fb31520b7b547f584c53ed854f.tar.gz
chat-4c17bdff1bb871fb31520b7b547f584c53ed854f.tar.bz2
chat-4c17bdff1bb871fb31520b7b547f584c53ed854f.zip
Add plugin slash command support (#7941)
* add plugin slash command support * remove unused string * rebase
Diffstat (limited to 'plugin/rpcplugin')
-rw-r--r--plugin/rpcplugin/api.go24
-rw-r--r--plugin/rpcplugin/api_test.go11
-rw-r--r--plugin/rpcplugin/hooks.go29
-rw-r--r--plugin/rpcplugin/hooks_test.go12
4 files changed, 76 insertions, 0 deletions
diff --git a/plugin/rpcplugin/api.go b/plugin/rpcplugin/api.go
index 76c6e3039..5b5b11a62 100644
--- a/plugin/rpcplugin/api.go
+++ b/plugin/rpcplugin/api.go
@@ -32,6 +32,14 @@ func (api *LocalAPI) LoadPluginConfiguration(args struct{}, reply *[]byte) error
return nil
}
+func (api *LocalAPI) RegisterCommand(args *model.Command, reply *APITeamReply) error {
+ return api.api.RegisterCommand(args)
+}
+
+func (api *LocalAPI) UnregisterCommand(args *APIUnregisterCommandArgs, reply *APITeamReply) error {
+ return api.api.UnregisterCommand(args.TeamId, args.Trigger)
+}
+
type APIErrorReply struct {
Error *model.AppError
}
@@ -344,6 +352,22 @@ func (api *RemoteAPI) LoadPluginConfiguration(dest interface{}) error {
return json.Unmarshal(config, dest)
}
+func (api *RemoteAPI) RegisterCommand(command *model.Command) error {
+ return api.client.Call("LocalAPI.RegisterCommand", command, nil)
+}
+
+type APIUnregisterCommandArgs struct {
+ TeamId string
+ Trigger string
+}
+
+func (api *RemoteAPI) UnregisterCommand(teamId, trigger string) error {
+ return api.client.Call("LocalAPI.UnregisterCommand", &APIUnregisterCommandArgs{
+ TeamId: teamId,
+ Trigger: trigger,
+ }, nil)
+}
+
func (api *RemoteAPI) CreateUser(user *model.User) (*model.User, *model.AppError) {
var reply APIUserReply
if err := api.client.Call("LocalAPI.CreateUser", user, &reply); err != nil {
diff --git a/plugin/rpcplugin/api_test.go b/plugin/rpcplugin/api_test.go
index f9e474d4a..145ec9005 100644
--- a/plugin/rpcplugin/api_test.go
+++ b/plugin/rpcplugin/api_test.go
@@ -2,6 +2,7 @@ package rpcplugin
import (
"encoding/json"
+ "fmt"
"io"
"net/http"
"testing"
@@ -84,6 +85,16 @@ func TestAPI(t *testing.T) {
assert.Equal(t, "foo", config.Foo)
assert.Equal(t, "baz", config.Bar.Baz)
+ api.On("RegisterCommand", mock.AnythingOfType("*model.Command")).Return(fmt.Errorf("foo")).Once()
+ assert.Error(t, remote.RegisterCommand(&model.Command{}))
+ api.On("RegisterCommand", mock.AnythingOfType("*model.Command")).Return(nil).Once()
+ assert.NoError(t, remote.RegisterCommand(&model.Command{}))
+
+ api.On("UnregisterCommand", "team", "trigger").Return(fmt.Errorf("foo")).Once()
+ assert.Error(t, remote.UnregisterCommand("team", "trigger"))
+ api.On("UnregisterCommand", "team", "trigger").Return(nil).Once()
+ assert.NoError(t, remote.UnregisterCommand("team", "trigger"))
+
api.On("CreateChannel", mock.AnythingOfType("*model.Channel")).Return(func(c *model.Channel) (*model.Channel, *model.AppError) {
c.Id = "thechannelid"
return c, nil
diff --git a/plugin/rpcplugin/hooks.go b/plugin/rpcplugin/hooks.go
index 22f26e22e..7b44d0de7 100644
--- a/plugin/rpcplugin/hooks.go
+++ b/plugin/rpcplugin/hooks.go
@@ -11,6 +11,7 @@ import (
"net/rpc"
"reflect"
+ "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/plugin"
)
@@ -125,6 +126,20 @@ func (h *LocalHooks) ServeHTTP(args ServeHTTPArgs, reply *struct{}) error {
return nil
}
+type HooksExecuteCommandReply struct {
+ Response *model.CommandResponse
+ Error *model.AppError
+}
+
+func (h *LocalHooks) ExecuteCommand(args *model.CommandArgs, reply *HooksExecuteCommandReply) error {
+ if hook, ok := h.hooks.(interface {
+ ExecuteCommand(*model.CommandArgs) (*model.CommandResponse, *model.AppError)
+ }); ok {
+ reply.Response, reply.Error = hook.ExecuteCommand(args)
+ }
+ return nil
+}
+
func ServeHooks(hooks interface{}, conn io.ReadWriteCloser, muxer *Muxer) {
server := rpc.NewServer()
server.Register(&LocalHooks{
@@ -141,6 +156,7 @@ const (
remoteOnDeactivate = 1
remoteServeHTTP = 2
remoteOnConfigurationChange = 3
+ remoteExecuteCommand = 4
maxRemoteHookCount = iota
)
@@ -225,6 +241,17 @@ func (h *RemoteHooks) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
}
+func (h *RemoteHooks) ExecuteCommand(args *model.CommandArgs) (*model.CommandResponse, *model.AppError) {
+ if !h.implemented[remoteExecuteCommand] {
+ return nil, model.NewAppError("RemoteHooks.ExecuteCommand", "plugin.rpcplugin.invocation.error", nil, "err=ExecuteCommand hook not implemented", http.StatusInternalServerError)
+ }
+ var reply HooksExecuteCommandReply
+ if err := h.client.Call("LocalHooks.ExecuteCommand", args, &reply); err != nil {
+ return nil, model.NewAppError("RemoteHooks.ExecuteCommand", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
+ }
+ return reply.Response, reply.Error
+}
+
func (h *RemoteHooks) Close() error {
if h.apiCloser != nil {
h.apiCloser.Close()
@@ -253,6 +280,8 @@ func ConnectHooks(conn io.ReadWriteCloser, muxer *Muxer) (*RemoteHooks, error) {
remote.implemented[remoteOnConfigurationChange] = true
case "ServeHTTP":
remote.implemented[remoteServeHTTP] = true
+ case "ExecuteCommand":
+ remote.implemented[remoteExecuteCommand] = true
}
}
return remote, nil
diff --git a/plugin/rpcplugin/hooks_test.go b/plugin/rpcplugin/hooks_test.go
index 37c529510..116038dae 100644
--- a/plugin/rpcplugin/hooks_test.go
+++ b/plugin/rpcplugin/hooks_test.go
@@ -13,6 +13,7 @@ import (
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
+ "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/plugin"
"github.com/mattermost/mattermost-server/plugin/plugintest"
)
@@ -79,6 +80,17 @@ func TestHooks(t *testing.T) {
body, err := ioutil.ReadAll(resp.Body)
assert.NoError(t, err)
assert.Equal(t, "bar", string(body))
+
+ hooks.On("ExecuteCommand", &model.CommandArgs{
+ Command: "/foo",
+ }).Return(&model.CommandResponse{
+ Text: "bar",
+ }, nil)
+ commandResponse, appErr := hooks.ExecuteCommand(&model.CommandArgs{
+ Command: "/foo",
+ })
+ assert.Equal(t, "bar", commandResponse.Text)
+ assert.Nil(t, appErr)
}))
}