changeset 1370:53c7678c27a6

plugin text commands: added _contextValid method: - _contextValid check if a method can be called in this context, according to docstring declaration - use it to parse results in /help command - use it avoid use of command in wrong context, and help message is sent in this case
author Goffi <goffi@goffi.org>
date Thu, 19 Mar 2015 14:29:03 +0100
parents dd1a148bd3d8
children 876c9fbd0b3d
files src/plugins/plugin_misc_text_commands.py
diffstat 1 files changed, 28 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/plugin_misc_text_commands.py	Thu Mar 19 14:02:37 2015 +0100
+++ b/src/plugins/plugin_misc_text_commands.py	Thu Mar 19 14:29:03 2015 +0100
@@ -213,18 +213,40 @@
                 self.feedBack("Command failed with condition '%s'" % failure.value.condition, mess_data, profile)
                 return False
 
+            mess_data["unparsed"] = msg[1 + len(command):]  # part not yet parsed of the message
             try:
-                mess_data["unparsed"] = msg[1 + len(command):]  # part not yet parsed of the message
-                d = defer.maybeDeferred(self._commands[command]["callback"], mess_data, profile)
-                d.addErrback(genericErrback)
-                d.addCallback(retHandling)
+                cmd_data = self._commands[command]
             except KeyError:
                 self.feedBack(_("Unknown command /%s. ") % command + self.HELP_SUGGESTION, mess_data, profile)
                 log.debug("text commands took over")
                 raise failure.Failure(exceptions.CancelError())
+            else:
+                if not self._contextValid(mess_data, cmd_data):
+                    # The command is not launched in the right context, we throw a message with help instructions
+                    context_txt = _("group discussions") if cmd_data["type"] == "group" else _("one to one discussions")
+                    feedback = _("/{command} command only applies in {context}.").format(command=command, context=context_txt)
+                    self.feedBack(u"{} {}".format(feedback, self.HELP_SUGGESTION), mess_data, profile)
+                    log.debug("text commands took over")
+                    raise failure.Failure(exceptions.CancelError())
+                else:
+                    d = defer.maybeDeferred(cmd_data["callback"], mess_data, profile)
+                    d.addErrback(genericErrback)
+                    d.addCallback(retHandling)
 
         return d or mess_data  # if a command is detected, we should have a deferred, else we send the message normally
 
+    def _contextValid(self, mess_data, cmd_data):
+        """Tell if a command can be used in the given context
+
+        @param mess_data(dict): message data as given in sendMessage trigger
+        @param cmd_data(dict): command data as returned by self._parseDocString
+        @return (bool): True if command can be used in this context
+        """
+        if ((cmd_data['type'] == "group" and mess_data["type"] != "groupchat") or
+            (cmd_data['type'] == 'one2one' and mess_data["type"] == "groupchat")):
+            return False
+        return True
+
     def getRoomJID(self, arg, service_jid):
         """Return a room jid with a shortcut
 
@@ -335,6 +357,8 @@
 
             for command in sorted(self._commands):
                 cmd_data = self._commands[command]
+                if not self._contextValid(mess_data, cmd_data):
+                    continue
                 spaces = (longuest - len(command)) * ' '
                 help_cmds.append("    /{command}: {spaces} {short_help}".format(
                     command=command,