plugin XEP-0050: notes are now managed:
- a note without payload in a completed command appear in a dialog. If there is a unique note, it's level is used, else info dialog is used with merged notes
- if there is a data form payload, notes are added to form's instructions
This commit is contained in:
parent
38c4e128ad
commit
41101b480d
1 changed files with 65 additions and 7 deletions
|
|
@ -242,6 +242,33 @@ class XEP_0050(object):
|
|||
form_ui.addList("node", options)
|
||||
return form_ui
|
||||
|
||||
def _getDataLvl(self, type_):
|
||||
"""Return the constant corresponding to <note/> type attribute value
|
||||
|
||||
@param type_: note type (see XEP-0050 §4.3)
|
||||
@return: a C.XMLUI_DATA_LVL_* constant
|
||||
"""
|
||||
if type_ == 'error':
|
||||
return C.XMLUI_DATA_LVL_ERROR
|
||||
elif type_ == 'warn':
|
||||
return C.XMLUI_DATA_LVL_WARNING
|
||||
else:
|
||||
if type_ != 'info':
|
||||
log.warning(_("Invalid note type [%s], using info") % type_)
|
||||
return C.XMLUI_DATA_LVL_INFO
|
||||
|
||||
def _mergeNotes(self, notes):
|
||||
"""Merge notes with level prefix (e.g. "ERROR: the message")
|
||||
|
||||
@param notes (list): list of tuple (level, message)
|
||||
@return: list of messages
|
||||
"""
|
||||
lvl_map = {C.XMLUI_DATA_LVL_INFO: '',
|
||||
C.XMLUI_DATA_LVL_WARNING: "%s: " % _("WARNING"),
|
||||
C.XMLUI_DATA_LVL_ERROR: "%s: " % _("ERROR")
|
||||
}
|
||||
return [u"%s%s" % (lvl_map[lvl], msg) for lvl, msg in notes]
|
||||
|
||||
def _commandsAnswer2XMLUI(self, iq_elt, session_id, session_data):
|
||||
"""
|
||||
Convert command answer to an ui for frontend
|
||||
|
|
@ -262,11 +289,44 @@ class XEP_0050(object):
|
|||
remote_session_id = command_elt.getAttribute('sessionid')
|
||||
if remote_session_id:
|
||||
session_data['remote_id'] = remote_session_id
|
||||
data_elt = command_elt.elements(data_form.NS_X_DATA, 'x').next()
|
||||
notes = []
|
||||
for note_elt in command_elt.elements(NS_COMMANDS, 'note'):
|
||||
notes.append((self._getDataLvl(note_elt.getAttribute('type', 'info')),
|
||||
unicode(note_elt)))
|
||||
try:
|
||||
data_elt = command_elt.elements(data_form.NS_X_DATA, 'x').next()
|
||||
except StopIteration:
|
||||
if status != XEP_0050.STATUS.COMPLETED:
|
||||
log.warning(_("No known payload found in ad-hoc command result, aborting"))
|
||||
del self.requesting[session_id]
|
||||
return xml_tools.XMLUI(C.XMLUI_DIALOG,
|
||||
dialog_opt = {C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE,
|
||||
C.XMLUI_DATA_MESS: _("No payload found"),
|
||||
C.XMLUI_DATA_LVL: C.XMLUI_DATA_LVL_ERROR,
|
||||
}
|
||||
)
|
||||
if not notes:
|
||||
# the status is completed, and we have no note to show
|
||||
return None
|
||||
|
||||
# if we have only one note, we show a dialog with the level of the note
|
||||
# if we have more, we show a dialog with "info" level, and all notes merged
|
||||
dlg_level = notes[0][0] if len(notes) == 1 else C.XMLUI_DATA_LVL_INFO
|
||||
return xml_tools.XMLUI(
|
||||
C.XMLUI_DIALOG,
|
||||
dialog_opt = {C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE,
|
||||
C.XMLUI_DATA_MESS: u'\n'.join(self._mergeNotes(notes)),
|
||||
C.XMLUI_DATA_LVL: dlg_level,
|
||||
},
|
||||
session_id = session_id
|
||||
)
|
||||
|
||||
if session_id is None:
|
||||
return xml_tools.dataFormResult2XMLUI(data_elt)
|
||||
form = data_form.Form.fromElement(data_elt)
|
||||
return xml_tools.dataForm2XMLUI(form, self.__requesting_id, session_id=session_id)
|
||||
# we add any present note to the instructions
|
||||
form.instructions.extend(self._mergeNotes(notes))
|
||||
return xml_tools.dataForm2XMLUI(form, self.__requesting_id, session_id=session_id)
|
||||
|
||||
def _requestingEntity(self, data, profile):
|
||||
"""
|
||||
|
|
@ -302,11 +362,11 @@ class XEP_0050(object):
|
|||
session_id = data["session_id"]
|
||||
entity = session_data['jid']
|
||||
try:
|
||||
node = session_data['node']
|
||||
session_data['node']
|
||||
# node has already been received
|
||||
except KeyError:
|
||||
# it's the first time we know the node, we save it in session data
|
||||
node = session_data['node'] = data[xml_tools.SAT_FORM_PREFIX+'node']
|
||||
session_data['node'] = data[xml_tools.SAT_FORM_PREFIX+'node']
|
||||
|
||||
client = self.host.getClient(profile)
|
||||
|
||||
|
|
@ -402,9 +462,7 @@ class XEP_0050(object):
|
|||
|
||||
def addAdHocCommand(self, callback, label, node="", features = None, timeout = 600, allowed_jids = None, allowed_groups = None,
|
||||
allowed_magics = None, forbidden_jids = None, forbidden_groups = None, profile_key=C.PROF_KEY_NONE):
|
||||
"""
|
||||
|
||||
Add an ad-hoc command for the current profile
|
||||
"""Add an ad-hoc command for the current profile
|
||||
|
||||
@param callback: method associated with this ad-hoc command which return the payload data (see AdHocCommand._sendAnswer), can return a deferred
|
||||
@param label: label associated with this command on the main menu
|
||||
|
|
|
|||
Loading…
Reference in a new issue