Add XEP-0048 support
This commit is contained in:
parent
e5750b368e
commit
6c0afb87b9
1
setup.py
1
setup.py
@ -67,6 +67,7 @@ packages = [ 'sleekxmpp',
|
|||||||
'sleekxmpp/plugins/xep_0030/stanza',
|
'sleekxmpp/plugins/xep_0030/stanza',
|
||||||
'sleekxmpp/plugins/xep_0033',
|
'sleekxmpp/plugins/xep_0033',
|
||||||
'sleekxmpp/plugins/xep_0047',
|
'sleekxmpp/plugins/xep_0047',
|
||||||
|
'sleekxmpp/plugins/xep_0048',
|
||||||
'sleekxmpp/plugins/xep_0049',
|
'sleekxmpp/plugins/xep_0049',
|
||||||
'sleekxmpp/plugins/xep_0050',
|
'sleekxmpp/plugins/xep_0050',
|
||||||
'sleekxmpp/plugins/xep_0054',
|
'sleekxmpp/plugins/xep_0054',
|
||||||
|
@ -25,6 +25,7 @@ __all__ = [
|
|||||||
'xep_0033', # Extended Stanza Addresses
|
'xep_0033', # Extended Stanza Addresses
|
||||||
'xep_0045', # Multi-User Chat (Client)
|
'xep_0045', # Multi-User Chat (Client)
|
||||||
'xep_0047', # In-Band Bytestreams
|
'xep_0047', # In-Band Bytestreams
|
||||||
|
'xep_0048', # Bookmarks
|
||||||
'xep_0049', # Private XML Storage
|
'xep_0049', # Private XML Storage
|
||||||
'xep_0050', # Ad-hoc Commands
|
'xep_0050', # Ad-hoc Commands
|
||||||
'xep_0054', # vcard-temp
|
'xep_0054', # vcard-temp
|
||||||
|
15
sleekxmpp/plugins/xep_0048/__init__.py
Normal file
15
sleekxmpp/plugins/xep_0048/__init__.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
"""
|
||||||
|
SleekXMPP: The Sleek XMPP Library
|
||||||
|
Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
|
||||||
|
This file is part of SleekXMPP.
|
||||||
|
|
||||||
|
See the file LICENSE for copying permission.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from sleekxmpp.plugins.base import register_plugin
|
||||||
|
|
||||||
|
from sleekxmpp.plugins.xep_0048.stanza import Bookmarks, Conference, URL
|
||||||
|
from sleekxmpp.plugins.xep_0048.bookmarks import XEP_0048
|
||||||
|
|
||||||
|
|
||||||
|
register_plugin(XEP_0048)
|
76
sleekxmpp/plugins/xep_0048/bookmarks.py
Normal file
76
sleekxmpp/plugins/xep_0048/bookmarks.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
"""
|
||||||
|
SleekXMPP: The Sleek XMPP Library
|
||||||
|
Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
|
||||||
|
This file is part of SleekXMPP.
|
||||||
|
|
||||||
|
See the file LICENSE for copying permission.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from sleekxmpp import Iq
|
||||||
|
from sleekxmpp.plugins import BasePlugin
|
||||||
|
from sleekxmpp.exceptions import XMPPError
|
||||||
|
from sleekxmpp.xmlstream.handler import Callback
|
||||||
|
from sleekxmpp.xmlstream.matcher import StanzaPath
|
||||||
|
from sleekxmpp.xmlstream import register_stanza_plugin
|
||||||
|
from sleekxmpp.plugins.xep_0048 import stanza, Bookmarks, Conference, URL
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class XEP_0048(BasePlugin):
|
||||||
|
|
||||||
|
name = 'xep_0048'
|
||||||
|
description = 'XEP-0048: Bookmarks'
|
||||||
|
dependencies = set(['xep_0045', 'xep_0049', 'xep_0060', 'xep_0163', 'xep_0223'])
|
||||||
|
stanza = stanza
|
||||||
|
default_config = {
|
||||||
|
'auto_join': False,
|
||||||
|
'storage_method': 'xep_0049'
|
||||||
|
}
|
||||||
|
|
||||||
|
def plugin_init(self):
|
||||||
|
register_stanza_plugin(self.xmpp['xep_0060'].stanza.Item, Bookmarks)
|
||||||
|
|
||||||
|
self.xmpp['xep_0049'].register(Bookmarks)
|
||||||
|
self.xmpp['xep_0163'].register_pep('bookmarks', Bookmarks)
|
||||||
|
|
||||||
|
self.xmpp.add_event_handler('session_start', self._autojoin)
|
||||||
|
|
||||||
|
def plugin_end(self):
|
||||||
|
self.xmpp.del_event_handler('session_start', self._autojoin)
|
||||||
|
|
||||||
|
def _autojoin(self, __):
|
||||||
|
if not self.auto_join:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = self.get_bookmarks(method=self.storage_method)
|
||||||
|
except XMPPError:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.storage_method == 'xep_0223':
|
||||||
|
bookmarks = result['pubsub']['items']['item']['bookmarks']
|
||||||
|
else:
|
||||||
|
bookmarks = result['private']['bookmarks']
|
||||||
|
|
||||||
|
for conf in bookmarks['conferences']:
|
||||||
|
if conf['autojoin']:
|
||||||
|
log.debug('Auto joining %s as %s', conf['jid'], conf['nick'])
|
||||||
|
self.xmpp['xep_0045'].joinMUC(conf['jid'], conf['nick'],
|
||||||
|
password=conf['password'])
|
||||||
|
|
||||||
|
def set_bookmarks(self, bookmarks, method=None, **iqargs):
|
||||||
|
if not method:
|
||||||
|
method = self.storage_method
|
||||||
|
return self.xmpp[method].store(bookmarks, **iqargs)
|
||||||
|
|
||||||
|
def get_bookmarks(self, method=None, **iqargs):
|
||||||
|
if not method:
|
||||||
|
method = self.storage_method
|
||||||
|
|
||||||
|
loc = 'storage:bookmarks' if method == 'xep_0223' else 'bookmarks'
|
||||||
|
|
||||||
|
return self.xmpp[method].retrieve(loc, **iqargs)
|
65
sleekxmpp/plugins/xep_0048/stanza.py
Normal file
65
sleekxmpp/plugins/xep_0048/stanza.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
"""
|
||||||
|
SleekXMPP: The Sleek XMPP Library
|
||||||
|
Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
|
||||||
|
This file is part of SleekXMPP.
|
||||||
|
|
||||||
|
See the file LICENSE for copying permission.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from sleekxmpp.xmlstream import ET, ElementBase, register_stanza_plugin
|
||||||
|
|
||||||
|
|
||||||
|
class Bookmarks(ElementBase):
|
||||||
|
name = 'storage'
|
||||||
|
namespace = 'storage:bookmarks'
|
||||||
|
plugin_attrib = 'bookmarks'
|
||||||
|
interfaces = set()
|
||||||
|
|
||||||
|
def add_conference(self, jid, nick, name=None, autojoin=None, password=None):
|
||||||
|
conf = Conference()
|
||||||
|
conf['jid'] = jid
|
||||||
|
conf['nick'] = nick
|
||||||
|
if name is None:
|
||||||
|
name = jid
|
||||||
|
conf['name'] = name
|
||||||
|
conf['autojoin'] = autojoin
|
||||||
|
conf['password'] = password
|
||||||
|
self.append(conf)
|
||||||
|
|
||||||
|
def add_url(self, url, name=None):
|
||||||
|
saved_url = URL()
|
||||||
|
saved_url['url'] = url
|
||||||
|
if name is None:
|
||||||
|
name = url
|
||||||
|
saved_url['name'] = name
|
||||||
|
self.append(saved_url)
|
||||||
|
|
||||||
|
|
||||||
|
class Conference(ElementBase):
|
||||||
|
name = 'conference'
|
||||||
|
namespace = 'storage:bookmarks'
|
||||||
|
plugin_attrib = 'conference'
|
||||||
|
plugin_multi_attrib = 'conferences'
|
||||||
|
interfaces = set(['nick', 'password', 'autojoin', 'jid', 'name'])
|
||||||
|
sub_interfaces = set(['nick', 'password'])
|
||||||
|
|
||||||
|
def get_autojoin(self):
|
||||||
|
value = self._get_attr('autojoin')
|
||||||
|
return value in ('1', 'true')
|
||||||
|
|
||||||
|
def set_autojoin(self, value):
|
||||||
|
del self['autojoin']
|
||||||
|
if value in ('1', 'true', True):
|
||||||
|
self._set_sub_text('autojoin', 'true')
|
||||||
|
|
||||||
|
|
||||||
|
class URL(ElementBase):
|
||||||
|
name = 'url'
|
||||||
|
namespace = 'storage:bookmarks'
|
||||||
|
plugin_attrib = 'url'
|
||||||
|
plugin_multi_attrib = 'urls'
|
||||||
|
interfaces = set(['url', 'name'])
|
||||||
|
|
||||||
|
|
||||||
|
register_stanza_plugin(Bookmarks, Conference, iterable=True)
|
||||||
|
register_stanza_plugin(Bookmarks, URL, iterable=True)
|
Loading…
Reference in New Issue
Block a user