github.com/adacta-ru/mattermost-server/v6@v6.0.0/app/slashcommands/command_groupmsg.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 "fmt" 8 "strings" 9 10 goi18n "github.com/mattermost/go-i18n/i18n" 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 groupmsgProvider struct { 17 } 18 19 const ( 20 CMD_GROUPMSG = "groupmsg" 21 ) 22 23 func init() { 24 app.RegisterCommandProvider(&groupmsgProvider{}) 25 } 26 27 func (*groupmsgProvider) GetTrigger() string { 28 return CMD_GROUPMSG 29 } 30 31 func (*groupmsgProvider) GetCommand(a *app.App, T goi18n.TranslateFunc) *model.Command { 32 return &model.Command{ 33 Trigger: CMD_GROUPMSG, 34 AutoComplete: true, 35 AutoCompleteDesc: T("api.command_groupmsg.desc"), 36 AutoCompleteHint: T("api.command_groupmsg.hint"), 37 DisplayName: T("api.command_groupmsg.name"), 38 } 39 } 40 41 func (*groupmsgProvider) DoCommand(a *app.App, args *model.CommandArgs, message string) *model.CommandResponse { 42 targetUsers := map[string]*model.User{} 43 targetUsersSlice := []string{args.UserId} 44 invalidUsernames := []string{} 45 46 users, parsedMessage := groupMsgUsernames(message) 47 48 for _, username := range users { 49 username = strings.TrimSpace(username) 50 username = strings.TrimPrefix(username, "@") 51 targetUser, nErr := a.Srv().Store.User().GetByUsername(username) 52 if nErr != nil { 53 invalidUsernames = append(invalidUsernames, username) 54 continue 55 } 56 57 canSee, err := a.UserCanSeeOtherUser(args.UserId, targetUser.Id) 58 if err != nil { 59 return &model.CommandResponse{Text: args.T("api.command_groupmsg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} 60 } 61 62 if !canSee { 63 invalidUsernames = append(invalidUsernames, username) 64 continue 65 } 66 67 _, exists := targetUsers[targetUser.Id] 68 if !exists && targetUser.Id != args.UserId { 69 targetUsers[targetUser.Id] = targetUser 70 targetUsersSlice = append(targetUsersSlice, targetUser.Id) 71 } 72 } 73 74 if len(invalidUsernames) > 0 { 75 invalidUsersString := map[string]interface{}{ 76 "Users": "@" + strings.Join(invalidUsernames, ", @"), 77 } 78 return &model.CommandResponse{ 79 Text: args.T("api.command_groupmsg.invalid_user.app_error", len(invalidUsernames), invalidUsersString), 80 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 81 } 82 } 83 84 if len(targetUsersSlice) == 2 { 85 return app.GetCommandProvider("msg").DoCommand(a, args, fmt.Sprintf("%s %s", targetUsers[targetUsersSlice[1]].Username, parsedMessage)) 86 } 87 88 if len(targetUsersSlice) < model.CHANNEL_GROUP_MIN_USERS { 89 minUsers := map[string]interface{}{ 90 "MinUsers": model.CHANNEL_GROUP_MIN_USERS - 1, 91 } 92 return &model.CommandResponse{ 93 Text: args.T("api.command_groupmsg.min_users.app_error", minUsers), 94 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 95 } 96 } 97 98 if len(targetUsersSlice) > model.CHANNEL_GROUP_MAX_USERS { 99 maxUsers := map[string]interface{}{ 100 "MaxUsers": model.CHANNEL_GROUP_MAX_USERS - 1, 101 } 102 return &model.CommandResponse{ 103 Text: args.T("api.command_groupmsg.max_users.app_error", maxUsers), 104 ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, 105 } 106 } 107 108 var groupChannel *model.Channel 109 var channelErr *model.AppError 110 111 if a.HasPermissionTo(args.UserId, model.PERMISSION_CREATE_GROUP_CHANNEL) { 112 groupChannel, channelErr = a.CreateGroupChannel(targetUsersSlice, args.UserId) 113 if channelErr != nil { 114 mlog.Error(channelErr.Error()) 115 return &model.CommandResponse{Text: args.T("api.command_groupmsg.group_fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} 116 } 117 } else { 118 groupChannel, channelErr = a.GetGroupChannel(targetUsersSlice) 119 if channelErr != nil { 120 return &model.CommandResponse{Text: args.T("api.command_groupmsg.permission.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} 121 } 122 } 123 124 if len(parsedMessage) > 0 { 125 post := &model.Post{} 126 post.Message = parsedMessage 127 post.ChannelId = groupChannel.Id 128 post.UserId = args.UserId 129 if _, err := a.CreatePostMissingChannel(post, true); err != nil { 130 return &model.CommandResponse{Text: args.T("api.command_groupmsg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} 131 } 132 } 133 134 team, err := a.GetTeam(args.TeamId) 135 if err != nil { 136 return &model.CommandResponse{Text: args.T("api.command_groupmsg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} 137 } 138 139 return &model.CommandResponse{GotoLocation: args.SiteURL + "/" + team.Name + "/channels/" + groupChannel.Name, Text: "", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} 140 } 141 142 func groupMsgUsernames(message string) ([]string, string) { 143 result := []string{} 144 resultMessage := "" 145 for idx, part := range strings.Split(message, ",") { 146 clean := strings.TrimPrefix(strings.TrimSpace(part), "@") 147 split := strings.Fields(clean) 148 if len(split) > 0 { 149 result = append(result, split[0]) 150 } 151 if len(split) > 1 { 152 splitted := strings.SplitN(message, ",", idx+1) 153 resultMessage = strings.TrimPrefix(strings.TrimSpace(splitted[len(splitted)-1]), "@") 154 resultMessage = strings.TrimSpace(strings.TrimPrefix(resultMessage, split[0])) 155 break 156 } 157 } 158 return result, resultMessage 159 }