Add the /ad-hoc <jid> command to list commands of the given jid

This commit is contained in:
Florent Le Coz 2014-05-04 18:23:10 +02:00
parent 36620901e8
commit bbc55fa40e
5 changed files with 79 additions and 0 deletions

View file

@ -79,6 +79,7 @@ class Connection(sleekxmpp.ClientXMPP):
self.register_plugin('xep_0030')
self.register_plugin('xep_0045')
self.register_plugin('xep_0048')
self.register_plugin('xep_0050')
self.register_plugin('xep_0060')
self.register_plugin('xep_0066')
self.register_plugin('xep_0071')

View file

@ -940,6 +940,22 @@ def command_xml_tab(self, arg=''):
tab = tabs.XMLTab()
self.add_tab(tab, True)
def command_adhoc(self, arg):
arg = arg.split()
if len(arg) > 1:
return self.command_help('list')
elif arg:
jid = safeJID(arg[0]).server
else:
return self.information('Please provide a jid', 'Error')
list_tab = tabs.AdhocCommandsListTab(jid)
self.add_tab(list_tab, True)
cb = list_tab.on_list_received
self.xmpp.plugin['xep_0050'].get_commands(jid=jid,
local=False,
block=False,
callback=cb)
def command_self(self, arg=None):
"""
/self

View file

@ -1809,6 +1809,9 @@ class Core(object):
desc=_('Informs you of the last activity of a JID.'),
shortdesc=_('Get the activity of someone.'),
completion=self.completion_last_activity)
self.register_command('ad-hoc', self.command_adhoc,
usage='<jid>',
shortdesc=_('List available ad-hoc commands on the given jid'))
if config.get('enable_user_activity', True):
self.register_command('activity', self.command_activity,
@ -1921,6 +1924,7 @@ class Core(object):
command_plugins = commands.command_plugins
command_message = commands.command_message
command_xml_tab = commands.command_xml_tab
command_adhoc = commands.command_adhoc
command_self = commands.command_self
completion_help = completions.completion_help
completion_status = completions.completion_status

View file

@ -8,4 +8,5 @@ from . conversationtab import ConversationTab, StaticConversationTab,\
from . xmltab import XMLTab
from . listtab import ListTab
from . muclisttab import MucListTab
from . adhoc_commands_list import AdhocCommandsListTab
from . data_forms import DataFormsTab

View file

@ -0,0 +1,57 @@
"""
A tab listing the ad-hoc commands on a specific JID. The user can
select one of them and start executing it, or just close the tab and do
nothing.
"""
from gettext import gettext as _
import logging
log = logging.getLogger(__name__)
from . import ListTab
from sleekxmpp.plugins.xep_0030.stanza.items import DiscoItem
class AdhocCommandsListTab(ListTab):
plugin_commands = {}
plugin_keys = {}
def __init__(self, jid):
ListTab.__init__(self, jid,
"“Enter”: execute selected command.",
_('Ad-hoc commands of JID %s (Loading)') % jid,
(('Node', 0), ('Description', 1)))
self.key_func['^M'] = self.execute_selected_command
def execute_selected_command(self):
row = self.listview.get_selected_row()
log.debug("Executing command %s", row)
def get_columns_sizes(self):
return {'Node': int(self.width * 2 / 8),
'Description': int(self.width * 6 / 8)}
def on_list_received(self, iq):
"""
Fill the listview with the value from the received iq
"""
if iq['type'] == 'error':
self.set_error(iq['error']['type'], iq['error']['code'], iq['error']['text'])
return
log.debug("iq: %s", iq)
def get_items():
substanza = iq['disco_items']
for item in substanza['substanzas']:
if isinstance(item, DiscoItem):
yield item
items = [(item['node'], item['name'] or '', item['jid']) for item in get_items()]
log.debug(items)
self.listview.set_lines(items)
self.info_header.message = _('Ad-hoc commands of JID %s') % self.name
if self.core.current_tab() is self:
self.refresh()
else:
self.state = 'highlight'
self.refresh_tab_win()
self.core.doupdate()