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