summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream/jid.py
blob: 2839ba58df5fea113538726bbd11d2616b6cf6d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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