github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/command_mute.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  	"strings"
     8  
     9  	goi18n "github.com/mattermost/go-i18n/i18n"
    10  	"github.com/mattermost/mattermost-server/v5/model"
    11  )
    12  
    13  type MuteProvider struct {
    14  }
    15  
    16  const (
    17  	CMD_MUTE = "mute"
    18  )
    19  
    20  func init() {
    21  	RegisterCommandProvider(&MuteProvider{})
    22  }
    23  
    24  func (me *MuteProvider) GetTrigger() string {
    25  	return CMD_MUTE
    26  }
    27  
    28  func (me *MuteProvider) GetCommand(a *App, T goi18n.TranslateFunc) *model.Command {
    29  	return &model.Command{
    30  		Trigger:          CMD_MUTE,
    31  		AutoComplete:     true,
    32  		AutoCompleteDesc: T("api.command_mute.desc"),
    33  		AutoCompleteHint: T("api.command_mute.hint"),
    34  		DisplayName:      T("api.command_mute.name"),
    35  	}
    36  }
    37  
    38  func (me *MuteProvider) DoCommand(a *App, args *model.CommandArgs, message string) *model.CommandResponse {
    39  	var channel *model.Channel
    40  	var noChannelErr *model.AppError
    41  
    42  	if channel, noChannelErr = a.GetChannel(args.ChannelId); noChannelErr != nil {
    43  		return &model.CommandResponse{Text: args.T("api.command_mute.no_channel.error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    44  	}
    45  
    46  	channelName := ""
    47  	splitMessage := strings.Split(message, " ")
    48  	// Overwrite channel with channel-handle if set
    49  	if strings.HasPrefix(message, "~") {
    50  		channelName = splitMessage[0][1:]
    51  	} else {
    52  		channelName = splitMessage[0]
    53  	}
    54  
    55  	if len(channelName) > 0 && len(message) > 0 {
    56  		channel, _ = a.Srv().Store.Channel().GetByName(channel.TeamId, channelName, true)
    57  
    58  		if channel == nil {
    59  			return &model.CommandResponse{Text: args.T("api.command_mute.error", map[string]interface{}{"Channel": channelName}), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    60  		}
    61  	}
    62  
    63  	channelMember := a.ToggleMuteChannel(channel.Id, args.UserId)
    64  	if channelMember == nil {
    65  		return &model.CommandResponse{Text: args.T("api.command_mute.not_member.error", map[string]interface{}{"Channel": channelName}), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    66  	}
    67  
    68  	// Invalidate cache to allow cache lookups while sending notifications
    69  	a.Srv().Store.Channel().InvalidateCacheForChannelMembersNotifyProps(channel.Id)
    70  
    71  	// Direct and Group messages won't have a nice channel title, omit it
    72  	if channel.Type == model.CHANNEL_DIRECT || channel.Type == model.CHANNEL_GROUP {
    73  		if channelMember.NotifyProps[model.MARK_UNREAD_NOTIFY_PROP] == model.CHANNEL_NOTIFY_MENTION {
    74  			publishChannelMemberEvt(a, channelMember, args.UserId)
    75  			return &model.CommandResponse{Text: args.T("api.command_mute.success_mute_direct_msg"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    76  		} else {
    77  			publishChannelMemberEvt(a, channelMember, args.UserId)
    78  			return &model.CommandResponse{Text: args.T("api.command_mute.success_unmute_direct_msg"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    79  		}
    80  	}
    81  
    82  	if channelMember.NotifyProps[model.MARK_UNREAD_NOTIFY_PROP] == model.CHANNEL_NOTIFY_MENTION {
    83  		publishChannelMemberEvt(a, channelMember, args.UserId)
    84  		return &model.CommandResponse{Text: args.T("api.command_mute.success_mute", map[string]interface{}{"Channel": channel.DisplayName}), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    85  	} else {
    86  		publishChannelMemberEvt(a, channelMember, args.UserId)
    87  		return &model.CommandResponse{Text: args.T("api.command_mute.success_unmute", map[string]interface{}{"Channel": channel.DisplayName}), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
    88  	}
    89  }
    90  
    91  func publishChannelMemberEvt(a *App, channelMember *model.ChannelMember, userId string) {
    92  	evt := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED, "", "", userId, nil)
    93  	evt.Add("channelMember", channelMember.ToJson())
    94  	a.Publish(evt)
    95  }