summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/post.go45
-rw-r--r--api/web_team_hub.go3
-rw-r--r--i18n/en.json10
-rw-r--r--i18n/es.json10
-rw-r--r--model/message.go1
-rw-r--r--model/post.go12
-rw-r--r--web/react/stores/socket_store.jsx1
-rw-r--r--web/react/utils/constants.jsx3
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'],