Some refactoring to make plugins easier.
- Refactored sound notification to make it a bit more generic - Split up onMessage
This commit is contained in:
parent
4ebed3c995
commit
cd731ed699
|
@ -196,7 +196,7 @@
|
|||
test_utils.openChatRoom('lounge', 'localhost', 'dummy');
|
||||
spyOn(converse, 'emit');
|
||||
converse.play_sounds = true;
|
||||
spyOn(converse, 'playNotification');
|
||||
spyOn(converse, 'notifyOfNewMessage');
|
||||
var view = this.chatboxviews.get('lounge@localhost');
|
||||
if (!view.$el.find('.chat-area').length) { view.renderChatArea(); }
|
||||
var text = 'This message will play a sound because it mentions dummy';
|
||||
|
@ -207,7 +207,7 @@
|
|||
type: 'groupchat'
|
||||
}).c('body').t(text);
|
||||
view.onChatRoomMessage(message.nodeTree);
|
||||
expect(converse.playNotification).toHaveBeenCalled();
|
||||
expect(converse.notifyOfNewMessage).toHaveBeenCalled();
|
||||
|
||||
text = "This message won't play a sound";
|
||||
message = $msg({
|
||||
|
@ -217,7 +217,7 @@
|
|||
type: 'groupchat'
|
||||
}).c('body').t(text);
|
||||
view.onChatRoomMessage(message.nodeTree);
|
||||
expect(converse.playNotification, 1);
|
||||
expect(converse.notifyOfNewMessage, 1);
|
||||
converse.play_sounds = false;
|
||||
|
||||
text = "This message won't play a sound because it is sent by dummy";
|
||||
|
@ -228,7 +228,7 @@
|
|||
type: 'groupchat'
|
||||
}).c('body').t(text);
|
||||
view.onChatRoomMessage(message.nodeTree);
|
||||
expect(converse.playNotification, 1);
|
||||
expect(converse.notifyOfNewMessage, 1);
|
||||
converse.play_sounds = false;
|
||||
}.bind(converse));
|
||||
|
||||
|
|
|
@ -88,6 +88,32 @@
|
|||
converse.OPENED = 'opened';
|
||||
converse.CLOSED = 'closed';
|
||||
|
||||
var KEY = {
|
||||
ENTER: 13,
|
||||
FORWARD_SLASH: 47
|
||||
};
|
||||
|
||||
var PRETTY_CONNECTION_STATUS = {
|
||||
0: 'ERROR',
|
||||
1: 'CONNECTING',
|
||||
2: 'CONNFAIL',
|
||||
3: 'AUTHENTICATING',
|
||||
4: 'AUTHFAIL',
|
||||
5: 'CONNECTED',
|
||||
6: 'DISCONNECTED',
|
||||
7: 'DISCONNECTING',
|
||||
8: 'ATTACHED',
|
||||
9: 'REDIRECT'
|
||||
};
|
||||
|
||||
// XEP-0085 Chat states
|
||||
// http://xmpp.org/extensions/xep-0085.html
|
||||
var INACTIVE = 'inactive';
|
||||
var ACTIVE = 'active';
|
||||
var COMPOSING = 'composing';
|
||||
var PAUSED = 'paused';
|
||||
var GONE = 'gone';
|
||||
|
||||
// TODO Refactor into external MAM plugin
|
||||
// XEP-0059 Result Set Management
|
||||
var RSM_ATTRIBUTES = ['max', 'first', 'last', 'after', 'before', 'index', 'count'];
|
||||
|
@ -174,6 +200,38 @@
|
|||
converse.connection.sendIQ(stanza, null, errback);
|
||||
};
|
||||
|
||||
|
||||
converse.isOnlyChatStateNotification = function ($msg) {
|
||||
// See XEP-0085 Chat State Notification
|
||||
return (
|
||||
$msg.find('body').length === 0 && (
|
||||
$msg.find(ACTIVE).length !== 0 ||
|
||||
$msg.find(COMPOSING).length !== 0 ||
|
||||
$msg.find(INACTIVE).length !== 0 ||
|
||||
$msg.find(PAUSED).length !== 0 ||
|
||||
$msg.find(GONE).length !== 0
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
converse.log = function (txt, level) {
|
||||
var logger;
|
||||
if (typeof console === "undefined" || typeof console.log === "undefined") {
|
||||
logger = { log: function () {}, error: function () {} };
|
||||
} else {
|
||||
logger = console;
|
||||
}
|
||||
if (converse.debug) {
|
||||
if (level === 'error') {
|
||||
logger.log('ERROR: '+txt);
|
||||
} else {
|
||||
logger.log(txt);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
converse.initialize = function (settings, callback) {
|
||||
"use strict";
|
||||
var converse = this;
|
||||
|
@ -203,33 +261,6 @@
|
|||
Strophe.addNamespace('RSM', 'http://jabber.org/protocol/rsm');
|
||||
Strophe.addNamespace('XFORM', 'jabber:x:data');
|
||||
|
||||
// Constants
|
||||
// ---------
|
||||
var KEY = {
|
||||
ENTER: 13,
|
||||
FORWARD_SLASH: 47
|
||||
};
|
||||
|
||||
var PRETTY_CONNECTION_STATUS = {
|
||||
0: 'ERROR',
|
||||
1: 'CONNECTING',
|
||||
2: 'CONNFAIL',
|
||||
3: 'AUTHENTICATING',
|
||||
4: 'AUTHFAIL',
|
||||
5: 'CONNECTED',
|
||||
6: 'DISCONNECTED',
|
||||
7: 'DISCONNECTING',
|
||||
8: 'ATTACHED',
|
||||
9: 'REDIRECT'
|
||||
};
|
||||
|
||||
// XEP-0085 Chat states
|
||||
// http://xmpp.org/extensions/xep-0085.html
|
||||
var INACTIVE = 'inactive';
|
||||
var ACTIVE = 'active';
|
||||
var COMPOSING = 'composing';
|
||||
var PAUSED = 'paused';
|
||||
var GONE = 'gone';
|
||||
this.TIMEOUTS = { // Set as module attr so that we can override in tests.
|
||||
'PAUSED': 20000,
|
||||
'INACTIVE': 90000
|
||||
|
@ -482,8 +513,24 @@
|
|||
$(window).on('click mousemove keypress focus'+unloadevent , this.onUserActivity.bind(this));
|
||||
window.setInterval(this.onEverySecond.bind(this), 1000);
|
||||
};
|
||||
|
||||
this.playNotification = function () {
|
||||
|
||||
this.shouldNotifyOfNewMessage = function ($message) {
|
||||
var $forwarded = $message.find('forwarded');
|
||||
if ($forwarded.length) {
|
||||
return false;
|
||||
}
|
||||
var is_me = Strophe.getBareJidFromJid($message.attr('from')) === converse.bare_jid;
|
||||
return !converse.isOnlyChatStateNotification($message) && !is_me;
|
||||
};
|
||||
|
||||
this.notifyOfNewMessage = function ($message) {
|
||||
/* Plays a sound to notify that a new message was recieved.
|
||||
*
|
||||
* Returns true if the notification was made and false otherwise.
|
||||
*/
|
||||
if (!this.shouldNotifyOfNewMessage($message)) {
|
||||
return false;
|
||||
}
|
||||
var audio;
|
||||
if (converse.play_sounds && typeof Audio !== "undefined") {
|
||||
audio = new Audio(converse.sounds_path+"msg_received.ogg");
|
||||
|
@ -494,6 +541,7 @@
|
|||
audio.play();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
this.giveFeedback = function (message, klass) {
|
||||
|
@ -508,22 +556,6 @@
|
|||
});
|
||||
};
|
||||
|
||||
this.log = function (txt, level) {
|
||||
var logger;
|
||||
if (typeof console === "undefined" || typeof console.log === "undefined") {
|
||||
logger = { log: function () {}, error: function () {} };
|
||||
} else {
|
||||
logger = console;
|
||||
}
|
||||
if (this.debug) {
|
||||
if (level === 'error') {
|
||||
logger.log('ERROR: '+txt);
|
||||
} else {
|
||||
logger.log(txt);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.rejectPresenceSubscription = function (jid, message) {
|
||||
/* Reject or cancel another user's subscription to our presence updates.
|
||||
* Parameters:
|
||||
|
@ -757,11 +789,11 @@
|
|||
}.bind(this));
|
||||
|
||||
$(window).on("blur focus", function (ev) {
|
||||
if ((this.windowState !== ev.type) && (ev.type === 'focus')) {
|
||||
if ((converse.windowState !== ev.type) && (ev.type === 'focus')) {
|
||||
converse.clearMsgCounter();
|
||||
}
|
||||
this.windowState = ev.type;
|
||||
}.bind(this));
|
||||
converse.windowState = ev.type;
|
||||
});
|
||||
|
||||
$(window).on("resize", _.debounce(function (ev) {
|
||||
this.chatboxviews.trimChats();
|
||||
|
@ -903,28 +935,6 @@
|
|||
});
|
||||
},
|
||||
|
||||
isOnlyChatStateNotification: function ($msg) {
|
||||
// See XEP-0085 Chat State Notification
|
||||
return (
|
||||
$msg.find('body').length === 0 && (
|
||||
$msg.find(ACTIVE).length !== 0 ||
|
||||
$msg.find(COMPOSING).length !== 0 ||
|
||||
$msg.find(INACTIVE).length !== 0 ||
|
||||
$msg.find(PAUSED).length !== 0 ||
|
||||
$msg.find(GONE).length !== 0
|
||||
)
|
||||
);
|
||||
},
|
||||
|
||||
shouldPlayNotification: function ($message) {
|
||||
var $forwarded = $message.find('forwarded');
|
||||
if ($forwarded.length) {
|
||||
return false;
|
||||
}
|
||||
var is_me = Strophe.getBareJidFromJid($message.attr('from')) === converse.bare_jid;
|
||||
return !this.isOnlyChatStateNotification($message) && !is_me;
|
||||
},
|
||||
|
||||
createMessage: function ($message, $delay, archive_id) {
|
||||
$delay = $delay || $message.find('delay');
|
||||
var body = $message.children('body').text(),
|
||||
|
@ -1348,6 +1358,29 @@
|
|||
return this.scrollDown();
|
||||
},
|
||||
|
||||
handleChatStateMessage: function (message) {
|
||||
if (message.get('chat_state') === COMPOSING) {
|
||||
this.showStatusNotification(message.get('fullname')+' '+__('is typing'));
|
||||
this.clear_status_timeout = window.setTimeout(this.clearStatusNotification.bind(this), 10000);
|
||||
} else if (message.get('chat_state') === PAUSED) {
|
||||
this.showStatusNotification(message.get('fullname')+' '+__('has stopped typing'));
|
||||
} else if (_.contains([INACTIVE, ACTIVE], message.get('chat_state'))) {
|
||||
this.$content.find('div.chat-event').remove();
|
||||
} else if (message.get('chat_state') === GONE) {
|
||||
this.showStatusNotification(message.get('fullname')+' '+__('has gone away'));
|
||||
}
|
||||
},
|
||||
|
||||
handleTextMessage: function (message) {
|
||||
this.showMessage(_.clone(message.attributes));
|
||||
if ((message.get('sender') !== 'me') && (converse.windowState === 'blur')) {
|
||||
converse.incrementMsgCounter();
|
||||
}
|
||||
if (!this.model.get('minimized') && !this.$el.is(':visible')) {
|
||||
this.show();
|
||||
}
|
||||
},
|
||||
|
||||
onMessageAdded: function (message) {
|
||||
/* Handler that gets called when a new message object is created.
|
||||
*
|
||||
|
@ -1359,28 +1392,9 @@
|
|||
delete this.clear_status_timeout;
|
||||
}
|
||||
if (!message.get('message')) {
|
||||
if (message.get('chat_state') === COMPOSING) {
|
||||
this.showStatusNotification(message.get('fullname')+' '+__('is typing'));
|
||||
this.clear_status_timeout = window.setTimeout(this.clearStatusNotification.bind(this), 10000);
|
||||
return;
|
||||
} else if (message.get('chat_state') === PAUSED) {
|
||||
this.showStatusNotification(message.get('fullname')+' '+__('has stopped typing'));
|
||||
return;
|
||||
} else if (_.contains([INACTIVE, ACTIVE], message.get('chat_state'))) {
|
||||
this.$content.find('div.chat-event').remove();
|
||||
return;
|
||||
} else if (message.get('chat_state') === GONE) {
|
||||
this.showStatusNotification(message.get('fullname')+' '+__('has gone away'));
|
||||
return;
|
||||
}
|
||||
this.handleChatStateMessage(message);
|
||||
} else {
|
||||
this.showMessage(_.clone(message.attributes));
|
||||
}
|
||||
if ((message.get('sender') !== 'me') && (converse.windowState === 'blur')) {
|
||||
converse.incrementMsgCounter();
|
||||
}
|
||||
if (!this.model.get('minimized') && !this.$el.is(':visible')) {
|
||||
this.show();
|
||||
this.handleTextMessage(message);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -1903,9 +1917,7 @@
|
|||
if (msgid && chatbox.messages.findWhere({msgid: msgid})) {
|
||||
return true; // We already have this message stored.
|
||||
}
|
||||
if (chatbox.shouldPlayNotification($message)) {
|
||||
converse.playNotification();
|
||||
}
|
||||
converse.notifyOfNewMessage($message);
|
||||
chatbox.createMessage($message, $delay, archive_id);
|
||||
converse.roster.addResource(contact_jid, resource);
|
||||
converse.emit('message', message);
|
||||
|
|
|
@ -916,7 +916,7 @@
|
|||
}
|
||||
this.model.createMessage($message, $delay, archive_id);
|
||||
if (!delayed && sender !== this.model.get('nick') && (new RegExp("\\b"+this.model.get('nick')+"\\b")).test(body)) {
|
||||
converse.playNotification();
|
||||
converse.notifyOfNewMessage();
|
||||
}
|
||||
if (sender !== this.model.get('nick')) {
|
||||
// We only emit an event if it's not our own message
|
||||
|
|
Loading…
Reference in New Issue
Block a user