github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/app/slashcommands/command_invite.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  	"context"
     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  )
    16  
    17  type InviteProvider struct {
    18  }
    19  
    20  const (
    21  	CmdInvite = "invite"
    22  )
    23  
    24  func init() {
    25  	app.RegisterCommandProvider(&InviteProvider{})
    26  }
    27  
    28  func (*InviteProvider) GetTrigger() string {
    29  	return CmdInvite
    30  }
    31  
    32  func (*InviteProvider) GetCommand(a *app.App, T i18n.TranslateFunc) *model.Command {
    33  	return &model.Command{
    34  		Trigger:          CmdInvite,
    35  		AutoComplete:     true,
    36  		AutoCompleteDesc: T("api.command_invite.desc"),
    37  		AutoCompleteHint: T("api.command_invite.hint"),
    38  		DisplayName:      T("api.command_invite.name"),
    39  	}
    40  }
    41  
    42  func (*InviteProvider) DoCommand(a *app.App, c *request.Context, args *model.CommandArgs, message string) *model.CommandResponse {
    43  	if message == "" {
    44  		return &model.CommandResponse{
    45  			Text:         args.T("api.command_invite.missing_message.app_error"),
    46  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    47  		}
    48  	}
    49  
    50  	splitMessage := strings.SplitN(message, " ", 2)
    51  	targetUsername := splitMessage[0]
    52  	targetUsername = strings.TrimPrefix(targetUsername, "@")
    53  
    54  	userProfile, nErr := a.Srv().Store.User().GetByUsername(targetUsername)
    55  	if nErr != nil {
    56  		mlog.Error(nErr.Error())
    57  		return &model.CommandResponse{
    58  			Text:         args.T("api.command_invite.missing_user.app_error"),
    59  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    60  		}
    61  	}
    62  
    63  	if userProfile.DeleteAt != 0 {
    64  		return &model.CommandResponse{
    65  			Text:         args.T("api.command_invite.missing_user.app_error"),
    66  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    67  		}
    68  	}
    69  
    70  	var channelToJoin *model.Channel
    71  	var err *model.AppError
    72  	// User set a channel to add the invited user
    73  	if len(splitMessage) > 1 && splitMessage[1] != "" {
    74  		targetChannelName := strings.TrimPrefix(strings.TrimSpace(splitMessage[1]), "~")
    75  
    76  		if channelToJoin, err = a.GetChannelByName(targetChannelName, args.TeamId, false); err != nil {
    77  			return &model.CommandResponse{
    78  				Text: args.T("api.command_invite.channel.error", map[string]interface{}{
    79  					"Channel": targetChannelName,
    80  				}),
    81  				ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    82  			}
    83  		}
    84  	} else {
    85  		channelToJoin, err = a.GetChannel(args.ChannelId)
    86  		if err != nil {
    87  			return &model.CommandResponse{
    88  				Text:         args.T("api.command_invite.channel.app_error"),
    89  				ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    90  			}
    91  		}
    92  	}
    93  
    94  	// Permissions Check
    95  	switch channelToJoin.Type {
    96  	case model.CHANNEL_OPEN:
    97  		if !a.HasPermissionToChannel(args.UserId, channelToJoin.Id, model.PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS) {
    98  			return &model.CommandResponse{
    99  				Text: args.T("api.command_invite.permission.app_error", map[string]interface{}{
   100  					"User":    userProfile.Username,
   101  					"Channel": channelToJoin.Name,
   102  				}),
   103  				ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   104  			}
   105  		}
   106  	case model.CHANNEL_PRIVATE:
   107  		if !a.HasPermissionToChannel(args.UserId, channelToJoin.Id, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS) {
   108  			if _, err = a.GetChannelMember(context.Background(), channelToJoin.Id, args.UserId); err == nil {
   109  				// User doing the inviting is a member of the channel.
   110  				return &model.CommandResponse{
   111  					Text: args.T("api.command_invite.permission.app_error", map[string]interface{}{
   112  						"User":    userProfile.Username,
   113  						"Channel": channelToJoin.Name,
   114  					}),
   115  					ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   116  				}
   117  			}
   118  			// User doing the inviting is *not* a member of the channel.
   119  			return &model.CommandResponse{
   120  				Text: args.T("api.command_invite.private_channel.app_error", map[string]interface{}{
   121  					"Channel": channelToJoin.Name,
   122  				}),
   123  				ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   124  			}
   125  		}
   126  	default:
   127  		return &model.CommandResponse{
   128  			Text:         args.T("api.command_invite.directchannel.app_error"),
   129  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   130  		}
   131  	}
   132  
   133  	// Check if user is already in the channel
   134  	_, err = a.GetChannelMember(context.Background(), channelToJoin.Id, userProfile.Id)
   135  	if err == nil {
   136  		return &model.CommandResponse{
   137  			Text: args.T("api.command_invite.user_already_in_channel.app_error", map[string]interface{}{
   138  				"User": userProfile.Username,
   139  			}),
   140  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   141  		}
   142  	}
   143  
   144  	if _, err := a.AddChannelMember(c, userProfile.Id, channelToJoin, app.ChannelMemberOpts{
   145  		UserRequestorID: args.UserId,
   146  	}); err != nil {
   147  		var text string
   148  		if err.Id == "api.channel.add_members.user_denied" {
   149  			text = args.T("api.command_invite.group_constrained_user_denied")
   150  		} else if err.Id == "app.team.get_member.missing.app_error" ||
   151  			err.Id == "api.channel.add_user.to.channel.failed.deleted.app_error" {
   152  			text = args.T("api.command_invite.user_not_in_team.app_error", map[string]interface{}{
   153  				"Username": userProfile.Username,
   154  			})
   155  		} else {
   156  			text = args.T("api.command_invite.fail.app_error")
   157  		}
   158  		return &model.CommandResponse{
   159  			Text:         text,
   160  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   161  		}
   162  	}
   163  
   164  	if args.ChannelId != channelToJoin.Id {
   165  		return &model.CommandResponse{
   166  			Text: args.T("api.command_invite.success", map[string]interface{}{
   167  				"User":    userProfile.Username,
   168  				"Channel": channelToJoin.Name,
   169  			}),
   170  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   171  		}
   172  	}
   173  
   174  	return &model.CommandResponse{}
   175  }