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