Mercurial > libervia-backend
diff sat/plugins/plugin_misc_text_commands.py @ 2624:56f94936df1e
code style reformatting using black
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 27 Jun 2018 20:14:46 +0200 |
parents | 26edcf3a30eb |
children | d715d912afac |
line wrap: on
line diff
--- a/sat/plugins/plugin_misc_text_commands.py Wed Jun 27 07:51:29 2018 +0200 +++ b/sat/plugins/plugin_misc_text_commands.py Wed Jun 27 20:14:46 2018 +0200 @@ -23,6 +23,7 @@ from twisted.words.protocols.jabber import jid from twisted.internet import defer from sat.core.log import getLogger + log = getLogger(__name__) from twisted.python import failure from collections import OrderedDict @@ -35,26 +36,29 @@ C.PI_DEPENDENCIES: [], C.PI_MAIN: "TextCommands", C.PI_HANDLER: "no", - C.PI_DESCRIPTION: _("""IRC like text commands""") + C.PI_DESCRIPTION: _("""IRC like text commands"""), } class InvalidCommandSyntax(Exception): """Throwed while parsing @command in docstring if syntax is invalid""" + pass CMD_KEY = "@command" -CMD_TYPES = ('group', 'one2one', 'all') +CMD_TYPES = ("group", "one2one", "all") FEEDBACK_INFO_TYPE = "TEXT_CMD" class TextCommands(object): - #FIXME: doc strings for commands have to be translatable + # FIXME: doc strings for commands have to be translatable # plugins need a dynamic translation system (translation # should be downloadable independently) - HELP_SUGGESTION = _("Type '/help' to get a list of the available commands. If you didn't want to use a command, please start your message with '//' to escape the slash.") + HELP_SUGGESTION = _( + "Type '/help' to get a list of the available commands. If you didn't want to use a command, please start your message with '//' to escape the slash." + ) def __init__(self, host): log.info(_("Text commands initialization")) @@ -78,9 +82,7 @@ - "args" (default: ""): the arguments available, using syntax specified in documentation. - "doc_arg_[name]": the doc of [name] argument """ - data = OrderedDict([('doc_short_help', ""), - ('type', 'all'), - ('args', '')]) + data = OrderedDict([("doc_short_help", ""), ("type", "all"), ("args", "")]) docstring = cmd.__doc__ if docstring is None: log.warning(u"Not docstring found for command {}".format(cmd_name)) @@ -90,18 +92,22 @@ data["doc_short_help"] = doc_data[0] try: - cmd_indent = 0 # >0 when @command is found are we are parsing it + cmd_indent = 0 # >0 when @command is found are we are parsing it for line in doc_data: stripped = line.strip() - if cmd_indent and line[cmd_indent:cmd_indent+5] == " -": + if cmd_indent and line[cmd_indent : cmd_indent + 5] == " -": colon_idx = line.find(":") if colon_idx == -1: - raise InvalidCommandSyntax("No colon found in argument description") - arg_name = line[cmd_indent+6:colon_idx].strip() + raise InvalidCommandSyntax( + "No colon found in argument description" + ) + arg_name = line[cmd_indent + 6 : colon_idx].strip() if not arg_name: - raise InvalidCommandSyntax("No name found in argument description") - arg_help = line[colon_idx+1:].strip() + raise InvalidCommandSyntax( + "No name found in argument description" + ) + arg_help = line[colon_idx + 1 :].strip() data["doc_arg_{}".format(arg_name)] = arg_help elif cmd_indent: # we are parsing command and indent level is not good, it's finished @@ -113,31 +119,36 @@ colon_idx = stripped.find(":") if colon_idx == -1: raise InvalidCommandSyntax("missing colon") - type_data = stripped[len(CMD_KEY):colon_idx].strip() + type_data = stripped[len(CMD_KEY) : colon_idx].strip() if len(type_data) == 0: - type_data="(all)" - elif len(type_data) <= 2 or type_data[0] != '(' or type_data[-1] != ')': + type_data = "(all)" + elif ( + len(type_data) <= 2 or type_data[0] != "(" or type_data[-1] != ")" + ): raise InvalidCommandSyntax("Bad type data syntax") type_ = type_data[1:-1] if type_ not in CMD_TYPES: raise InvalidCommandSyntax("Unknown type {}".format(type_)) data["type"] = type_ - #args - data["args"] = stripped[colon_idx+1:].strip() + # args + data["args"] = stripped[colon_idx + 1 :].strip() except InvalidCommandSyntax as e: - log.warning(u"Invalid command syntax for command {command}: {message}".format(command=cmd_name, message=e.message)) + log.warning( + u"Invalid command syntax for command {command}: {message}".format( + command=cmd_name, message=e.message + ) + ) return data - def registerTextCommands(self, instance): """ Add a text command @param instance: instance of a class containing text commands """ for attr in dir(instance): - if attr.startswith('cmd_'): + if attr.startswith("cmd_"): cmd = getattr(instance, attr) if not callable(cmd): log.warning(_(u"Skipping not callable [%s] attribute") % attr) @@ -146,13 +157,19 @@ if not cmd_name: log.warning(_("Skipping cmd_ method")) if cmd_name in self._commands: - suff=2 + suff = 2 while (cmd_name + str(suff)) in self._commands: - suff+=1 + suff += 1 new_name = cmd_name + str(suff) - log.warning(_(u"Conflict for command [{old_name}], renaming it to [{new_name}]").format(old_name=cmd_name, new_name=new_name)) + log.warning( + _( + u"Conflict for command [{old_name}], renaming it to [{new_name}]" + ).format(old_name=cmd_name, new_name=new_name) + ) cmd_name = new_name - self._commands[cmd_name] = cmd_data = OrderedDict({'callback':cmd}) # We use an Ordered dict to keep documenation order + self._commands[cmd_name] = cmd_data = OrderedDict( + {"callback": cmd} + ) # We use an Ordered dict to keep documenation order cmd_data.update(self._parseDocString(cmd, cmd_name)) log.info(_("Registered text command [%s]") % cmd_name) @@ -168,7 +185,9 @@ self._whois.append((priority, callback)) self._whois.sort(key=lambda item: item[0], reverse=True) - def sendMessageTrigger(self, client, mess_data, pre_xml_treatments, post_xml_treatments): + def sendMessageTrigger( + self, client, mess_data, pre_xml_treatments, post_xml_treatments + ): """Install SendMessage command hook """ pre_xml_treatments.addCallback(self._sendMessageCmdHook, client) return True @@ -185,8 +204,8 @@ @param profile: %(doc_profile)s """ try: - msg = mess_data["message"][''] - msg_lang = '' + msg = mess_data["message"][""] + msg_lang = "" except KeyError: try: # we have not default message, we try to take the first found @@ -196,18 +215,18 @@ return mess_data try: - if msg[:2] == '//': + if msg[:2] == "//": # we have a double '/', it's the escape sequence mess_data["message"][msg_lang] = msg[1:] return mess_data - if msg[0] != '/': + if msg[0] != "/": return mess_data except IndexError: return mess_data # we have a command d = None - command = msg[1:].partition(' ')[0].lower() + command = msg[1:].partition(" ")[0].lower() if command.isalpha(): # looks like an actual command, we try to call the corresponding method def retHandling(ret): @@ -229,19 +248,33 @@ self.feedBack(client, u"Command failed {}".format(msg), mess_data) return False - mess_data["unparsed"] = msg[1 + len(command):] # part not yet parsed of the message + mess_data["unparsed"] = msg[ + 1 + len(command) : + ] # part not yet parsed of the message try: cmd_data = self._commands[command] except KeyError: - self.feedBack(client, _("Unknown command /%s. ") % command + self.HELP_SUGGESTION, mess_data) + self.feedBack( + client, + _("Unknown command /%s. ") % command + self.HELP_SUGGESTION, + mess_data, + ) log.debug("text command help message") 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(client, u"{} {}".format(feedback, self.HELP_SUGGESTION), mess_data) + 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( + client, u"{} {}".format(feedback, self.HELP_SUGGESTION), mess_data + ) log.debug("text command invalid message") raise failure.Failure(exceptions.CancelError()) else: @@ -249,7 +282,9 @@ 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 + 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 @@ -258,8 +293,9 @@ @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")): + if (cmd_data["type"] == "group" and mess_data["type"] != "groupchat") or ( + cmd_data["type"] == "one2one" and mess_data["type"] == "groupchat" + ): return False return True @@ -270,16 +306,16 @@ or a shortcut (e.g.: sat or sat@ for sat on current service) @param service_jid: jid of the current service (e.g.: chat.jabberfr.org) """ - nb_arobas = arg.count('@') + nb_arobas = arg.count("@") if nb_arobas == 1: - if arg[-1] != '@': + if arg[-1] != "@": return jid.JID(arg) return jid.JID(arg + service_jid) return jid.JID(u"%s@%s" % (arg, service_jid)) def feedBack(self, client, message, mess_data, info_type=FEEDBACK_INFO_TYPE): """Give a message back to the user""" - if mess_data["type"] == 'groupchat': + if mess_data["type"] == "groupchat": to_ = mess_data["to"].userhostJID() else: to_ = client.jid @@ -288,7 +324,7 @@ mess_data["from"] = mess_data["to"] mess_data["to"] = to_ mess_data["type"] = C.MESS_TYPE_INFO - mess_data["message"] = {'': message} + mess_data["message"] = {"": message} mess_data["extra"]["info_type"] = info_type client.messageSendToBridge(mess_data) @@ -303,7 +339,7 @@ entity = mess_data["unparsed"].strip() - if mess_data['type'] == "groupchat": + if mess_data["type"] == "groupchat": room = mess_data["to"].userhostJID() try: if self.host.plugins["XEP-0045"].isNickInRoom(client, room, entity): @@ -325,11 +361,13 @@ if not target_jid.resource: target_jid.resource = self.host.memory.getMainResource(client, target_jid) - whois_msg = [_(u"whois for %(jid)s") % {'jid': target_jid}] + whois_msg = [_(u"whois for %(jid)s") % {"jid": target_jid}] d = defer.succeed(None) for ignore, callback in self._whois: - d.addCallback(lambda ignore: callback(client, whois_msg, mess_data, target_jid)) + d.addCallback( + lambda ignore: callback(client, whois_msg, mess_data, target_jid) + ) def feedBack(ignore): self.feedBack(client, u"\n".join(whois_msg), mess_data) @@ -348,7 +386,9 @@ for doc_name, doc_help in cmd_data.iteritems(): if doc_name.startswith("doc_arg_"): arg_name = doc_name[8:] - strings.append(u"- {name}: {doc_help}".format(name=arg_name, doc_help=_(doc_help))) + strings.append( + u"- {name}: {doc_help}".format(name=arg_name, doc_help=_(doc_help)) + ) return strings @@ -376,7 +416,9 @@ if cmd_name and cmd_name[0] == "/": cmd_name = cmd_name[1:] if cmd_name and cmd_name not in self._commands: - self.feedBack(client, _(u"Invalid command name [{}]\n".format(cmd_name)), mess_data) + self.feedBack( + client, _(u"Invalid command name [{}]\n".format(cmd_name)), mess_data + ) cmd_name = "" if not cmd_name: # we show the global help @@ -387,22 +429,27 @@ 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, - spaces=spaces, - short_help=cmd_data["doc_short_help"] - )) + spaces = (longuest - len(command)) * " " + help_cmds.append( + " /{command}: {spaces} {short_help}".format( + command=command, + spaces=spaces, + short_help=cmd_data["doc_short_help"], + ) + ) - help_mess = _(u"Text commands available:\n%s") % (u'\n'.join(help_cmds), ) + help_mess = _(u"Text commands available:\n%s") % (u"\n".join(help_cmds),) else: # we show detailled help for a command cmd_data = self._commands[cmd_name] syntax = cmd_data["args"] help_mess = _(u"/{name}: {short_help}\n{syntax}{args_help}").format( name=cmd_name, - short_help=cmd_data['doc_short_help'], - syntax=_(" "*4+"syntax: {}\n").format(syntax) if syntax else "", - args_help=u'\n'.join([u" "*8+"{}".format(line) for line in self._getArgsHelp(cmd_data)])) + short_help=cmd_data["doc_short_help"], + syntax=_(" " * 4 + "syntax: {}\n").format(syntax) if syntax else "", + args_help=u"\n".join( + [u" " * 8 + "{}".format(line) for line in self._getArgsHelp(cmd_data)] + ), + ) self.feedBack(client, help_mess, mess_data)