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 }