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  }