github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/app/slashcommands/command_invite.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 InviteProvider struct { 18 } 19 20 const ( 21 CmdInvite = "invite" 22 ) 23 24 func init() { 25 app.RegisterCommandProvider(&InviteProvider{}) 26 } 27 28 func (*InviteProvider) GetTrigger() string { 29 return CmdInvite 30 } 31 32 func (*InviteProvider) GetCommand(a *app.App, T i18n.TranslateFunc) *model.Command { 33 return &model.Command{ 34 Trigger: CmdInvite, 35 AutoComplete: true, 36 AutoCompleteDesc: T("api.command_invite.desc"), 37 AutoCompleteHint: T("api.command_invite.hint"), 38 DisplayName: T("api.command_invite.name"), 39 } 40 } 41 42 func (*InviteProvider) DoCommand(a *app.App, c *request.Context, args *model.CommandArgs, message string) *model.CommandResponse { 43 if message == "" { 44 return &model.CommandResponse{ 45 Text: args.T("api.command_invite.missing_message.app_error"), 46 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 47 } 48 } 49 50 splitMessage := strings.SplitN(message, " ", 2) 51 targetUsername := splitMessage[0] 52 targetUsername = strings.TrimPrefix(targetUsername, "@") 53 54 userProfile, nErr := a.Srv().Store.User().GetByUsername(targetUsername) 55 if nErr != nil { 56 mlog.Error(nErr.Error()) 57 return &model.CommandResponse{ 58 Text: args.T("api.command_invite.missing_user.app_error"), 59 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 60 } 61 } 62 63 if userProfile.DeleteAt != 0 { 64 return &model.CommandResponse{ 65 Text: args.T("api.command_invite.missing_user.app_error"), 66 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 67 } 68 } 69 70 var channelToJoin *model.Channel 71 var err *model.AppError 72 // User set a channel to add the invited user 73 if len(splitMessage) > 1 && splitMessage[1] != "" { 74 targetChannelName := strings.TrimPrefix(strings.TrimSpace(splitMessage[1]), "~") 75 76 if channelToJoin, err = a.GetChannelByName(targetChannelName, args.TeamId, false); err != nil { 77 return &model.CommandResponse{ 78 Text: args.T("api.command_invite.channel.error", map[string]interface{}{ 79 "Channel": targetChannelName, 80 }), 81 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 82 } 83 } 84 } else { 85 channelToJoin, err = a.GetChannel(args.ChannelId) 86 if err != nil { 87 return &model.CommandResponse{ 88 Text: args.T("api.command_invite.channel.app_error"), 89 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 90 } 91 } 92 } 93 94 // Permissions Check 95 switch channelToJoin.Type { 96 case model.CHANNEL_OPEN: 97 if !a.HasPermissionToChannel(args.UserId, channelToJoin.Id, model.PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS) { 98 return &model.CommandResponse{ 99 Text: args.T("api.command_invite.permission.app_error", map[string]interface{}{ 100 "User": userProfile.Username, 101 "Channel": channelToJoin.Name, 102 }), 103 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 104 } 105 } 106 case model.CHANNEL_PRIVATE: 107 if !a.HasPermissionToChannel(args.UserId, channelToJoin.Id, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS) { 108 if _, err = a.GetChannelMember(context.Background(), channelToJoin.Id, args.UserId); err == nil { 109 // User doing the inviting is a member of the channel. 110 return &model.CommandResponse{ 111 Text: args.T("api.command_invite.permission.app_error", map[string]interface{}{ 112 "User": userProfile.Username, 113 "Channel": channelToJoin.Name, 114 }), 115 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 116 } 117 } 118 // User doing the inviting is *not* a member of the channel. 119 return &model.CommandResponse{ 120 Text: args.T("api.command_invite.private_channel.app_error", map[string]interface{}{ 121 "Channel": channelToJoin.Name, 122 }), 123 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 124 } 125 } 126 default: 127 return &model.CommandResponse{ 128 Text: args.T("api.command_invite.directchannel.app_error"), 129 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 130 } 131 } 132 133 // Check if user is already in the channel 134 _, err = a.GetChannelMember(context.Background(), channelToJoin.Id, userProfile.Id) 135 if err == nil { 136 return &model.CommandResponse{ 137 Text: args.T("api.command_invite.user_already_in_channel.app_error", map[string]interface{}{ 138 "User": userProfile.Username, 139 }), 140 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 141 } 142 } 143 144 if _, err := a.AddChannelMember(c, userProfile.Id, channelToJoin, app.ChannelMemberOpts{ 145 UserRequestorID: args.UserId, 146 }); err != nil { 147 var text string 148 if err.Id == "api.channel.add_members.user_denied" { 149 text = args.T("api.command_invite.group_constrained_user_denied") 150 } else if err.Id == "app.team.get_member.missing.app_error" || 151 err.Id == "api.channel.add_user.to.channel.failed.deleted.app_error" { 152 text = args.T("api.command_invite.user_not_in_team.app_error", map[string]interface{}{ 153 "Username": userProfile.Username, 154 }) 155 } else { 156 text = args.T("api.command_invite.fail.app_error") 157 } 158 return &model.CommandResponse{ 159 Text: text, 160 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 161 } 162 } 163 164 if args.ChannelId != channelToJoin.Id { 165 return &model.CommandResponse{ 166 Text: args.T("api.command_invite.success", map[string]interface{}{ 167 "User": userProfile.Username, 168 "Channel": channelToJoin.Name, 169 }), 170 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 171 } 172 } 173 174 return &model.CommandResponse{} 175 }