Source code for flexget.components.notify.notifiers.xmpp
import logging
from loguru import logger
from flexget import plugin
from flexget.config_schema import one_or_more
from flexget.event import event
from flexget.plugin import DependencyError
plugin_name = 'xmpp'
logger = logger.bind(name=plugin_name)
[docs]
class XMPPNotifier:
"""Send messages via XMPP.
The sleekxmpp library is required to be installed.
Install it with: ``pip install sleekxmpp``
All fields are required.
Example::
notify:
entries:
via:
- xmpp:
sender: sender's JID
password: sender's password
recipients: recipient's JID or list of JIDs
"""
schema = {
'type': 'object',
'properties': {
'sender': {'type': 'string'},
'password': {'type': 'string'},
'recipients': one_or_more({'type': 'string'}),
},
'required': ['sender', 'password', 'recipients'],
'additionalProperties': False,
}
__version__ = '1.0'
[docs]
def notify(self, title, message, config):
try:
import sleekxmpp
except ImportError as e:
logger.debug('Error importing SleekXMPP: {}', e)
raise DependencyError(
plugin_name, 'sleekxmpp', f'SleekXMPP module required. ImportError: {e}'
)
try:
import dns # noqa: F401
except ImportError:
try:
import dnspython # noqa: F401
except ImportError as e:
logger.debug('Error importing dnspython: {}', e)
raise DependencyError(
plugin_name, 'dnspython', f'dnspython module required. ImportError: {e}'
)
class SendMsgBot(sleekxmpp.ClientXMPP):
def __init__(self, jid, password, recipients, message):
sleekxmpp.ClientXMPP.__init__(self, jid, password)
self.recipients = recipients
self.msg = message
self.add_event_handler('session_start', self.start, threaded=True)
self.register_plugin('xep_0030') # Service Discovery
self.register_plugin('xep_0199') # XMPP Ping
def start(self, xmpp_event):
for recipient in self.recipients:
self.send_presence(pto=recipient)
self.send_message(mto=recipient, mbody=self.msg, mtype='chat')
self.disconnect(wait=True)
message = f'{title}\n{message}'
logger.debug('Sending XMPP notification about: {}', message)
logging.getLogger('sleekxmpp').setLevel(logging.CRITICAL)
if not isinstance(config['recipients'], list):
config['recipients'] = [config['recipients']]
xmpp = SendMsgBot(config['sender'], config['password'], config['recipients'], message)
if xmpp.connect():
xmpp.process(block=True)
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(XMPPNotifier, plugin_name, api_ver=2, interfaces=['notifiers'])