Changeset 118:a70736af32c3 for wokkel/muc.py
- Timestamp:
- Oct 20, 2008, 8:37:06 PM (14 years ago)
- Branch:
- wokkel-muc-client-support-24
- Convert:
- svn:b33ecbfc-034c-dc11-8662-000475d9059e/branches/wokkel-muc-client-support-24@114
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
wokkel/muc.py
r117 r118 14 14 from zope.interface import implements 15 15 16 from twisted.internet import defer 16 from twisted.internet import defer, reactor 17 17 from twisted.words.protocols.jabber import jid, error, xmlstream 18 18 from twisted.words.xish import domish … … 87 87 STATUS_CODE_CREATED = 201 88 88 89 DEFER_TIMEOUT = 30 # basic timeout is 30 seconds 89 90 90 91 class MUCError(error.StanzaError): … … 341 342 x['role'] = role 342 343 344 class UnavailableUserPresence(xmppim.UnavailablePresence): 345 """ 346 This behaves like an object providing L{domish.IElement}. 347 348 """ 349 350 def __init__(self, to=None, type=None, frm=None, affiliation=None, role=None): 351 xmppim.UnavailablePresence.__init__(self, to, type) 352 if frm: 353 self['from'] = frm 354 # add muc elements 355 x = self.addElement('x', NS_MUC_USER) 356 if affiliation: 357 x['affiliation'] = affiliation 358 if role: 359 x['role'] = role 360 343 361 344 362 class PasswordPresence(BasicPresence): … … 388 406 rooms = {} 389 407 408 timeout = None 409 410 _deferreds = [] 411 390 412 def connectionInitialized(self): 391 413 self.xmlstream.addObserver(PRESENCE+"[not(@type) or @type='available']/x", self._onXPresence) … … 412 434 """ 413 435 """ 436 414 437 if not prs.hasAttribute('from'): 415 438 return … … 601 624 return getattr(iq,'query', None) 602 625 626 627 def sendDeferred(self, obj, timeout): 628 """ Send data or a domish element, adding a deferred with a timeout. 629 """ 630 d = defer.Deferred() 631 self._deferreds.append(d) 632 633 634 def onTimeout(): 635 i = 0 636 for xd in self._deferreds: 637 if d == xd: 638 self._deferreds.pop(i) 639 d.errback(xmlstream.TimeoutError("Timeout waiting for response.")) 640 i += 1 641 642 call = reactor.callLater(timeout, onTimeout) 643 644 def cancelTimeout(result): 645 if call.active(): 646 call.cancel() 647 648 return result 649 650 d.addBoth(cancelTimeout) 651 652 self.xmlstream.send(obj) 653 return d 654 603 655 def disco(self, entity, type='info'): 604 656 """Send disco queries to a XMPP entity … … 649 701 650 702 """ 651 d = defer.Deferred()652 703 r = Room(room, server, nick, state='joining') 653 704 self._setRoom(r) 654 705 655 706 p = BasicPresence(to=r.entity_id) 656 # p['from'] = self.jid.full() 657 self.xmlstream.send(p) 707 d = self.sendDeferred(p, timeout=DEFER_TIMEOUT) 658 708 659 709 # add observer for joining the room … … 685 735 """ 686 736 687 d = defer.Deferred()737 688 738 r = self._getRoom(room_jid) 689 739 if r is None: … … 693 743 # make sure we call the method to generate the new entity xmpp id 694 744 p = BasicPresence(to=r.entityId()) 695 self.xmlstream.send(p)745 d = self.sendDeferred(p, timeout=DEFER_TIMEOUT) 696 746 697 747 # add observer for joining the room … … 706 756 """ 707 757 """ 708 d = defer.Deferred()709 710 758 r = self._getRoom(room_jid) 711 759 712 760 p = xmppim.UnavailablePresence(to=r.entity_id) 713 # p['from'] = self.jid.full() 714 self.xmlstream.send(p) 715 761 762 d = self.sendDeferred(p, timeout=DEFER_TIMEOUT) 716 763 # add observer for joining the room 717 764 self.xmlstream.addOnetimeObserver(PRESENCE+"[@from='%s' and @type='unavailable']" % (r.entity_id.full()),
Note: See TracChangeset
for help on using the changeset viewer.