diff options
-rw-r--r-- | api/post.go | 45 | ||||
-rw-r--r-- | api/web_team_hub.go | 3 | ||||
-rw-r--r-- | i18n/en.json | 10 | ||||
-rw-r--r-- | i18n/es.json | 10 | ||||
-rw-r--r-- | model/message.go | 1 | ||||
-rw-r--r-- | model/post.go | 12 | ||||
-rw-r--r-- | web/react/stores/socket_store.jsx | 1 | ||||
-rw-r--r-- | web/react/utils/constants.jsx | 3 |
8 files changed, 72 insertions, 13 deletions
diff --git a/api/post.go b/api/post.go index b72af7c48..ee2b9a4b2 100644 --- a/api/post.go +++ b/api/post.go @@ -15,6 +15,7 @@ import ( "net/url" "path/filepath" "regexp" + "sort" "strconv" "strings" "time" @@ -249,7 +250,7 @@ func handlePostEventsAndForget(c *Context, post *model.Post, triggerWebhooks boo } sendNotificationsAndForget(c, post, team, channel) - go checkForOutOfChannelMentions(post, channel) + go checkForOutOfChannelMentions(c, post, channel) var user *model.User if result := <-uchan; result.Err != nil { @@ -729,18 +730,52 @@ func updateMentionCountAndForget(channelId, userId string) { }() } -func checkForOutOfChannelMentions(post *model.Post, channel *model.Channel) { +func checkForOutOfChannelMentions(c *Context, post *model.Post, channel *model.Channel) { // don't check for out of channel mentions in direct channels if channel.Type == model.CHANNEL_DIRECT { return } mentioned := getOutOfChannelMentions(post, channel.TeamId) + if len(mentioned) == 0 { + return + } - // TODO come up with a way to alert the client of these - for _, user := range mentioned { - l4g.Debug("%v was mentioned and wasn't in the channel", user.Username) + usernames := make([]string, len(mentioned)) + for i, user := range mentioned { + usernames[i] = user.Username + } + sort.Strings(usernames) + + var messageText string + if len(usernames) == 1 { + messageText = c.T("api.post.check_for_out_of_channel_mentions.message.one", map[string]interface{}{ + "Username": usernames[0], + }) + } else { + messageText = c.T("api.post.check_for_out_of_channel_mentions.message.multiple", map[string]interface{}{ + "Usernames": strings.Join(usernames[:len(usernames)-1], ", "), + "LastUsername": usernames[len(usernames)-1], + }) } + + // create an ephemeral post that will be sent only to the sender of this original post and not stored in the DB + warningPost := model.Post{ + Id: model.NewId(), + ChannelId: post.ChannelId, + Message: messageText, + Type: model.POST_OUT_OF_CHANNEL_MENTION, + CreateAt: post.CreateAt + 1, + Ephemeral: true, + Props: model.StringInterface{}, + Filenames: []string{}, + } + + message := model.NewMessage(c.Session.TeamId, channel.Id, post.UserId, model.ACTION_EPHEMERAL_MESSAGE) + message.Add("post", warningPost.ToJson()) + message.Add("channel_type", channel.Type) + + PublishAndForget(message) } // Gets a list of users that were mentioned in a given post that aren't in the channel that the post was made in diff --git a/api/web_team_hub.go b/api/web_team_hub.go index 55300c828..9d1c56f15 100644 --- a/api/web_team_hub.go +++ b/api/web_team_hub.go @@ -101,6 +101,9 @@ func ShouldSendEvent(webCon *WebConn, msg *model.Message) bool { return false } else if msg.Action == model.ACTION_PREFERENCE_CHANGED { return false + } else if msg.Action == model.ACTION_EPHEMERAL_MESSAGE { + // For now, ephemeral messages are sent directly to individual users + return false } // Only report events to a user who is the subject of the event, or is in the channel of the event diff --git a/i18n/en.json b/i18n/en.json index e620a1f0d..8ffbc8b14 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -656,6 +656,14 @@ "translation": "Error getting access token from DB before deletion" }, { + "id": "api.post.check_for_out_of_channel_mentions.message.one", + "translation": "{{.Username}} was mentioned, but they do not belong to this channel." + }, + { + "id": "api.post.check_for_out_of_channel_mentions.message.multiple", + "translation": "{{.Usernames}} and {{.LastUsername}} were mentioned, but they do not belong to this channel." + }, + { "id": "api.post.create_post.bad_filename.error", "translation": "Bad filename discarded, filename=%v" }, @@ -3459,4 +3467,4 @@ "id": "web.watcher_fail.error", "translation": "Failed to add directory to watcher %v" } -]
\ No newline at end of file +] diff --git a/i18n/es.json b/i18n/es.json index 328571f3b..0dbcaeadf 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -656,6 +656,14 @@ "translation": "Error obteniendo el token de acceso desde la BD antes de ser eliminado" }, { + "id": "api.post.check_for_out_of_channel_mentions.message.one", + "translation": "{ .Username } was mentioned, but they do not belong to this channel." + }, + { + "id": "api.post.check_for_out_of_channel_mentions.message.multiple", + "translation": "{ .Usernames } and { .LastUsername} were mentioned, but they do not belong to this channel." + }, + { "id": "api.post.create_post.bad_filename.error", "translation": "Nombre errado de archivo descartado, archivo=%v" }, @@ -3459,4 +3467,4 @@ "id": "web.watcher_fail.error", "translation": "Falla al agregar el directorio a ser vigilado %v" } -]
\ No newline at end of file +] diff --git a/model/message.go b/model/message.go index 1cb350bbf..cce0ec094 100644 --- a/model/message.go +++ b/model/message.go @@ -18,6 +18,7 @@ const ( ACTION_USER_ADDED = "user_added" ACTION_USER_REMOVED = "user_removed" ACTION_PREFERENCE_CHANGED = "preference_changed" + ACTION_EPHEMERAL_MESSAGE = "ephemeral_message" ) type Message struct { diff --git a/model/post.go b/model/post.go index f9f5a4d1c..cc9b0bda4 100644 --- a/model/post.go +++ b/model/post.go @@ -10,11 +10,12 @@ import ( ) const ( - POST_SYSTEM_MESSAGE_PREFIX = "system_" - POST_DEFAULT = "" - POST_SLACK_ATTACHMENT = "slack_attachment" - POST_JOIN_LEAVE = "system_join_leave" - POST_HEADER_CHANGE = "system_header_change" + POST_SYSTEM_MESSAGE_PREFIX = "system_" + POST_DEFAULT = "" + POST_SLACK_ATTACHMENT = "slack_attachment" + POST_JOIN_LEAVE = "system_join_leave" + POST_HEADER_CHANGE = "system_header_change" + POST_OUT_OF_CHANNEL_MENTION = "system_out_of_channel_mention" ) type Post struct { @@ -33,6 +34,7 @@ type Post struct { Hashtags string `json:"hashtags"` Filenames StringArray `json:"filenames"` PendingPostId string `json:"pending_post_id" db:"-"` + Ephemeral bool `json:"ephemeral" db:"-"` } func (o *Post) ToJson() string { diff --git a/web/react/stores/socket_store.jsx b/web/react/stores/socket_store.jsx index 744c2c8e5..745b94313 100644 --- a/web/react/stores/socket_store.jsx +++ b/web/react/stores/socket_store.jsx @@ -109,6 +109,7 @@ class SocketStoreClass extends EventEmitter { handleMessage(msg) { switch (msg.action) { case SocketEvents.POSTED: + case SocketEvents.EPHEMERAL_MESSAGE: handleNewPostEvent(msg, this.translations); break; diff --git a/web/react/utils/constants.jsx b/web/react/utils/constants.jsx index 7d103a270..cfb33a79c 100644 --- a/web/react/utils/constants.jsx +++ b/web/react/utils/constants.jsx @@ -79,7 +79,8 @@ export default { USER_ADDED: 'user_added', USER_REMOVED: 'user_removed', TYPING: 'typing', - PREFERENCE_CHANGED: 'preference_changed' + PREFERENCE_CHANGED: 'preference_changed', + EPHEMERAL_MESSAGE: 'ephemeral_message' }, //SPECIAL_MENTIONS: ['all', 'channel'], |