Changeset 111:a51e5d87ded8 for wokkel
- Timestamp:
- Oct 3, 2008, 8:50:37 PM (14 years ago)
- Branch:
- wokkel-muc-client-support-24
- Convert:
- svn:b33ecbfc-034c-dc11-8662-000475d9059e/branches/wokkel-muc-client-support-24@72
- Location:
- wokkel
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
wokkel/muc.py
r110 r111 30 30 NS_CONFIG = NS + '#roomconfig' 31 31 NS_REQUEST = NS + '#request' 32 NS_REGISTER = NS + '#register' 32 33 33 34 NS_DELAY = 'urn:xmpp:delay' 35 NS_REQUEST = 'jabber:iq:register' 34 36 35 37 # ad hoc commands … … 138 140 139 141 142 class RegisterRequest(xmlstream.IQ): 143 """ 144 Register room request. 145 146 @ivar namespace: Request namespace. 147 @type namespace: C{str} 148 @ivar method: Type attribute of the IQ request. Either C{'set'} or C{'get'} 149 @type method: C{str} 150 """ 151 152 def __init__(self, xs, method='get', fields=[]): 153 xmlstream.IQ.__init__(self, xs, method) 154 q = self.addElement((NS_REQUEST, 'query')) 155 if method == 'set': 156 # build data form 157 form_type = 'submit' 158 form = data_form.Form(form_type, formNamespace=NS_REGISTER) 159 q.addChild(form.toElement()) 160 161 for f in fields: 162 # create a field 163 form.addField(f) 164 140 165 class GroupChat(domish.Element): 141 166 """ … … 177 202 178 203 179 class BasicPresence(xmppim. Presence):204 class BasicPresence(xmppim.AvailablePresence): 180 205 """ 181 206 This behaves like an object providing L{domish.IElement}. … … 183 208 """ 184 209 185 def __init__(self, to=None, type=None): 186 xmppim.Presence.__init__(self, to, type) 187 210 def __init__(self, to=None, show=None, statuses=None): 211 xmppim.AvailablePresence.__init__(self, to=to, show=show, statuses=statuses) 188 212 # add muc elements 189 213 x = self.addElement('x', NS) … … 229 253 self.addChild(form.toElement()) 230 254 231 class PresenceError( BasicPresence):255 class PresenceError(xmppim.Presence): 232 256 """ 233 257 This behaves like an object providing L{domish.IElement}. … … 236 260 237 261 def __init__(self, error, to=None, frm=None): 238 BasicPresence.__init__(self, to, type='error')262 xmppim.Presence.__init__(self, to, type='error') 239 263 if frm: 240 264 self['from'] = frm … … 266 290 return self.rooms.get(room_jid.full().lower()) 267 291 292 def _removeRoom(self, room_jid): 293 if self.rooms.has_key(room_jid.full().lower()): 294 del self.rooms[room_jid.full().lower()] 268 295 269 296 def _onXPresence(self, prs): … … 306 333 r = self._getRoom(room_jid) 307 334 if r is None: 308 raise 335 raise Exception, 'Room Not Found' 309 336 r.state = 'joined' 310 337 … … 316 343 d.callback(r) 317 344 345 346 def _leftRoom(self, d, prs): 347 """We have presence that says we joined a room. 348 """ 349 room_jid = jid.internJID(prs['from']) 350 351 # check for errors 352 if prs.hasAttribute('type') and prs['type'] == 'error': 353 d.errback(prs) 354 else: 355 # change the state of the room 356 r = self._getRoom(room_jid) 357 if r is None: 358 raise Exception, 'Room Not Found' 359 self._removeRoom(room_jid) 360 361 d.callback(True) 362 318 363 def receivedUserPresence(self, prs): 319 364 """User Presence has been received … … 342 387 343 388 344 def configure(self, room_jid, **kwargs):389 def configure(self, room_jid, fields=[]): 345 390 """Configure a room 346 391 """ 347 request = ConfigureRequest(self.xmlstream, method='set', **kwargs)392 request = ConfigureRequest(self.xmlstream, method='set', fields=fields) 348 393 request['to'] = room_jid 349 394 … … 374 419 375 420 421 422 def leave(self, room_jid): 423 """ 424 """ 425 d = defer.Deferred() 426 427 self._getRoom(room_jid) 428 429 p = xmppim.UnavailablePresence(to=r.entity_id) 430 # p['from'] = self.jid.full() 431 self.xmlstream.send(p) 432 433 # add observer for joining the room 434 self.xmlstream.addOnetimeObserver(PRESENCE+"[@from='%s' and type='unavailable']" % (r.entity_id.full()), 435 self._leftRoom, 1, d) 436 437 return d 438 439 440 441 376 442 def groupChat(self, to, message, children=None): 377 443 """Send a groupchat message … … 386 452 387 453 454 def register(self, to, fields=[]): 455 iq = RegisterRequest(self.xmlstream, method='set', fields=fields) 456 iq['to'] = to 457 return iq.send() 458 459 def getRegisterForm(self, to): 460 iq = RegisterRequest(self.xmlstream) 461 iq['to'] = to 462 return iq.send() 463 388 464 def subject(self, to, subject): 389 465 """ -
wokkel/test/test_muc.py
r110 r111 227 227 228 228 def test_privateMessage(self): 229 229 230 self.fail('Not Implemented') 230 231 231 232 def test_register(self): 232 self.fail('Not Implemented') 233 """Test client registering with a room. http://xmpp.org/extensions/xep-0045.html#register 234 235 """ 236 237 def cb(iq): 238 # check for a result 239 self.failUnless(iq['type']=='result', 'We did not get a result') 240 241 d = self.protocol.register(self.room_jid.userhost()) 242 d.addCallback(cb) 243 244 iq = self.stub.output[-1] 245 246 self.failUnless(xpath.matches("/iq/query[@xmlns='%s']" % (muc.NS_REQUEST), iq), 'Invalid iq register request') 247 248 response = toResponse(iq, 'result') 249 self.stub.send(response) 250 return d 233 251 234 252 def test_voice(self): 235 253 """ 254 """ 236 255 self.protocol.voice(self.room_jid.userhost()) 237 256 238 257 m = self.stub.output[-1] 239 self.failUnless(m.name=='message', "Need to be message stanza") 240 self.failUnless(getattr(m, 'x', None), 'No muc x element') 241 258 242 259 self.failUnless(xpath.matches("/message/x[@type='submit']/field/value[text()='%s']" % (muc.NS_REQUEST,), m), 'Invalid voice message stanza') 243 260 244 261 245 262 def test_roomConfigure(self): 246 247 self.fail('Not Implemented') 248 249 263 """ 264 """ 265 266 def cb(iq): 267 self.failUnless(iq['type']=='result', 'Not a result') 268 269 270 fields = [] 271 272 fields.append(data_form.Field(label='Natural-Language Room Name', 273 var='muc#roomconfig_roomname', 274 value=self.test_room)) 275 276 d = self.protocol.configure(self.room_jid.userhost(), fields) 277 d.addCallback(cb) 278 279 iq = self.stub.output[-1] 280 self.failUnless(xpath.matches("/iq/query[@xmlns='%s']/x"% (muc.NS_OWNER,), iq), 'Bad configure request') 281 282 response = toResponse(iq, 'result') 283 self.stub.send(response) 284 return d 285 286
Note: See TracChangeset
for help on using the changeset viewer.