github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/app/slashcommands/command_channel_header.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  
     9  	"github.com/masterhung0112/hk_server/v5/app"
    10  	"github.com/masterhung0112/hk_server/v5/app/request"
    11  	"github.com/masterhung0112/hk_server/v5/model"
    12  	"github.com/masterhung0112/hk_server/v5/shared/i18n"
    13  )
    14  
    15  type HeaderProvider struct {
    16  }
    17  
    18  const (
    19  	CmdHeader = "header"
    20  )
    21  
    22  func init() {
    23  	app.RegisterCommandProvider(&HeaderProvider{})
    24  }
    25  
    26  func (*HeaderProvider) GetTrigger() string {
    27  	return CmdHeader
    28  }
    29  
    30  func (*HeaderProvider) GetCommand(a *app.App, T i18n.TranslateFunc) *model.Command {
    31  	return &model.Command{
    32  		Trigger:          CmdHeader,
    33  		AutoComplete:     true,
    34  		AutoCompleteDesc: T("api.command_channel_header.desc"),
    35  		AutoCompleteHint: T("api.command_channel_header.hint"),
    36  		DisplayName:      T("api.command_channel_header.name"),
    37  	}
    38  }
    39  
    40  func (*HeaderProvider) DoCommand(a *app.App, c *request.Context, args *model.CommandArgs, message string) *model.CommandResponse {
    41  	channel, err := a.GetChannel(args.ChannelId)
    42  	if err != nil {
    43  		return &model.CommandResponse{
    44  			Text:         args.T("api.command_channel_header.channel.app_error"),
    45  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    46  		}
    47  	}
    48  
    49  	switch channel.Type {
    50  	case model.CHANNEL_OPEN:
    51  		if !a.HasPermissionToChannel(args.UserId, args.ChannelId, model.PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES) {
    52  			return &model.CommandResponse{
    53  				Text:         args.T("api.command_channel_header.permission.app_error"),
    54  				ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    55  			}
    56  		}
    57  
    58  	case model.CHANNEL_PRIVATE:
    59  		if !a.HasPermissionToChannel(args.UserId, args.ChannelId, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_PROPERTIES) {
    60  			return &model.CommandResponse{
    61  				Text:         args.T("api.command_channel_header.permission.app_error"),
    62  				ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    63  			}
    64  		}
    65  
    66  	case model.CHANNEL_GROUP, model.CHANNEL_DIRECT:
    67  		// Modifying the header is not linked to any specific permission for group/dm channels, so just check for membership.
    68  		var channelMember *model.ChannelMember
    69  		channelMember, err = a.GetChannelMember(context.Background(), args.ChannelId, args.UserId)
    70  		if err != nil || channelMember == nil {
    71  			return &model.CommandResponse{
    72  				Text:         args.T("api.command_channel_header.permission.app_error"),
    73  				ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    74  			}
    75  		}
    76  
    77  	default:
    78  		return &model.CommandResponse{
    79  			Text:         args.T("api.command_channel_header.permission.app_error"),
    80  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    81  		}
    82  	}
    83  
    84  	if message == "" {
    85  		return &model.CommandResponse{
    86  			Text:         args.T("api.command_channel_header.message.app_error"),
    87  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
    88  		}
    89  	}
    90  
    91  	patch := &model.ChannelPatch{
    92  		Header: new(string),
    93  	}
    94  	*patch.Header = message
    95  
    96  	_, err = a.PatchChannel(c, channel, patch, args.UserId)
    97  	if err != nil {
    98  		text := args.T("api.command_channel_header.update_channel.app_error")
    99  		if err.Id == "model.channel.is_valid.header.app_error" {
   100  			text = args.T("api.command_channel_header.update_channel.max_length", map[string]interface{}{
   101  				"MaxLength": model.CHANNEL_HEADER_MAX_RUNES,
   102  			})
   103  		}
   104  
   105  		return &model.CommandResponse{
   106  			Text:         text,
   107  			ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL,
   108  		}
   109  	}
   110  
   111  	return &model.CommandResponse{}
   112  }