2013-04-13 20:33:06 +00:00
|
|
|
"""
|
|
|
|
This plugin allows you to ping an entity.
|
|
|
|
|
|
|
|
Command
|
|
|
|
-------
|
|
|
|
|
|
|
|
.. glossary::
|
|
|
|
|
|
|
|
/ping
|
|
|
|
**Usage (globally):** ``/ping <jid>``
|
|
|
|
|
|
|
|
**Usage (in a MUC tab):** ``/ping <jid or nick>``
|
|
|
|
|
|
|
|
**Usage (in a conversation tab):** ``/ping [jid]``
|
|
|
|
|
|
|
|
Globally, you can do ``/ping jid@example.com`` to get a ping.
|
|
|
|
|
|
|
|
In a MUC, you can either do it to a JID or a nick (``/ping nick`` or ``/ping
|
|
|
|
jid@example.com``).
|
|
|
|
|
|
|
|
In a private or a direct conversation, you can do ``/ping`` to ping
|
|
|
|
the current interlocutor.
|
|
|
|
"""
|
|
|
|
|
2011-11-15 00:15:08 +00:00
|
|
|
from plugin import BasePlugin
|
|
|
|
from roster import roster
|
2013-02-01 16:14:13 +00:00
|
|
|
from common import safeJID
|
2011-11-15 00:15:08 +00:00
|
|
|
import tabs
|
2013-10-06 16:03:24 +00:00
|
|
|
import time
|
2011-11-15 00:15:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Plugin(BasePlugin):
|
|
|
|
def init(self):
|
|
|
|
self.core.xmpp.register_plugin('xep_0199')
|
2013-06-01 15:00:56 +00:00
|
|
|
self.core.xmpp.plugin['xep_0115'].update_caps()
|
2013-03-08 21:53:35 +00:00
|
|
|
self.api.add_command('ping', self.command_ping,
|
2013-03-01 18:25:31 +00:00
|
|
|
usage='<jid>',
|
2013-10-06 16:03:24 +00:00
|
|
|
help='Send an XMPP ping to jid (see XEP-0199).',
|
2013-03-01 18:25:31 +00:00
|
|
|
short='Send a ping',
|
|
|
|
completion=self.completion_ping)
|
2013-03-08 21:53:35 +00:00
|
|
|
self.api.add_tab_command(tabs.MucTab, 'ping', self.command_muc_ping,
|
2013-03-01 18:25:31 +00:00
|
|
|
usage='<jid|nick>',
|
2013-10-06 16:03:24 +00:00
|
|
|
help='Send an XMPP ping to jid or nick (see XEP-0199).',
|
2013-03-01 18:25:31 +00:00
|
|
|
short='Send a ping.',
|
|
|
|
completion=self.completion_muc_ping)
|
|
|
|
for _class in (tabs.PrivateTab, tabs.ConversationTab):
|
2013-03-08 21:53:35 +00:00
|
|
|
self.api.add_tab_command(_class, 'ping', self.command_private_ping,
|
2013-03-01 18:25:31 +00:00
|
|
|
usage='[jid]',
|
2013-10-06 16:03:24 +00:00
|
|
|
help='Send an XMPP ping to the current interlocutor or the given JID.',
|
2013-03-01 18:25:31 +00:00
|
|
|
short='Send a ping',
|
|
|
|
completion=self.completion_ping)
|
2011-11-15 00:15:08 +00:00
|
|
|
|
|
|
|
def command_ping(self, arg):
|
|
|
|
if not arg:
|
2013-10-06 16:03:24 +00:00
|
|
|
return self.core.command_help('ping')
|
2013-02-01 16:14:13 +00:00
|
|
|
jid = safeJID(arg)
|
2013-10-06 16:03:24 +00:00
|
|
|
start = time.time()
|
|
|
|
def callback(iq):
|
|
|
|
delay = time.time() - start
|
|
|
|
if iq['type'] == 'error' and iq['error']['condition'] in ('remote-server-timeout', 'remote-server-not-found'):
|
|
|
|
self.api.information('%s did not respond to ping' % jid, 'Info')
|
|
|
|
else:
|
|
|
|
self.api.information('%s responded to ping after %s s' % (jid, round(delay, 4)), 'Info')
|
|
|
|
|
|
|
|
self.core.xmpp.plugin['xep_0199'].send_ping(jid=jid, callback=callback)
|
2011-11-15 00:15:08 +00:00
|
|
|
|
|
|
|
def completion_muc_ping(self, the_input):
|
2013-03-08 21:53:35 +00:00
|
|
|
users = [user.nick for user in self.api.current_tab().users]
|
2011-11-15 00:15:08 +00:00
|
|
|
l = [contact.bare_jid for contact in roster.get_contacts()]
|
|
|
|
users.extend(l)
|
2013-03-01 01:05:18 +00:00
|
|
|
return the_input.auto_completion(users, '', quotify=False)
|
2011-11-15 00:15:08 +00:00
|
|
|
|
|
|
|
def command_private_ping(self, arg):
|
2013-03-01 01:05:18 +00:00
|
|
|
if arg:
|
2013-03-01 11:25:21 +00:00
|
|
|
return self.command_ping(arg)
|
2013-03-08 21:53:35 +00:00
|
|
|
self.command_ping(self.api.current_tab().get_name())
|
2011-11-15 00:15:08 +00:00
|
|
|
|
|
|
|
def command_muc_ping(self, arg):
|
2013-03-01 01:05:18 +00:00
|
|
|
if not arg.strip():
|
2011-11-15 00:15:08 +00:00
|
|
|
return
|
2013-03-08 21:53:35 +00:00
|
|
|
user = self.api.current_tab().get_user_by_name(arg)
|
2011-11-15 00:15:08 +00:00
|
|
|
if user:
|
2013-03-08 21:53:35 +00:00
|
|
|
jid = safeJID(self.api.current_tab().get_name())
|
2011-11-15 00:15:08 +00:00
|
|
|
jid.resource = user.nick
|
|
|
|
else:
|
2013-03-01 01:05:18 +00:00
|
|
|
jid = safeJID(arg)
|
2011-11-15 00:15:08 +00:00
|
|
|
self.command_ping(jid.full)
|
|
|
|
|
|
|
|
def completion_ping(self, the_input):
|
|
|
|
l = [contact.bare_jid for contact in roster.get_contacts()]
|
2013-03-01 01:05:18 +00:00
|
|
|
return the_input.auto_completion(l, '', quotify=False)
|
2011-11-15 00:15:08 +00:00
|
|
|
|