diff options
Diffstat (limited to 'api/post.go')
-rw-r--r-- | api/post.go | 116 |
1 files changed, 104 insertions, 12 deletions
diff --git a/api/post.go b/api/post.go index 5d1a04e00..c646b056a 100644 --- a/api/post.go +++ b/api/post.go @@ -21,6 +21,7 @@ import ( l4g "github.com/alecthomas/log4go" "github.com/gorilla/mux" + "github.com/mattermost/platform/einterfaces" "github.com/mattermost/platform/model" "github.com/mattermost/platform/store" "github.com/mattermost/platform/utils" @@ -132,7 +133,10 @@ func CreatePost(c *Context, post *model.Post, triggerWebhooks bool) (*model.Post } } - post.CreateAt = 0 + if post.CreateAt != 0 && !HasPermissionToContext(c, model.PERMISSION_MANAGE_SYSTEM) { + post.CreateAt = 0 + c.Err = nil + } post.Hashtags, _ = model.ParseHashtags(post.Message) @@ -143,6 +147,10 @@ func CreatePost(c *Context, post *model.Post, triggerWebhooks bool) (*model.Post rpost = result.Data.(*model.Post) } + if einterfaces.GetMetricsInterface() != nil { + einterfaces.GetMetricsInterface().IncrementPostCreate() + } + if len(post.FileIds) > 0 { // There's a rare bug where the client sends up duplicate FileIds so protect against that post.FileIds = utils.RemoveDuplicatesFromStringArray(post.FileIds) @@ -152,6 +160,10 @@ func CreatePost(c *Context, post *model.Post, triggerWebhooks bool) (*model.Post l4g.Error(utils.T("api.post.create_post.attach_files.error"), post.Id, post.FileIds, c.Session.UserId, result.Err) } } + + if einterfaces.GetMetricsInterface() != nil { + einterfaces.GetMetricsInterface().IncrementPostFileAttachment(len(post.FileIds)) + } } handlePostEvents(c, rpost, triggerWebhooks) @@ -463,7 +475,7 @@ func getMentionKeywordsInChannel(profiles map[string]*model.User) map[string][]s } // Add @channel and @all to keywords if user has them turned on - if profile.NotifyProps["channel"] == "true" { + if int64(len(profiles)) < *utils.Cfg.TeamSettings.MaxNotificationsPerChannel && profile.NotifyProps["channel"] == "true" { keywords["@channel"] = append(keywords["@channel"], profile.Id) keywords["@all"] = append(keywords["@all"], profile.Id) } @@ -474,11 +486,13 @@ func getMentionKeywordsInChannel(profiles map[string]*model.User) map[string][]s // Given a message and a map mapping mention keywords to the users who use them, returns a map of mentioned // users and a slice of potencial mention users not in the channel and whether or not @here was mentioned. -func getExplicitMentions(message string, keywords map[string][]string) (map[string]bool, []string, bool) { +func getExplicitMentions(message string, keywords map[string][]string) (map[string]bool, []string, bool, bool, bool) { mentioned := make(map[string]bool) potentialOthersMentioned := make([]string, 0) systemMentions := map[string]bool{"@here": true, "@channel": true, "@all": true} hereMentioned := false + allMentioned := false + channelMentioned := false addMentionedUsers := func(ids []string) { for _, id := range ids { @@ -493,6 +507,14 @@ func getExplicitMentions(message string, keywords map[string][]string) (map[stri hereMentioned = true } + if word == "@channel" { + channelMentioned = true + } + + if word == "@all" { + allMentioned = true + } + // Non-case-sensitive check for regular keys if ids, match := keywords[strings.ToLower(word)]; match { addMentionedUsers(ids) @@ -517,6 +539,14 @@ func getExplicitMentions(message string, keywords map[string][]string) (map[stri hereMentioned = true } + if splitWord == "@all" { + allMentioned = true + } + + if splitWord == "@channel" { + channelMentioned = true + } + // Non-case-sensitive check for regular keys if ids, match := keywords[strings.ToLower(splitWord)]; match { addMentionedUsers(ids) @@ -533,7 +563,7 @@ func getExplicitMentions(message string, keywords map[string][]string) (map[stri } } - return mentioned, potentialOthersMentioned, hereMentioned + return mentioned, potentialOthersMentioned, hereMentioned, channelMentioned, allMentioned } func sendNotifications(c *Context, post *model.Post, team *model.Team, channel *model.Channel) []string { @@ -557,6 +587,8 @@ func sendNotifications(c *Context, post *model.Post, team *model.Team, channel * mentionedUserIds := make(map[string]bool) allActivityPushUserIds := []string{} hereNotification := false + channelNotification := false + allNotification := false updateMentionChans := []store.StoreChannel{} if channel.Type == model.CHANNEL_DIRECT { @@ -572,7 +604,7 @@ func sendNotifications(c *Context, post *model.Post, team *model.Team, channel * keywords := getMentionKeywordsInChannel(profileMap) var potentialOtherMentions []string - mentionedUserIds, potentialOtherMentions, hereNotification = getExplicitMentions(post.Message, keywords) + mentionedUserIds, potentialOtherMentions, hereNotification, channelNotification, allNotification = getExplicitMentions(post.Message, keywords) // get users that have comment thread mentions enabled if len(post.RootId) > 0 { @@ -640,7 +672,13 @@ func sendNotifications(c *Context, post *model.Post, team *model.Team, channel * var status *model.Status var err *model.AppError if status, err = GetStatus(id); err != nil { - status = &model.Status{id, model.STATUS_OFFLINE, false, 0, ""} + status = &model.Status{ + UserId: id, + Status: model.STATUS_OFFLINE, + Manual: false, + LastActivityAt: 0, + ActiveChannel: "", + } } if userAllowsEmails && status.Status != model.STATUS_ONLINE { @@ -649,6 +687,46 @@ func sendNotifications(c *Context, post *model.Post, team *model.Team, channel * } } + // If the channel has more than 1K users then @here is disabled + if hereNotification && int64(len(profileMap)) > *utils.Cfg.TeamSettings.MaxNotificationsPerChannel { + hereNotification = false + SendEphemeralPost( + c.TeamId, + post.UserId, + &model.Post{ + ChannelId: post.ChannelId, + Message: utils.T("api.post.disabled_here", map[string]interface{}{"Users": *utils.Cfg.TeamSettings.MaxNotificationsPerChannel}), + CreateAt: post.CreateAt + 1, + }, + ) + } + + // If the channel has more than 1K users then @channel is disabled + if channelNotification && int64(len(profileMap)) > *utils.Cfg.TeamSettings.MaxNotificationsPerChannel { + SendEphemeralPost( + c.TeamId, + post.UserId, + &model.Post{ + ChannelId: post.ChannelId, + Message: utils.T("api.post.disabled_channel", map[string]interface{}{"Users": *utils.Cfg.TeamSettings.MaxNotificationsPerChannel}), + CreateAt: post.CreateAt + 1, + }, + ) + } + + // If the channel has more than 1K users then @all is disabled + if allNotification && int64(len(profileMap)) > *utils.Cfg.TeamSettings.MaxNotificationsPerChannel { + SendEphemeralPost( + c.TeamId, + post.UserId, + &model.Post{ + ChannelId: post.ChannelId, + Message: utils.T("api.post.disabled_all", map[string]interface{}{"Users": *utils.Cfg.TeamSettings.MaxNotificationsPerChannel}), + CreateAt: post.CreateAt + 1, + }, + ) + } + if hereNotification { if result := <-Srv.Store.Status().GetOnline(); result.Err != nil { l4g.Warn(utils.T("api.post.notification.here.warn"), result.Err) @@ -775,8 +853,11 @@ func sendNotificationEmail(c *Context, post *model.Post, user *model.User, chann } } - if !found { + if !found && len(teams) > 0 { team = teams[0] + } else { + // in case the user hasn't joined any teams we send them to the select_team page + team = &model.Team{Name: "select_team", DisplayName: utils.Cfg.TeamSettings.SiteName} } } } @@ -842,14 +923,17 @@ func sendNotificationEmail(c *Context, post *model.Post, user *model.User, chann "ChannelName": channelName, "Month": month, "Day": day, "Year": year} } - subjectPage := utils.NewHTMLTemplate("post_subject", user.Locale) - subjectPage.Props["Subject"] = userLocale(mailTemplate, mailParameters) - subjectPage.Props["SiteName"] = utils.Cfg.TeamSettings.SiteName + subject := fmt.Sprintf("[%v] %v", utils.Cfg.TeamSettings.SiteName, userLocale(mailTemplate, mailParameters)) bodyPage := utils.NewHTMLTemplate("post_body", user.Locale) bodyPage.Props["SiteURL"] = c.GetSiteURL() bodyPage.Props["PostMessage"] = getMessageForNotification(post, userLocale) - bodyPage.Props["TeamLink"] = teamURL + "/pl/" + post.Id + if team.Name != "select_team" { + bodyPage.Props["TeamLink"] = teamURL + "/pl/" + post.Id + } else { + bodyPage.Props["TeamLink"] = teamURL + } + bodyPage.Props["BodyText"] = bodyText bodyPage.Props["Button"] = userLocale("api.templates.post_body.button") bodyPage.Html["Info"] = template.HTML(userLocale("api.templates.post_body.info", @@ -857,9 +941,13 @@ func sendNotificationEmail(c *Context, post *model.Post, user *model.User, chann "Hour": fmt.Sprintf("%02d", tm.Hour()), "Minute": fmt.Sprintf("%02d", tm.Minute()), "TimeZone": zone, "Month": month, "Day": day})) - if err := utils.SendMail(user.Email, html.UnescapeString(subjectPage.Render()), bodyPage.Render()); err != nil { + if err := utils.SendMail(user.Email, html.UnescapeString(subject), bodyPage.Render()); err != nil { l4g.Error(utils.T("api.post.send_notifications_and_forget.send.error"), user.Email, err) } + + if einterfaces.GetMetricsInterface() != nil { + einterfaces.GetMetricsInterface().IncrementPostSentEmail() + } } func getMessageForNotification(post *model.Post, translateFunc i18n.TranslateFunc) string { @@ -922,6 +1010,7 @@ func sendPushNotification(post *model.Post, user *model.User, channel *model.Cha msg.Badge = int(badge.Data.(int64)) } msg.Type = model.PUSH_TYPE_MESSAGE + msg.TeamId = channel.TeamId msg.ChannelId = channel.Id msg.ChannelName = channel.Name @@ -949,6 +1038,9 @@ func sendPushNotification(post *model.Post, user *model.User, channel *model.Cha tmpMessage := *model.PushNotificationFromJson(strings.NewReader(msg.ToJson())) tmpMessage.SetDeviceIdAndPlatform(session.DeviceId) sendToPushProxy(tmpMessage) + if einterfaces.GetMetricsInterface() != nil { + einterfaces.GetMetricsInterface().IncrementPostSentPush() + } } } |