SleekXMPP/sleekxmpp/xmlstream/jid.py

70 lines
2 KiB
Python

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