Skip to content

Commit

Permalink
Fix #303: Rewrite /ping; domain&occupant support.
Browse files Browse the repository at this point in the history
The /ping command now pings a room occupant when given a nickname.
  • Loading branch information
cburschka committed Dec 25, 2015
1 parent 496b3c3 commit 24e8bf2
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 27 deletions.
33 changes: 16 additions & 17 deletions js/core/chat.js
Original file line number Diff line number Diff line change
Expand Up @@ -481,28 +481,27 @@ var chat = {
*/
ping: function(arg) {
arg = arg.trim();
if (!arg) return ui.messageAddInfo(strings.error.noArgument, 'error');
var room = xmpp.room.available[xmpp.room.current];
var roster = xmpp.roster[xmpp.room.current];
var absent = false;

if (!arg) arg = config.xmpp.domain;
else if (arg.indexOf('@') < 0 && roster) {
var user = roster[arg];
if (!user) return ui.messageAddInfo(strings.error.unknownUser, {nick: arg}, 'error');
if (!user.jid) return ui.messageAddInfo(strings.error.unknownJid, {user: user}, 'error');
arg = user.jid;
}

var jid = arg.indexOf('@') >= 0;
var target = arg && (jid ? {jid: arg} : {nick: arg});
var user = !jid && xmpp.roster[xmpp.room.current][arg] || target;
var time = (new Date()).getTime();

xmpp.ping(arg, function(stanza) {
xmpp.ping(target, function(stanza) {
var elapsed = ((new Date()).getTime() - time).toString();
ui.messageAddInfo(strings.info.pong, {jid: arg, delay: elapsed});
ui.messageAddInfo(strings.info.pong[+!!user], {user: user, delay: elapsed});
}, function(error) {
var elapsed = ((new Date()).getTime() - time).toString();
if (error) ui.messageAddInfo(strings.info.pongError, {jid: arg, delay: elapsed});
else ui.messageAddInfo(strings.error.pingTimeout, {jid: arg, delay: elapsed}, 'error');
if (error) {
if ($('item-not-found', error)) {
ui.messageAddInfo(strings.error.unknownUser, {nick: arg}, 'error');
}
else {
ui.messageAddInfo(strings.error.pingError, 'error');
}
}
else {
ui.messageAddInfo(strings.error.pingTimeout[+!!user], {user: user, delay: elapsed}, 'error');
}
}
);
},
Expand Down
12 changes: 9 additions & 3 deletions js/core/strings.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,10 @@ var strings = {
nickPrejoin: 'Your preferred nickname is now {nick}',
nickRegistered: 'Switching to registered nick {nick}.',
noUsers: 'No users are online in {room}.',
pong: 'Ping to {jid}: Pong ({delay} ms).',
pongError: 'Ping to {jid}: Target does not support ping ({delay} ms).',
pong: [
'Ping: Pong ({delay} ms).',
'Ping to {user}: Pong ({delay} ms).'
],
rejoinNick: 'Rejoining as {nick} ...',
roomConf: 'Room configuration of {room} has been altered.',
roomsAvailable: 'Available rooms: {raw:rooms}',
Expand Down Expand Up @@ -212,7 +214,11 @@ var strings = {
noArgument: 'This command requires more arguments.',
noCreate: 'You are not allowed to create rooms.',
noRoom: 'You are not in a room and did not specify one.',
pingTimeout: 'Ping to {jid} timed out ({delay} ms).',
pingError: 'Ping: Target does not support ping.',
pingTimeout: [
'Ping timed out ({delay} ms).',
'Ping to {user} timed out ({delay} ms).'
],
roomConf: 'Failed to configure {room}.',
roomConfDenied: 'You lack the authority to configure {room}.',
roomConfOptions: 'The allowed values for {field} are: {options}',
Expand Down
4 changes: 2 additions & 2 deletions js/core/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -456,8 +456,8 @@ var ui = {
ping: {
name: labels.ping,
icon: 'ping',
disabled: !c('ping') || !jid,
callback: function() { chat.commands.ping(jid); }
disabled: !c('ping'),
callback: function() { chat.commands.ping(nick || jid); }
}
}

Expand Down
10 changes: 5 additions & 5 deletions js/core/xmpp.js
Original file line number Diff line number Diff line change
Expand Up @@ -344,15 +344,15 @@ var xmpp = {
/**
* Send a ping.
*
* @param {string} to The ping target.
* @param {object} target The ping target.
* @param {function} success The success callback.
* @param {function} error The error callback. This will receive an error stanza
* if the server responded, or null if the ping timed out.
*/
ping: function(to, success, error) {
this.connection.sendIQ(this.iq('get', {jid: to})
.c('ping', {xmlns: 'urn:xmpp:ping'}
), success, error, 15000);
ping: function(target, success, error) {
this.connection.sendIQ(this.iq('get', target || {})
.c('ping', {xmlns: 'urn:xmpp:ping'}),
success, error, 15000);
},

/**
Expand Down

0 comments on commit 24e8bf2

Please sign in to comment.