.. _fbf.drivers.sleek.bot: bot ~~~ .. automodule:: fbf.drivers.sleek.bot :show-inheritance: :members: :undoc-members: CODE ---- :: # boty/drivers/xmpp/bot.py # # """ XMPP bot build on sleekxmpp. """ .. _fbf.drivers.sleek.bot_boty_imports: boty imports --------------- :: from fbf.imports import getsleek sleekxmpp = getsleek() .. _fbf.drivers.sleek.bot_fbf_imports: fbf imports -------------- :: from fbf.utils.exception import handle_exception from fbf.lib.threads import start_new_thread from fbf.utils.xmpp import stripped from fbf.lib.botbase import BotBase from fbf.lib.errors import NoUserProvided from fbf.lib.eventhandler import mainhandler from .message import Message from .presence import Presence .. _fbf.drivers.sleek.bot_basic_imports: basic imports ---------------- :: import logging .. _fbf.drivers.sleek.bot_BotyXMPPBot_class: BotyXMPPBot class -------------------- :: class SleekBot(BotBase): def __init__(self, cfg, *args, **kwargs): if not cfg.user: raise NoUserProvided("please make sure the user config variable is set in %s (or use -u)" % cfg.cfile) BotBase.__init__(self, cfg, *args, **kwargs) self.type = "sleek" self.xmpp = sleekxmpp.ClientXMPP(cfg.user, cfg.password) self.xmpp.add_event_handler("session_start", self.session_start) self.xmpp.add_event_handler("message", self.handle_message) self.xmpp.add_event_handler('disconnected', self.handle_disconnected) self.xmpp.add_event_handler('connected', self.handle_connected) self.xmpp.add_event_handler('presence_available', self.handle_presence) self.xmpp.add_event_handler('presence_dnd', self.handle_presence) self.xmpp.add_event_handler('presence_xa', self.handle_presence) self.xmpp.add_event_handler('presence_chat', self.handle_presence) self.xmpp.add_event_handler('presence_away', self.handle_presence) self.xmpp.add_event_handler('presence_unavailable', self.handle_presence) self.xmpp.add_event_handler('presence_subscribe', self.handle_presence) self.xmpp.add_event_handler('presence_subscribed', self.handle_presence) self.xmpp.add_event_handler('presence_unsubscribe', self.handle_presence) self.xmpp.add_event_handler('presence_unsubscribed', self.handle_presence) self.xmpp.add_event_handler('groupchat_direct_invite', self.handle_groupinvite) self.xmpp.add_event_handler('groupchat_invite', self.handle_groupinvite) self.xmpp.add_event_handler('groupchat_message', self.handle_message) self.xmpp.add_event_handler('groupchat_presence', self.handle_presence) self.xmpp.add_event_handler('groupchat_subject', self.handle_presence) self.xmpp.add_event_handler('failed_auth', self.handle_failedauth) self.xmpp.exception = self.exception self.xmpp.use_signals() if cfg.openfire: import ssl self.xmpp.ssl_version = ssl.PROTOCOL_SSLv3 def session_start(self, event): logging.warn("session started") self.xmpp.send_presence() start_new_thread(self.joinchannels, ()) def exception(self, ex): logging.error(str(ex)) def handle_failedauth(self, error, *args): logging.error(error) def handle_failure(self, ex, *args, **kwargs): logging.error(str(ex)) def handle_disconnected(self, *args, **kwargs): logging.error("server disconnected") def handle_connected(self, *args, **kwargs): logging.warn("connected!") def start(self, connect=True, *args, **kwargs): BotBase.start(self, False) try: if connect: logging.warn("connecting to %s using %s" % (self.cfg.server, self.cfg.user)) self.xmpp.connect() self.xmpp.process(block=True) except Exception as ex: logging.error(str(ex)) def send(self, event): try: xml = event.tojabber() if not xml: raise Exception("can't convert %s to xml .. bot.send()" % what) except (AttributeError, TypeError): handle_exception() return self.xmpp.send_raw(xml) def outnocb(self, printto, txt, how=None, event=None, html=False, isrelayed=False, *args, **kwargs): """ output txt to bot. """ if printto and printto in self.state['joinedchannels']: outtype = 'groupchat' else: outtype = "chat" target = printto txt = self.normalize(txt) #txt = stripcolor(txt) repl = Message(event) repl.to = target repl.type = (event and event.type) or "chat" repl.txt = txt if html: repl.html = txt logging.debug("%s - reply is %s" % (self.cfg.name, repl.dump())) if not repl.type: repl.type = 'normal' logging.debug("%s - sxmpp - out - %s - %s" % (self.cfg.name, printto, str(txt))) self.send(repl) def handle_message(self, data, *args, **kwargs): """ message handler. """ if '