kolab_chat: Add "you've been mentioned" notifications

This commit is contained in:
Aleksander Machniak 2018-07-09 10:34:29 +00:00
parent 732c2f8721
commit ac816424a4
3 changed files with 44 additions and 16 deletions

View file

@ -55,10 +55,16 @@ class kolab_chat_mattermost
$url .= '/api/v4/websocket'; $url .= '/api/v4/websocket';
} }
else if ($this->rc->action == 'index' && $this->rc->task == 'kolab-chat') { else if ($this->rc->action == 'index' && $this->rc->task == 'kolab-chat') {
if (($channel = rcube_utils::get_input_value('_channel', rcube_utils::INPUT_GET)) if ($channel = rcube_utils::get_input_value('_channel', rcube_utils::INPUT_GET)) {
&& ($channel = $this->get_channel($channel, true)) $team = rcube_utils::get_input_value('_team', rcube_utils::INPUT_GET);
) {
$url .= '/' . urlencode($channel['team_name']) . '/channels/' . urlencode($channel['id']); if (empty($team) && ($_channel = $this->get_channel($channel, true))) {
$team = $_channel['team_name'];
}
if ($channel && $team) {
$url .= '/' . urlencode($team) . '/channels/' . urlencode($channel);
}
} }
} }
@ -72,7 +78,7 @@ class kolab_chat_mattermost
{ {
if ($this->rc->task != 'kolab-chat') { if ($this->rc->task != 'kolab-chat') {
$this->plugin->include_script("js/mattermost.js"); $this->plugin->include_script("js/mattermost.js");
$this->plugin->add_label('openchat', 'directmessage'); $this->plugin->add_label('openchat', 'directmessage', 'mentionmessage');
} }
else if ($this->get_token()) { else if ($this->get_token()) {
rcube_utils::setcookie('MMUSERID', $_SESSION['mattermost'][0], 0, false); rcube_utils::setcookie('MMUSERID', $_SESSION['mattermost'][0], 0, false);
@ -86,8 +92,9 @@ class kolab_chat_mattermost
public function action() public function action()
{ {
$result = array( $result = array(
'url' => $this->url(true), 'url' => $this->url(true),
'token' => $this->get_token(), 'token' => $this->get_token(),
'user_id' => $this->get_user_id(),
); );
echo rcube_output::json_serialize($result); echo rcube_output::json_serialize($result);

View file

@ -278,23 +278,43 @@ function mattermost_websocket_init(url, token)
*/ */
function mattermost_event_handler(event) function mattermost_event_handler(event)
{ {
// We're interested only in direct messages for now var msg, type;
// Direct message notification
if (event.event == 'posted' && event.data.channel_type == 'D') { if (event.event == 'posted' && event.data.channel_type == 'D') {
var user = event.data.sender_name, msg = rcmail.gettext('kolab_chat.directmessage');
type = 'user';
}
// Mention notification
else if (event.event == 'posted' && String(event.data.mentions).indexOf(rcmail.env.mattermost_user) > 0) {
msg = rcmail.gettext('kolab_chat.mentionmessage');
type = 'channel';
}
if (msg) {
var link = $('<a>').text(rcmail.gettext('kolab_chat.openchat')),
user = event.data.sender_name,
channel = event.data.channel_display_name,
channel_id = event.broadcast.channel_id, channel_id = event.broadcast.channel_id,
// channel_name = event.data.channel_display_name, msg_id = 'chat-' + type + '-' + (type == 'channel' ? channel_id : user),
msg = rcmail.gettext('kolab_chat.directmessage').replace('$u', user), href = '?_task=kolab-chat&_channel=' + urlencode(channel_id);
link = $('<a>').text(rcmail.gettext('kolab_chat.openchat'))
.attr('href', '?_task=kolab-chat&_channel=' + urlencode(channel_id)); msg = msg.replace('$u', user).replace('$c', channel);
if (rcmail.env.kolab_chat_extwin) { if (rcmail.env.kolab_chat_extwin) {
link.attr('target', '_blank').attr('href', link.attr('href') + '&redirect=1'); link.attr('target', '_blank');
href += '&redirect=1';
} }
if (event.data.team_id) {
href += '&_team=' + urlencode(event.data.team_id);
}
link.attr('href', href);
msg = $('<p>').text(msg + ' ').append(link).html(); msg = $('<p>').text(msg + ' ').append(link).html();
// FIXME: Should we display it indefinitely? // FIXME: Should we display it indefinitely?
rcmail.display_message(msg, 'notice chat', 10 * 60 * 1000, 'chat-user-' + user); rcmail.display_message(msg, 'notice chat', 10 * 60 * 1000, msg_id);
} }
} }
@ -307,7 +327,7 @@ window.WebSocket && window.rcmail && rcmail.addEventListener('init', function()
success: function(data) { success: function(data) {
data = JSON.parse(data); data = JSON.parse(data);
if (data && data.token) { if (data && data.token) {
// rcmail.set_env({mattermost_url: data.url, mattermost_token: data.token}); rcmail.set_env({mattermost_url: data.url, mattermost_token: data.token, mattermost_user: data.user_id});
mattermost_websocket_init(data.url, data.token); mattermost_websocket_init(data.url, data.token);
} }
} }

View file

@ -11,4 +11,5 @@
$labels['chat'] = 'Chat'; $labels['chat'] = 'Chat';
$labels['showinextwin'] = 'Open chat application in a new window'; $labels['showinextwin'] = 'Open chat application in a new window';
$labels['directmessage'] = 'A direct message from $u.'; $labels['directmessage'] = 'A direct message from $u.';
$labels['mentionmessage'] = 'You have been mentioned by $u in $c.';
$labels['openchat'] = 'Open chat'; $labels['openchat'] = 'Open chat';