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 }