X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;ds=sidebyside;f=sid%2Fsid.py;h=b9c7df71c55373cfaa989f8ef5582a576ab9fa4d;hb=a19f40b0a9329c7f3c3cf56d7deb5a4bc1ef32ff;hp=604a63a6569d4432fcea52c8c3c3fa07c5482597;hpb=8d02f7db31a8587f1cd9bb31bcdffd517f6c144e;p=sid.git diff --git a/sid/sid.py b/sid/sid.py index 604a63a..b9c7df7 100644 --- a/sid/sid.py +++ b/sid/sid.py @@ -2,7 +2,7 @@ # Copyright (C) 2007-2012 Thomas Perl # Copyright (C) 2010, 2011 Anaël Verrier -# Copyright (C) 2014-2015 kaliko +# Copyright (C) 2014, 2015, 2020 kaliko # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -21,11 +21,17 @@ import inspect import logging import traceback -import sleekxmpp +import slixmpp + +from sid import __url__ def botcmd(*args, **kwargs): - """Decorator for bot command functions""" + """Decorator for bot command functions + + :param bool hidden: is the command hidden in global help + :param str name: command name, default to decorated function name + """ def decorate(func, hidden=False, name=None): setattr(func, '_bot_command', True) @@ -41,14 +47,26 @@ def botcmd(*args, **kwargs): return lambda func: decorate(func, **kwargs) -class MUCBot(sleekxmpp.ClientXMPP): +class MUCBot(slixmpp.ClientXMPP): + """ + :param str jid: jid to log with + :param str password: jid password + :param str room: conference room to join + :param str nick: Nickname to use in the room + """ + #: Class attribute to define bot's command prefix + #: + #: Defaults to "!" prefix = '!' def __init__(self, jid, password, room, nick, log_file=None, log_level=logging.INFO): super(MUCBot, self).__init__(jid, password) + # Clean sphinx autodoc for self documentation + # (cf. MUCBot.help) + self.__doc__ = None self.log = logging.getLogger(__package__) self.plugins = list() self.commands = dict() @@ -56,9 +74,10 @@ class MUCBot(sleekxmpp.ClientXMPP): self.nick = nick self.__set_logger(log_file, log_level) self.__seen = dict() - self.register_plugin('xep_0030') # Service Discovery - self.register_plugin('xep_0045') # Multi-User Chat - self.register_plugin('xep_0199') # self Ping + self.register_plugin('xep_0030') # Service Discovery + self.register_plugin('xep_0045') # Multi-User Chat + self.register_plugin('xep_0071') # xhtml-im + self.register_plugin('xep_0199') # self Ping # The session_start event will be triggered when # the bot establishes its connection with the server @@ -83,14 +102,18 @@ class MUCBot(sleekxmpp.ClientXMPP): log_fd = open(log_file, 'w') if log_file else None chandler = logging.StreamHandler(log_fd) formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) chandler.setFormatter(formatter) self.log.addHandler(chandler) self.log.setLevel(log_level) self.log.debug('set logger, log level : %s', log_level) def message(self, msg): - """Messages handler""" + """Messages handler + + Parses message received to detect :py:obj:`prefix` + """ if msg['type'] not in ('groupchat', 'chat'): self.log.warning('Unhandled message') return @@ -131,21 +154,20 @@ class MUCBot(sleekxmpp.ClientXMPP): requesting the roster and broadcasting an initial presence stanza. - Arguments: - event -- An empty dictionary. The session_start - event does not provide any additional - data. + :param dict event: An empty dictionary. The session_start + event does not provide any additional data. """ self.get_roster() self.send_presence() - self.plugin['xep_0045'].joinMUC(self.room, + self.plugin['xep_0045'].join_muc(self.room, self.nick, # If a room password is needed, use: # password=the_room_password, wait=True) - def register_bot_plugin(self, plugin_class): - self.plugins.append(plugin_class(self)) + :param `sid.plugin.Plugin` plugin_cls: A :py:obj:`sid.plugin.Plugin` class + """ + self.plugins.append(plugin_cls(self)) for name, value in inspect.getmembers(self.plugins[-1]): if inspect.ismethod(value) and getattr(value, '_bot_command', False): @@ -171,7 +193,8 @@ class MUCBot(sleekxmpp.ClientXMPP): Automatically assigned to the "help" command.""" help_cmd = ('Type {}help '.format(self.prefix) + - ' to get more info about that specific command.') + ' to get more info about that specific command.\n\n' + + f'SRC: {__url__}') if not args: if self.__doc__: description = self.__doc__.strip() @@ -190,7 +213,8 @@ class MUCBot(sleekxmpp.ClientXMPP): text = '{}\n\n{}'.format(description, usage) else: if args[0] in self.commands.keys(): - text = self.commands[args[0]].__doc__.strip() or 'undocumented' + text = self.commands[args[0]].__doc__ or 'undocumented' + text = inspect.cleandoc(text) else: text = 'That command is not defined.' if message['type'] == 'groupchat':