github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/app/slashcommands/command_remove.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 RemoveProvider struct { 17 } 18 19 type KickProvider struct { 20 } 21 22 const ( 23 CmdRemove = "remove" 24 CmdKick = "kick" 25 ) 26 27 func init() { 28 app.RegisterCommandProvider(&RemoveProvider{}) 29 app.RegisterCommandProvider(&KickProvider{}) 30 } 31 32 func (*RemoveProvider) GetTrigger() string { 33 return CmdRemove 34 } 35 36 func (*KickProvider) GetTrigger() string { 37 return CmdKick 38 } 39 40 func (*RemoveProvider) GetCommand(a *app.App, T goi18n.TranslateFunc) *model.Command { 41 return &model.Command{ 42 Trigger: CmdRemove, 43 AutoComplete: true, 44 AutoCompleteDesc: T("api.command_remove.desc"), 45 AutoCompleteHint: T("api.command_remove.hint"), 46 DisplayName: T("api.command_remove.name"), 47 } 48 } 49 50 func (*KickProvider) GetCommand(a *app.App, T goi18n.TranslateFunc) *model.Command { 51 return &model.Command{ 52 Trigger: CmdKick, 53 AutoComplete: true, 54 AutoCompleteDesc: T("api.command_remove.desc"), 55 AutoCompleteHint: T("api.command_remove.hint"), 56 DisplayName: T("api.command_kick.name"), 57 } 58 } 59 60 func (*RemoveProvider) DoCommand(a *app.App, args *model.CommandArgs, message string) *model.CommandResponse { 61 return doCommand(a, args, message) 62 } 63 64 func (*KickProvider) DoCommand(a *app.App, args *model.CommandArgs, message string) *model.CommandResponse { 65 return doCommand(a, args, message) 66 } 67 68 func doCommand(a *app.App, args *model.CommandArgs, message string) *model.CommandResponse { 69 channel, err := a.GetChannel(args.ChannelId) 70 if err != nil { 71 return &model.CommandResponse{ 72 Text: args.T("api.command_channel_remove.channel.app_error"), 73 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 74 } 75 } 76 77 switch channel.Type { 78 case model.CHANNEL_OPEN: 79 if !a.HasPermissionToChannel(args.UserId, args.ChannelId, model.PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS) { 80 return &model.CommandResponse{ 81 Text: args.T("api.command_remove.permission.app_error"), 82 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 83 } 84 } 85 case model.CHANNEL_PRIVATE: 86 if !a.HasPermissionToChannel(args.UserId, args.ChannelId, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS) { 87 return &model.CommandResponse{ 88 Text: args.T("api.command_remove.permission.app_error"), 89 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 90 } 91 } 92 default: 93 return &model.CommandResponse{ 94 Text: args.T("api.command_remove.direct_group.app_error"), 95 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 96 } 97 } 98 99 if message == "" { 100 return &model.CommandResponse{ 101 Text: args.T("api.command_remove.message.app_error"), 102 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 103 } 104 } 105 106 targetUsername := "" 107 108 targetUsername = strings.SplitN(message, " ", 2)[0] 109 targetUsername = strings.TrimPrefix(targetUsername, "@") 110 111 userProfile, nErr := a.Srv().Store.User().GetByUsername(targetUsername) 112 if nErr != nil { 113 mlog.Error(nErr.Error()) 114 return &model.CommandResponse{ 115 Text: args.T("api.command_remove.missing.app_error"), 116 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 117 } 118 } 119 if userProfile.DeleteAt != 0 { 120 return &model.CommandResponse{ 121 Text: args.T("api.command_remove.missing.app_error"), 122 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 123 } 124 } 125 126 _, err = a.GetChannelMember(args.ChannelId, userProfile.Id) 127 if err != nil { 128 nameFormat := *a.Config().TeamSettings.TeammateNameDisplay 129 return &model.CommandResponse{ 130 Text: args.T("api.command_remove.user_not_in_channel", map[string]interface{}{ 131 "Username": userProfile.GetDisplayName(nameFormat), 132 }), 133 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 134 } 135 } 136 137 if err = a.RemoveUserFromChannel(userProfile.Id, args.UserId, channel); err != nil { 138 var text string 139 if err.Id == "api.channel.remove_members.denied" { 140 text = args.T("api.command_remove.group_constrained_user_denied") 141 } else { 142 text = args.T(err.Id, map[string]interface{}{ 143 "Channel": model.DEFAULT_CHANNEL, 144 }) 145 } 146 return &model.CommandResponse{ 147 Text: text, 148 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 149 } 150 } 151 152 return &model.CommandResponse{} 153 }