diff options
Diffstat (limited to 'sleekxmpp/xmlstream')
-rw-r--r-- | sleekxmpp/xmlstream/jid.py | 70 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/stanzabase.py | 23 |
2 files changed, 71 insertions, 22 deletions
diff --git a/sleekxmpp/xmlstream/jid.py b/sleekxmpp/xmlstream/jid.py new file mode 100644 index 00000000..2839ba58 --- /dev/null +++ b/sleekxmpp/xmlstream/jid.py @@ -0,0 +1,70 @@ +class JID(object): + def __init__(self, jid): + """Initialize a new jid""" + self.reset(jid) + + def reset(self, jid): + """Start fresh from a new jid string""" + self._full = self._jid = str(jid) + self._domain = None + self._resource = None + self._user = None + self._domain = None + self._bare = None + + def __getattr__(self, name): + """Handle getting the jid values, using cache if available""" + if name == 'resource': + if self._resource is not None: return self._resource + self._resource = self._jid.split('/', 1)[-1] + return self._resource + elif name == 'user': + if self._user is not None: return self._user + if '@' in self._jid: + self._user = self._jid.split('@', 1)[0] + else: + self._user = self._user + return self._user + elif name in ('server', 'domain'): + if self._domain is not None: return self._domain + self._domain = self._jid.split('@', 1)[-1].split('/', 1)[0] + return self._domain + elif name == 'full': + return self._jid + elif name == 'bare': + if self._bare is not None: return self._bare + self._bare = self._jid.split('/', 1)[0] + return self._bare + + def __setattr__(self, name, value): + """Edit a jid by updating it's individual values, resetting by a generated jid in the end""" + if name in ('resource', 'user', 'domain'): + object.__setattr__(self, "_%s" % name, value) + self.regenerate() + elif name == 'server': + self.domain = value + elif name in ('full', 'jid'): + self.reset(value) + elif name == 'bare': + if '@' in value: + u, d = value.split('@', 1) + object.__setattr__(self, "_user", u) + object.__setattr__(self, "_domain", d) + else: + object.__setattr__(self, "_domain", value) + self.regenerate() + else: + object.__setattr__(self, name, value) + + + def regenerate(self): + """Generate a new jid based on current values, useful after editing""" + jid = "" + if self.user: jid = "%s@" % self.user + jid += self.domain + if self.resource: jid += "/%s" % self.resource + self.reset(jid) + + def __str__(self): + return self.full + diff --git a/sleekxmpp/xmlstream/stanzabase.py b/sleekxmpp/xmlstream/stanzabase.py index ab054073..b8c80ffa 100644 --- a/sleekxmpp/xmlstream/stanzabase.py +++ b/sleekxmpp/xmlstream/stanzabase.py @@ -10,6 +10,7 @@ import logging import sys import weakref import copy +from . jid import JID if sys.version_info < (3,0): from . import tostring26 as tostring @@ -28,28 +29,6 @@ def registerStanzaPlugin(stanza, plugin): stanza.plugin_tag_map[tag] = plugin -class JID(object): - def __init__(self, jid): - self.jid = jid - - def __getattr__(self, name): - if name == 'resource': - return self.jid.split('/', 1)[-1] - elif name == 'user': - if '@' in self.jid: - return self.jid.split('@', 1)[0] - else: - return '' - elif name == 'server': - return self.jid.split('@', 1)[-1].split('/', 1)[0] - elif name == 'full': - return self.jid - elif name == 'bare': - return self.jid.split('/', 1)[0] - - def __str__(self): - return self.jid - class ElementBase(tostring.ToString): name = 'stanza' plugin_attrib = 'plugin' |