github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/command_msg.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"errors"
     8  	"strings"
     9  
    10  	goi18n "github.com/mattermost/go-i18n/i18n"
    11  	"github.com/mattermost/mattermost-server/v5/mlog"
    12  	"github.com/mattermost/mattermost-server/v5/model"
    13  	"github.com/mattermost/mattermost-server/v5/store"
    14  )
    15  
    16  type msgProvider struct {
    17  }
    18  
    19  const (
    20  	CMD_MSG = "msg"
    21  )
    22  
    23  func init() {
    24  	RegisterCommandProvider(&msgProvider{})
    25  }
    26  
    27  func (me *msgProvider) GetTrigger() string {
    28  	return CMD_MSG
    29  }
    30  
    31  func (me *msgProvider) GetCommand(a *App, T goi18n.TranslateFunc) *model.Command {
    32  	return &model.Command{
    33  		Trigger:          CMD_MSG,
    34  		AutoComplete:     true,
    35  		AutoCompleteDesc: T("api.command_msg.desc"),
    36  		AutoCompleteHint: T("api.command_msg.hint"),
    37  		DisplayName:      T("api.command_msg.name"),
    38  	}
    39  }
    40  
    41  func (me *msgProvider) DoCommand(a *App, args *model.CommandArgs, message string) *model.CommandResponse {
    42  	splitMessage := strings.SplitN(message, " ", 2)
    43  
    44  	parsedMessage := ""
    45  	targetUsername := ""
    46  
    47  	if len(splitMessage) > 1 {
    48  		parsedMessage = strings.SplitN(message, " ", 2)[1]
    49  	}
    50  	targetUsername = strings.SplitN(message, " ", 2)[0]
    51  	targetUsername = strings.TrimPrefix(targetUsername, "@")
    52  
    53  	userProfile, err := a.Srv().Store.User().GetByUsername(targetUsername)
    54  	if err != nil {
    55  		mlog.Error(err.Error())
    56  		return &model.CommandResponse{Text: args.T("api.command_msg.missing.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    57  	}
    58  
    59  	if userProfile.Id == args.UserId {
    60  		return &model.CommandResponse{Text: args.T("api.command_msg.missing.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    61  	}
    62  
    63  	canSee, err := a.UserCanSeeOtherUser(args.UserId, userProfile.Id)
    64  	if err != nil {
    65  		mlog.Error(err.Error())
    66  		return &model.CommandResponse{Text: args.T("api.command_msg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    67  	}
    68  	if !canSee {
    69  		return &model.CommandResponse{Text: args.T("api.command_msg.missing.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    70  	}
    71  
    72  	// Find the channel based on this user
    73  	channelName := model.GetDMNameFromIds(args.UserId, userProfile.Id)
    74  
    75  	targetChannelId := ""
    76  	if channel, channelErr := a.Srv().Store.Channel().GetByName(args.TeamId, channelName, true); channelErr != nil {
    77  		var nfErr *store.ErrNotFound
    78  		if errors.As(channelErr, &nfErr) {
    79  			if !a.HasPermissionTo(args.UserId, model.PERMISSION_CREATE_DIRECT_CHANNEL) {
    80  				return &model.CommandResponse{Text: args.T("api.command_msg.permission.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    81  			}
    82  
    83  			var directChannel *model.Channel
    84  			if directChannel, err = a.GetOrCreateDirectChannel(args.UserId, userProfile.Id); err != nil {
    85  				mlog.Error(err.Error())
    86  				return &model.CommandResponse{Text: args.T("api.command_msg.dm_fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    87  			} else {
    88  				targetChannelId = directChannel.Id
    89  			}
    90  		} else {
    91  			mlog.Error(channelErr.Error())
    92  			return &model.CommandResponse{Text: args.T("api.command_msg.dm_fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    93  		}
    94  	} else {
    95  		targetChannelId = channel.Id
    96  	}
    97  
    98  	if len(parsedMessage) > 0 {
    99  		post := &model.Post{}
   100  		post.Message = parsedMessage
   101  		post.ChannelId = targetChannelId
   102  		post.UserId = args.UserId
   103  		if _, err = a.CreatePostMissingChannel(post, true); err != nil {
   104  			return &model.CommandResponse{Text: args.T("api.command_msg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
   105  		}
   106  	}
   107  
   108  	team, err := a.GetTeam(args.TeamId)
   109  	if err != nil {
   110  		return &model.CommandResponse{Text: args.T("api.command_msg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
   111  	}
   112  
   113  	return &model.CommandResponse{GotoLocation: args.SiteURL + "/" + team.Name + "/channels/" + channelName, Text: "", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
   114  }