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