From 8a91235fb3cdc8d094dbc2eaa0d7baa447132b3c Mon Sep 17 00:00:00 2001 From: Debanshu Kundu Date: Mon, 31 Jul 2017 23:47:21 +0530 Subject: #4755 Combining consecutive user join/leave system messages to single message and few other changes. (#5945) fix 7 and 8 remove @ at "{username} joined the channel" refactor and update test --- app/notification.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'app/notification.go') diff --git a/app/notification.go b/app/notification.go index d145b21b3..e5a43b4e8 100644 --- a/app/notification.go +++ b/app/notification.go @@ -306,6 +306,91 @@ func SendNotifications(post *model.Post, team *model.Team, channel *model.Channe return mentionedUsersList, nil } +func SendNotificationsForSystemMessageAddRemove(user *model.User, otherUser *model.User, channel *model.Channel, post *model.Post) *model.AppError { + otherUserChannelMember, _ := GetChannelMember(channel.Id, otherUser.Id) + team, err := GetTeam(channel.TeamId) + if err != nil { + return err + } + + err = (<-Srv.Store.Channel().IncrementMentionCount(channel.Id, otherUser.Id)).Err + if err != nil { + return err + } + + if utils.Cfg.EmailSettings.SendEmailNotifications { + userAllowsEmails := otherUser.NotifyProps[model.EMAIL_NOTIFY_PROP] != "false" + if otherUserChannelMember != nil { + channelEmail, ok := otherUserChannelMember.NotifyProps[model.EMAIL_NOTIFY_PROP] + if ok && channelEmail != model.CHANNEL_NOTIFY_DEFAULT { + userAllowsEmails = channelEmail != "false" + } + } + + var status *model.Status + var err *model.AppError + if status, err = GetStatus(otherUser.Id); err != nil { + status = &model.Status{ + UserId: otherUser.Id, + Status: model.STATUS_OFFLINE, + Manual: false, + LastActivityAt: 0, + ActiveChannel: "", + } + } + + senderName := utils.T("system.message.name") + if userAllowsEmails && status.Status != model.STATUS_ONLINE && otherUser.DeleteAt == 0 { + if err = sendNotificationEmail(post, otherUser, channel, team, senderName, user); err != nil { + return err + } + } + } + + if otherUserChannelMember != nil { + sendPushNotifications := false + if *utils.Cfg.EmailSettings.SendPushNotifications { + pushServer := *utils.Cfg.EmailSettings.PushNotificationServer + if pushServer == model.MHPNS && (!utils.IsLicensed || !*utils.License.Features.MHPNS) { + l4g.Warn(utils.T("api.post.send_notifications_and_forget.push_notification.mhpnsWarn")) + sendPushNotifications = false + } else { + sendPushNotifications = true + } + } + + channelName := channel.DisplayName + senderUsername := user.Username + + if sendPushNotifications { + var status *model.Status + var err *model.AppError + if status, err = GetStatus(otherUser.Id); err != nil { + status = &model.Status{UserId: otherUser.Id, Status: model.STATUS_OFFLINE, Manual: false, LastActivityAt: 0, ActiveChannel: ""} + } + + if ShouldSendPushNotification(otherUser, otherUserChannelMember.NotifyProps, true, status, post) { + if err = sendPushNotification(post, otherUser, channel, senderUsername, channelName, true); err != nil { + return err + } + } + } + + message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_POSTED, "", post.ChannelId, "", nil) + message.Add("post", post.ToJson()) + message.Add("channel_type", channel.Type) + message.Add("channel_display_name", channelName) + message.Add("channel_name", channel.Name) + message.Add("sender_name", senderUsername) + message.Add("team_id", channel.TeamId) + message.Add("mentions", otherUser.Username) + + Publish(message) + } + + return nil +} + func sendNotificationEmail(post *model.Post, user *model.User, channel *model.Channel, team *model.Team, senderName string, sender *model.User) *model.AppError { if channel.IsGroupOrDirect() { if result := <-Srv.Store.Team().GetTeamsByUserId(user.Id); result.Err != nil { -- cgit v1.2.3-1-g7c22