From bbc55fa40eaaed6bb57fddd2e9cc5eb1d3baa8cc Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sun, 4 May 2014 18:23:10 +0200 Subject: [PATCH] Add the /ad-hoc command to list commands of the given jid --- src/connection.py | 1 + src/core/commands.py | 16 +++++++++ src/core/core.py | 4 +++ src/tabs/__init__.py | 1 + src/tabs/adhoc_commands_list.py | 57 +++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 src/tabs/adhoc_commands_list.py diff --git a/src/connection.py b/src/connection.py index 649cd0a2..a0e9a395 100644 --- a/src/connection.py +++ b/src/connection.py @@ -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') diff --git a/src/core/commands.py b/src/core/commands.py index d4df1099..c2e453e9 100644 --- a/src/core/commands.py +++ b/src/core/commands.py @@ -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 diff --git a/src/core/core.py b/src/core/core.py index d49845dc..d53782b5 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -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='', + 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 diff --git a/src/tabs/__init__.py b/src/tabs/__init__.py index 8826ede2..5f09bf38 100644 --- a/src/tabs/__init__.py +++ b/src/tabs/__init__.py @@ -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 diff --git a/src/tabs/adhoc_commands_list.py b/src/tabs/adhoc_commands_list.py new file mode 100644 index 00000000..d0504677 --- /dev/null +++ b/src/tabs/adhoc_commands_list.py @@ -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()