github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/app/slashcommands/command_custom_status.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package slashcommands
     5  
     6  import (
     7  	"strings"
     8  
     9  	goi18n "github.com/mattermost/go-i18n/i18n"
    10  
    11  	"github.com/mattermost/mattermost-server/v5/app"
    12  	"github.com/mattermost/mattermost-server/v5/mlog"
    13  	"github.com/mattermost/mattermost-server/v5/model"
    14  )
    15  
    16  type CustomStatusProvider struct {
    17  }
    18  
    19  const (
    20  	CmdCustomStatus      = app.CmdCustomStatusTrigger
    21  	CmdCustomStatusClear = "clear"
    22  
    23  	DefaultCustomStatusEmoji = "speech_balloon"
    24  )
    25  
    26  func init() {
    27  	app.RegisterCommandProvider(&CustomStatusProvider{})
    28  }
    29  
    30  func (*CustomStatusProvider) GetTrigger() string {
    31  	return CmdCustomStatus
    32  }
    33  
    34  func (*CustomStatusProvider) GetCommand(a *app.App, T goi18n.TranslateFunc) *model.Command {
    35  	return &model.Command{
    36  		Trigger:          CmdCustomStatus,
    37  		AutoComplete:     true,
    38  		AutoCompleteDesc: T("api.command_custom_status.desc"),
    39  		AutoCompleteHint: T("api.command_custom_status.hint"),
    40  		DisplayName:      T("api.command_custom_status.name"),
    41  	}
    42  }
    43  
    44  func (*CustomStatusProvider) DoCommand(a *app.App, args *model.CommandArgs, message string) *model.CommandResponse {
    45  	if !a.Config().FeatureFlags.CustomUserStatuses || !*a.Config().TeamSettings.EnableCustomUserStatuses {
    46  		return nil
    47  	}
    48  
    49  	if message == CmdCustomStatusClear {
    50  		if err := a.RemoveCustomStatus(args.UserId); err != nil {
    51  			mlog.Error(err.Error())
    52  			return &model.CommandResponse{Text: args.T("api.command_custom_status.clear.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    53  		}
    54  
    55  		return &model.CommandResponse{
    56  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    57  			Text:         args.T("api.command_custom_status.clear.success"),
    58  		}
    59  	}
    60  
    61  	customStatus := &model.CustomStatus{
    62  		Emoji: DefaultCustomStatusEmoji,
    63  		Text:  message,
    64  	}
    65  	firstEmojiLocations := model.ALL_EMOJI_PATTERN.FindIndex([]byte(message))
    66  	if len(firstEmojiLocations) > 0 && firstEmojiLocations[0] == 0 {
    67  		// emoji found at starting index
    68  		customStatus.Emoji = message[firstEmojiLocations[0]+1 : firstEmojiLocations[1]-1]
    69  		customStatus.Text = strings.TrimSpace(message[firstEmojiLocations[1]:])
    70  	}
    71  
    72  	customStatus.TrimMessage()
    73  	if err := a.SetCustomStatus(args.UserId, customStatus); err != nil {
    74  		mlog.Error(err.Error())
    75  		return &model.CommandResponse{Text: args.T("api.command_custom_status.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    76  	}
    77  
    78  	return &model.CommandResponse{
    79  		ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    80  		Text: args.T("api.command_custom_status.success", map[string]interface{}{
    81  			"EmojiName":     ":" + customStatus.Emoji + ":",
    82  			"StatusMessage": customStatus.Text,
    83  		}),
    84  	}
    85  }