summaryrefslogtreecommitdiff
path: root/sleekxmpp/roster/single.py
diff options
context:
space:
mode:
Diffstat (limited to 'sleekxmpp/roster/single.py')
-rw-r--r--sleekxmpp/roster/single.py31
1 files changed, 10 insertions, 21 deletions
diff --git a/sleekxmpp/roster/single.py b/sleekxmpp/roster/single.py
index 048b091e..d43a5041 100644
--- a/sleekxmpp/roster/single.py
+++ b/sleekxmpp/roster/single.py
@@ -6,6 +6,8 @@
See the file LICENSE for copying permission.
"""
+import threading
+
from sleekxmpp.xmlstream import JID
from sleekxmpp.roster import RosterItem
@@ -59,6 +61,7 @@ class RosterNode(object):
self.last_status = None
self._version = ''
self._jids = {}
+ self._last_status_lock = threading.Lock()
if self.db:
if hasattr(self.db, 'version'):
@@ -291,8 +294,7 @@ class RosterNode(object):
for jid in self:
self[jid].reset()
- def send_presence(self, ptype=None, pshow=None, pstatus=None,
- ppriority=None, pnick=None, pto=None):
+ def send_presence(self, **kwargs):
"""
Create, initialize, and send a Presence stanza.
@@ -305,27 +307,14 @@ class RosterNode(object):
pstatus -- The presence's status message.
ppriority -- This connections' priority.
pto -- The recipient of a directed presence.
+ pfrom -- The sender of a directed presence, which should
+ be the owner JID plus resource.
ptype -- The type of presence, such as 'subscribe'.
+ pnick -- Optional nickname of the presence's sender.
"""
- if pto:
- self[pto].send_presence(ptype, pshow, pstatus,
- ppriority, pnick)
- else:
- p = self.xmpp.make_presence(pshow=pshow,
- pstatus=pstatus,
- ppriority=ppriority,
- ptype=ptype,
- pnick=pnick)
- if self.xmpp.is_component:
- p['from'] = self.jid
- if p['type'] in p.showtypes or \
- p['type'] in ['available', 'unavailable']:
- self.last_status = p
- p.send()
-
- if not self.xmpp.sentpresence:
- self.xmpp.event('sent_presence')
- self.xmpp.sentpresence = True
+ if self.xmpp.is_component and not kwargs.get('pfrom', ''):
+ kwargs['pfrom'] = self.jid
+ self.xmpp.send_presence(**kwargs)
def send_last_presence(self):
if self.last_status is None: