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