Skip to content

Commit

Permalink
MM-29584: Make apps plugin hook invocation/registration conditional (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
catalintomai committed Apr 12, 2021
1 parent 3a3ec00 commit e37e902
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 3 deletions.
24 changes: 21 additions & 3 deletions plugin/helpers_bots.go
Expand Up @@ -70,6 +70,7 @@ type shouldProcessMessageOptions struct {
FilterChannelIDs []string
FilterUserIDs []string
OnlyBotDMs bool
BotID string
}

// AllowSystemMessages configures a call to ShouldProcessMessage to return true for system messages.
Expand Down Expand Up @@ -126,16 +127,33 @@ func OnlyBotDMs() ShouldProcessMessageOption {
}
}

// If provided, BotID configures ShouldProcessMessage to skip its retrieval from the store.
//
// By default, posts from all non-bot users are allowed.
func BotID(botID string) ShouldProcessMessageOption {
return func(options *shouldProcessMessageOptions) {
options.BotID = botID
}
}

// ShouldProcessMessage implements Helpers.ShouldProcessMessage
func (p *HelpersImpl) ShouldProcessMessage(post *model.Post, options ...ShouldProcessMessageOption) (bool, error) {
messageProcessOptions := &shouldProcessMessageOptions{}
for _, option := range options {
option(messageProcessOptions)
}

botIDBytes, kvGetErr := p.API.KVGet(BotUserKey)
if kvGetErr != nil {
return false, errors.Wrap(kvGetErr, "failed to get bot")
var botIDBytes []byte
var kvGetErr *model.AppError

if messageProcessOptions.BotID != "" {
botIDBytes = []byte(messageProcessOptions.BotID)
} else {
botIDBytes, kvGetErr = p.API.KVGet(BotUserKey)

if kvGetErr != nil {
return false, errors.Wrap(kvGetErr, "failed to get bot")
}
}

if botIDBytes != nil {
Expand Down
16 changes: 16 additions & 0 deletions plugin/helpers_bots_test.go
Expand Up @@ -560,4 +560,20 @@ func TestShouldProcessMessage(t *testing.T) {
assert.True(t, shouldProcessMessage)
})

t.Run("should process the message when we pass the botId as input", func(t *testing.T) {
userID := "user-id"
channelID := "1"
api := setupAPI()
api.On("GetChannel", channelID).Return(&model.Channel{Id: channelID, Type: model.CHANNEL_GROUP}, nil)
p.API = api
api.On("GetUser", userID).Return(&model.User{IsBot: false}, nil)

// we should skip the store Get
api.On("KVGet", plugin.BotUserKey).Return(nil, nil)

shouldProcessMessage, err := p.ShouldProcessMessage(&model.Post{ChannelId: channelID, UserId: userID}, plugin.BotID(expectedBotID))
assert.Nil(t, err)

assert.True(t, shouldProcessMessage)
})
}

0 comments on commit e37e902

Please sign in to comment.