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 }