Package spade :: Module Organization
[hide private]
[frames] | no frames]

Source Code for Module spade.Organization

  1  # -*- coding: UTF8 -*- 
  2  import random 
  3  import string 
  4   
  5  from xmpp import * 
  6  from Queue import * 
  7  import Unit 
  8  import DF 
  9  import Behaviour 
 10   
 11   
12 -class CreationError(Exception):
13 - def __init__(self):
14 Exception.__init__(self)
15 -class NotValidName(CreationError):
16 - def __init__(self):
17 Exception.__init__(self)
18 -class NotValidType(CreationError):
19 - def __init__(self):
20 Exception.__init__(self)
21 -class NotValidGoal(CreationError):
22 - def __init__(self):
23 Exception.__init__(self)
24 -class NotOwner(CreationError):
25 - def __init__(self):
26 Exception.__init__(self)
27 -class NotSupervisor(CreationError):
28 - def __init__(self):
29 Exception.__init__(self)
30 -class JoinError(Exception):
31 - def __init__(self):
32 Exception.__init__(self)
33 -class PaswordNeeded(JoinError):
34 - def __init__(self):
35 pass
36 -class MembersOnly(JoinError):
37 - def __init__(self):
38 Exception.__init__(self)
39 -class BanedUser(JoinError):
40 - def __init__(self):
41 Exception.__init__(self)
42 -class NickNameConflict(JoinError):
43 - def __init__(self):
44 Exception.__init__(self)
45 -class MaximumUsers(JoinError):
46 - def __init__(self):
47 pass
48 -class LockedOrganization(JoinError):
49 - def __init__(self):
50 Exception.__init__(self)
51 -class MemberOfFederation(JoinError):
52 - def __init__(self):
53 Exception.__init__(self)
54 -class Unavailable(Exception):
55 - def __init__(self):
56 Exception.__init__(self)
57 -class UnavailableFunction(Exception):
58 - def __init__(self):
59 Exception.__init__(self)
60 -class DestroyError(Exception):
61 - def __init__(self):
62 Exception.__init__(self)
63 -class NotValidUnit(Exception):
64 - def __init__(self):
65 Exception.__init__(self)
66 -class LastOwner(Exception):
67 - def __init__(self):
68 Exception.__init__(self)
69
70 -class Organization(Unit.Unit):
71
72 - def __init__(self,agent, nick, name, type=None, goalList=None, agentList=[], contentLanguage="sl",create=True):
73 Behaviour.OneShotBehaviour.__init__(self) 74 self.myAgent=agent 75 self.name = name 76 self.type = type 77 self.goalList = goalList 78 self.agentList = agentList 79 self.contentLanguage = contentLanguage 80 self.ownerList = ownerList 81 self.platform = self.myAgent.getSpadePlatformJID() 82 self.muc_name = self.myAgent.getMUC() 83 self._roster = {} 84 self.nick=nick 85 self.create=create 86 id_base = "".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) #@UnusedVariable 87 self.ID = str(name) + str(self.myAgent.getAID().getName()) + id_base 88 self.state="unavailable" 89 self.UnavailableMsg="Organization" 90 self.members=[] 91 self.owner_admin=False
92 93
94 - def setup(self):
95 pass
96
97 - def myCreate(self):
98 if not self.checkGoal(self.goalList): 99 raise NotValidGoal 100 elif not self.checkType(): 101 raise NotVvalidType 102 elif not self.testRoomName(): 103 raise NotValidName 104 elif not self.createRoom(): 105 raise CreationError 106 else: 107 self.state="available" 108 if self.agentList!=[]: 109 #enviando invitaciones 110 self.invite(self.agentList) 111 #registrando en el DF 112 # dad = DF.DfAgentDescription() 113 # ds = DF.ServiceDescription() 114 # ds.setType("ORGANIZATION") 115 # ds.setName(self.name) 116 # dad.setAID(self.myAgent.getAID()) 117 # dad.addService(ds) 118 # res = self.myAgent.registerService(dad) 119 120 self.owner_admin=True 121 p = Presence() 122 t = Behaviour.MessageTemplate(p) 123 self.presenceBehaviour=self.PresenceBehaviour(self.muc_name,self.name,self.nick,self) 124 self.myAgent.addBehaviour(self.presenceBehaviour, t) 125 if self.type=="Matrix" or self.type=="Federation": 126 self.createTeam()
127 128
129 - def myJoin(self):
130 #The Organization exists 131 if not self.testOrganizationName(): 132 #The room no existe 133 raise NotValidName 134 elif not self.myJoinRoom(): 135 #No es una organizacion 136 #raise JoinError 137 pass 138 else: 139 info=self.getInfo() 140 if info: 141 self.type = info["type"] 142 self.contentLanguage = info["contentLanguage"] 143 self.parent=info["parent"] 144 self.goal=info["goal"] 145 self.state="available" 146 p = Presence() 147 t = Behaviour.MessageTemplate(p) 148 self.presenceBehaviour=self.PresenceBehaviour(self.muc_name,self.name,self.nick,self) 149 self.myAgent.addBehaviour(self.presenceBehaviour, t)
150 151
152 - def testRoomName(self):
153 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 154 iq = Iq(frm=self.muc_name, attrs={"id":ID}) 155 t = Behaviour.MessageTemplate(iq) 156 b=self.TestRoomNameBehaviour(ID,self.muc_name,self.name) 157 self.myAgent.addBehaviour(b, t) 158 b.join() 159 return b.result
160 161 162 163 164 165
166 - class TestRoomNameBehaviour(Behaviour.OneShotBehaviour):
167 - def __init__(self,ID,muc_name,roomname):
168 Behaviour.OneShotBehaviour.__init__(self) 169 self.ID=ID 170 self.result = False 171 self.muc_name=muc_name 172 self.roomname=roomname
173
174 - def _process(self):
175 iq = Iq(to=self.muc_name,typ='get', attrs={"id":self.ID}) 176 query = Protocol('query',xmlns="http://jabber.org/protocol/disco#items") 177 iq.addChild(node=query) 178 self.myAgent.jabber.send(iq) 179 msg = self._receive(True,10) 180 if msg: 181 if query: 182 self.result = True 183 items = msg.getQueryChildren() 184 for item in items: 185 if item.getAttr("jid") == str(self.roomname+"@"+self.muc_name): 186 self.result = False 187 else: 188 self.result = False
189
190 - def testOrganizationName(self):
191 info=self.getInfo() 192 if info: 193 if info["parent"]=="Organization": 194 return True 195 return False
196 197 198 199 200 201 202
203 - def createRoom(self):
204 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 205 p = Presence(frm=self.name+"@"+self.muc_name+"/"+self.nick) 206 t1 = Behaviour.MessageTemplate(p) 207 b=self.CreateRoomBehaviour(ID,self.muc_name,self.name,self.nick,self.contentLanguage,self.type,self.goalList) 208 self.myAgent.addBehaviour(b, t1) 209 b.join() 210 return b.result
211
212 - class CreateRoomBehaviour(Behaviour.OneShotBehaviour):
213 - def __init__(self,ID,muc_name,roomname,nick,contentLanguage,type,goal):
214 Behaviour.OneShotBehaviour.__init__(self) 215 self.result = False 216 self.ID=ID 217 self.nick=nick 218 self.muc_name=muc_name 219 self.name=roomname 220 self.contentLanguage=contentLanguage 221 self.type=type 222 self.goal=goal
223
224 - def _process(self):
225 p = Presence(to=self.name+"@"+self.muc_name+"/"+self.nick) 226 x = Protocol("x", xmlns="http://jabber.org/protocol/muc") 227 p.addChild(node=x) 228 self.myAgent.jabber.send(p) 229 msg=self._receive(True,10) 230 if msg: 231 if msg.getAttr("type")=="error": 232 print "Room creation is restricted" 233 self.result= False 234 return 235 else: 236 self.result= False 237 return 238 template= Iq(frm=self.name+"@"+self.muc_name, attrs={"id":self.ID}) 239 t = Behaviour.MessageTemplate(template) 240 self.setTemplate(t) 241 iq = Iq(to=self.name+"@"+self.muc_name,typ='get', attrs={"id":self.ID}) 242 query = Protocol('query',xmlns="http://jabber.org/protocol/muc#owner") 243 iq.addChild(node=query) 244 self.myAgent.jabber.send(iq) 245 msg = self._receive(True,10) 246 #para descartar los presence anteriores 247 while msg and msg.getName()!="iq": 248 msg = self._receive(True,10) 249 250 #setting room configuration 251 if not msg or msg.getAttr("type")=="error": 252 print "No configuration is possible: " 253 self.result= False 254 return 255 #falta por revisar!!!! 256 iq = Iq(to=self.name+"@"+self.muc_name,typ='set', attrs={"id":self.ID}) 257 query = Protocol('query',xmlns="http://jabber.org/protocol/muc#owner") 258 x=Node(tag="x", attrs={"xmlns":"jabber:x:data"," type":"submit"}) 259 resquery=msg.getQueryChildren()[0] #nos quedamos con el hijo de query 260 if resquery: items = resquery.getTags("field") 261 if resquery==None: 262 print "No configuration is possible" 263 self.result= False 264 for item in items: 265 value=None 266 if item.getAttr("var"): 267 value=item.getAttr("value") #tomamos el valor 268 if item.getAttr("var") == "muc#roomconfig_lang": 269 value=self.contentLanguage 270 if item.getAttr("var") == "muc#roomconfig_roomdesc": 271 value=self.type 272 if item.getAttr("var") == "muc#roomconfig_roomtype": 273 value="Organization" 274 if item.getAttr("var") == "muc#roomconfig_roomname": 275 value=self.name 276 if item.getAttr("var") == "muc#roomconfig_presencebroadcast": 277 value="moderator" 278 if item.getAttr("var") == "muc#roomconfig_persistentroom": 279 value="1" 280 if item.getAttr("var") == "muc#roomconfig_publicroom": 281 value="1" 282 if item.getAttr("var") == "muc#roomconfig_moderatedroom": 283 value="1" 284 if item.getAttr("var") == "muc#roomconfig_membersonly": 285 value="0" 286 if item.getAttr("var") == "muc#roomconfig_passwordprotectedroom": 287 value="0" 288 if item.getAttr("var") == "muc#roomconfig_whois": 289 value="moderators" #como es esto?? 290 if item.getAttr("var") == "muc#roomconfig_changeSubject": 291 value="0" 292 if value: 293 node=Node(tag="field", attrs={"var":item.getAttr("var")}) 294 valnode=Node(tag="value") 295 valnode.addData(value) 296 node.addChild(node=valnode) 297 x.addChild(node=node) 298 query.addChild(node=x) 299 iq.addChild(node=query) 300 self.myAgent.jabber.send(iq) 301 msg = self._receive(True,10) 302 if msg and msg.getAttr("type")=="result": #comprobar mejor el mensaje que se devuelve 303 #modifying the Room Subject 304 m = Message(to=self.name+"@"+self.muc_name, typ="groupchat") 305 sub = Node(tag="subject") 306 sub.addData(str(self.goal)) 307 m.addChild(node=sub) 308 self.myAgent.jabber.send(m) 309 self.result= True 310 else: 311 self.result= False
312
313 - def createTeam(self):
314 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 315 p = Presence(frm="Team:"+self.name+"@"+self.muc_name+"/"+self.nick) 316 t1 = Behaviour.MessageTemplate(p) 317 b=self.CreateTeamBehaviour(ID,self.muc_name,self.name,self.nick,self.contentLanguage,self.goalList,self.agentList) 318 self.myAgent.addBehaviour(b, t1) 319 b.join() 320 return b.result
321
322 - class CreateTeamBehaviour(Behaviour.OneShotBehaviour):
323 - def __init__(self,ID,muc_name,roomname,nick,contentLanguage,goal,agentList):
324 Behaviour.OneShotBehaviour.__init__(self) 325 self.result = False 326 self.ID=ID 327 self.nick=nick 328 self.muc_name=muc_name 329 self.name="Team:"+roomname 330 self.parent=roomname 331 self.contentLanguage=contentLanguage 332 self.type="Team" 333 self.goal=goal 334 self.agentList=agentList
335
336 - def _process(self):
337 p = Presence(to=self.name+"@"+self.muc_name+"/"+self.nick) 338 x = Protocol("x", xmlns="http://jabber.org/protocol/muc") 339 p.addChild(node=x) 340 self.myAgent.jabber.send(p) 341 msg=self._receive(True,10) 342 if msg: 343 if msg.getAttr("type")=="error": 344 print "Room creation is restricted" 345 self.result= False 346 return 347 else: 348 self.result= False 349 return 350 template= Iq(frm=self.name+"@"+self.muc_name, attrs={"id":self.ID}) 351 t = Behaviour.MessageTemplate(template) 352 self.setTemplate(t) 353 iq = Iq(to=self.name+"@"+self.muc_name,typ='get', attrs={"id":self.ID}) 354 query = Protocol('query',xmlns="http://jabber.org/protocol/muc#owner") 355 iq.addChild(node=query) 356 self.myAgent.jabber.send(iq) 357 msg = self._receive(True,10) 358 #para descartar los presence anteriores 359 while msg and msg.getName()!="iq": 360 msg = self._receive(True,10) 361 362 #setting room configuration 363 if not msg or msg.getAttr("type")=="error": 364 print "No configuration is possible: " 365 self.result= False 366 return 367 #falta por revisar!!!! 368 iq = Iq(to=self.name+"@"+self.muc_name,typ='set', attrs={"id":self.ID}) 369 query = Protocol('query',xmlns="http://jabber.org/protocol/muc#owner") 370 x=Node(tag="x", attrs={"xmlns":"jabber:x:data"," type":"submit"}) 371 resquery=msg.getQueryChildren()[0] #nos quedamos con el hijo de query 372 if resquery: items = resquery.getTags("field") 373 if resquery==None: 374 print "No configuration is possible" 375 self.result= False 376 for item in items: 377 value=None 378 if item.getAttr("var"): 379 value=item.getAttr("value") #tomamos el valor 380 if item.getAttr("var") == "muc#roomconfig_lang": 381 value=self.contentLanguage 382 if item.getAttr("var") == "muc#roomconfig_roomdesc": 383 value=self.type 384 if item.getAttr("var") == "muc#roomconfig_roomtype": 385 value="Unit:"+self.parent 386 if item.getAttr("var") == "muc#roomconfig_roomname": 387 value=self.name 388 if item.getAttr("var") == "muc#roomconfig_presencebroadcast": 389 value="moderator" 390 if item.getAttr("var") == "muc#roomconfig_persistentroom": 391 value="1" 392 if item.getAttr("var") == "muc#roomconfig_publicroom": 393 value="1" 394 if item.getAttr("var") == "muc#roomconfig_moderatedroom": 395 value="0" 396 if item.getAttr("var") == "muc#roomconfig_membersonly": 397 value="1" 398 if item.getAttr("var") == "muc#roomconfig_passwordprotectedroom": 399 value="0" 400 if item.getAttr("var") == "muc#roomconfig_whois": 401 value="anyone" #como es esto?? 402 if item.getAttr("var") == "muc#roomconfig_changeSubject": 403 value="0" 404 if value: 405 node=Node(tag="field", attrs={"var":item.getAttr("var")}) 406 valnode=Node(tag="value") 407 valnode.addData(value) 408 node.addChild(node=valnode) 409 x.addChild(node=node) 410 query.addChild(node=x) 411 iq.addChild(node=query) 412 self.myAgent.jabber.send(iq) 413 msg = self._receive(True,10) 414 if msg and msg.getAttr("type")=="result": #comprobar mejor el mensaje que se devuelve 415 #añadiendo los members invitacion 416 for agent in self.agentList: 417 iq = Iq(to=self.name+"@"+self.muc_name,typ='set', attrs={"id":self.ID}) 418 query = Protocol('query',xmlns="http://jabber.org/protocol/muc#admin") 419 item= Node(tag="item", attrs={"affiliation":"owner","jid":agent}) 420 query.addChild(node=item) 421 iq.addChild(node=query) 422 self.myAgent.jabber.send(iq) 423 m = Message(to=self.name+"@"+self.muc_name, typ="groupchat") 424 sub = Node(tag="subject") 425 sub.addData(str(self.goal)) 426 m.addChild(node=sub) 427 self.myAgent.jabber.send(m) 428 self.result= True 429 else: 430 self.result= False
431
432 - def checkGoal(self,goalList):
433 #falta por implementar 434 if goalList!=None: 435 return True 436 else: 437 return False
438 439
440 - def checkType(self):
441 types=("Flat","Team","Hierarchy","Bureaucracy","Matrix","Federation","Coalition","Congregation") 442 if self.type in types: 443 return True 444 return False
445
446 - def invite(self,agentList):
447 if self.state=="unavailable": 448 raise Unavailable 449 return 450 for agent in agentList: 451 message = Node(tag="message", attrs={"to":self.name+"@"+self.muc_name}) 452 x=Node(tag="x",attrs={"xmlns":"http://jabber.org/protocol/muc#user"}) 453 y=Node(tag="invite",attrs={"to":agent}) 454 r=Node(tag="reason") 455 r.addData("Inivitation to the Organization "+self.name) 456 y.addChild(node=r) 457 x.addChild(node=y) 458 message.addChild(node=x) 459 self.myAgent.jabber.send(message)
460
461 - def myJoinRoom(self):
462 p = Presence(frm=self.name+"@"+self.muc_name+"/"+self.nick,attrs={"type":"error"}) 463 t1 = Behaviour.MessageTemplate(p) 464 b=self. MyJoinRoomBehaviour(self.muc_name,self.name,self.nick) 465 self.myAgent.addBehaviour(b, t1) 466 b.join() 467 return b.result
468
469 - class MyJoinRoomBehaviour(Behaviour.OneShotBehaviour):
470 - def __init__(self,muc_name,roomname,nick):
471 Behaviour.OneShotBehaviour.__init__(self) 472 self.result = False 473 self.nick=nick 474 self.muc_name=muc_name 475 self.name=roomname
476 477
478 - def _process(self):
479 p = Presence(to=self.name+"@"+self.muc_name+"/"+self.nick) 480 x = Protocol("x", xmlns="http://jabber.org/protocol/muc") 481 p.addChild(node=x) 482 self.myAgent.jabber.send(p) 483 msg=self._receive(True,10) 484 if msg: 485 error=msg.getTag("error") 486 if error.getAttr("code")=="401": 487 raise PaswordNeeded 488 if error.getAttr("code")=="407": 489 raise MembersOnly 490 if error.getAttr("code")=="403": 491 raise BanedUser 492 if error.getAttr("code")=="409": 493 raise NickNameConflict 494 if error.getAttr("code")=="503": 495 raise MaximumUsers 496 if error.getAttr("code")=="404": 497 raise LockedOrganization 498 self.result = False 499 return 500 self.result = True
501
502 - def getRegistrationForm(self,unitName):
503 """ 504 Returns a dataform with all requested information for joining 505 """ 506 if self.state=="unavailable": 507 raise Unavailable 508 return 509 if unitName not in self.getUnitList(): 510 raise NotValidUnit 511 return 512 513 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 514 p = Iq(frm=unitName+"@"+self.muc_name, attrs={"id":ID}) 515 t1 = Behaviour.MessageTemplate(p) 516 b=self.GetRegistrationFormBehaviour(self.muc_name,ID,unitName) 517 self.myAgent.addBehaviour(b, t1) 518 b.join() 519 return b.result
520
521 - class GetRegistrationFormBehaviour(Behaviour.OneShotBehaviour):
522 - def __init__(self,muc_name,ID,unitName):
523 Behaviour.OneShotBehaviour.__init__(self) 524 self.ID=ID 525 self.muc_name=muc_name 526 self.unitName=unitName 527 self.result=None
528
529 - def _process(self):
530 iq = Iq(to=self.unitName+"@"+self.muc_name,typ='get', attrs={"id":self.ID}) 531 query = Protocol('query',xmlns="jabber:iq:register") 532 iq.addChild(node=query) 533 self.myAgent.jabber.send(iq) 534 msg = self._receive(True,10) 535 if msg: 536 if msg.getAttr("type")!="result": 537 error=msg.getError() 538 print error 539 return 540 else: 541 if msg.getTag("register")!=None: 542 print "The agent has yet registered in the Unit "+self.unitName 543 else: 544 self.result=msg.getChildren()[0]
545 #cambiar
546 - def sendRegistrationForm(self,unitName,dataForm):
547 """ 548 Sends a dataform for a specific unit. If valid, agent is registered and allowed to join 549 """ 550 if self.state=="unavailable": 551 raise Unavailable 552 return 553 #comprobando que es una unidad de la organizacion 554 if unitName not in self.getUnitList(): 555 raise NotValidUnit 556 return 557 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 558 p = Iq(frm=unitName+"@"+self.muc_name, attrs={"id":ID}) 559 t1 = Behaviour.MessageTemplate(p) 560 b=self.GetRegistrationFormBehaviour(self.muc_name,self.name,ID,unitName,dataForm) 561 self.myAgent.addBehaviour(b, t1) 562 b.join() 563 return b.result
564
565 - class SendRegistrationFormBehaviour(Behaviour.OneShotBehaviour):
566 - def __init__(self,muc_name,roomname,ID,unitName,dataForm):
567 Behaviour.OneShotBehaviour.__init__(self) 568 self.ID=ID 569 self.muc_name=muc_name 570 self.name=roomname 571 self.unitName=unitName 572 self.dataForm=dataForm 573 self.result=None
574
575 - def _process(self):
576 iq = Iq(to=self.unitName+"@"+self.muc_name,typ='set', attrs={"id":self.ID}) 577 query = Protocol('query',xmlns="jabber:iq:register") 578 query.addNode(node=self.dataForm) 579 iq.addChild(node=query) 580 self.myAgent.jabber.send(iq) 581 msg = self._receive(True,10) 582 if msg: 583 if msg.getAttr("type")!="result": 584 error=msg.getTag("error") 585 if error.getAttr("code")=="409": 586 print "Error: Conflict, this nickname is already reserved" 587 if error.getAttr("code")=="503": 588 print "Error: Resgistration Not Supported" 589 if error.getAttr("code")=="400": 590 print "Error: Bad Request"
591
592 - def getUnitList(self):
593 """ 594 Returns a dataform with all requested information for joining 595 """ 596 if self.state=="unavailable": 597 raise Unavailable 598 return 599 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 600 iq = Iq(frm=self.muc_name, attrs={"id":ID}) 601 t = Behaviour.MessageTemplate(iq) 602 b=self.GetUnitListBehaviour(ID,self.muc_name,self.name) 603 self.myAgent.addBehaviour(b, t) 604 b.join() 605 return b.result
606 607 608 609 610
611 - class GetUnitListBehaviour(Behaviour.OneShotBehaviour):
612 - def __init__(self,ID,muc_name,roomname):
613 Behaviour.OneShotBehaviour.__init__(self) 614 self.ID=ID 615 self.result = [] 616 self.muc_name=muc_name 617 self.roomname=roomname
618
619 - def _process(self):
620 self.result=[] 621 iq = Iq(to=self.muc_name,typ='get', attrs={"id":self.ID}) 622 query = Protocol('query',xmlns="http://jabber.org/protocol/disco#items") 623 iq.addChild(node=query) 624 self.myAgent.jabber.send(iq) 625 msg = self._receive(True,10) 626 if msg: 627 if query: 628 items = msg.getQueryChildren() 629 for item in items: 630 if item.getAttr("jid"): 631 iq = Iq(to=item.getAttr("jid"),typ='get', attrs={"id":self.ID}) 632 query = Protocol('query',xmlns="http://jabber.org/protocol/disco#info") 633 iq.addChild(node=query) 634 name=str(item.getAttr("name")) 635 self.myAgent.jabber.send(iq) 636 template = Iq(frm=item.getAttr("jid"),typ='result', attrs={"id":self.ID}) 637 t = Behaviour.MessageTemplate(template) 638 self.setTemplate(t) 639 msg = self._receive(True,10) 640 if msg: 641 query = msg.getTag("query") 642 if query: 643 x = query.getTag("x") 644 if x: 645 items =x.getChildren() 646 for item in items: 647 value=None 648 if item.getAttr("var")=="muc#roominfo_type": 649 if item.getTags("value"): 650 value=item.getTags("value")[0].getData() 651 if value=="Unit:"+self.roomname: 652 self.result.append(name)
653
654 - def getUnitInfo(self,unitname):
655 if self.state=="unavailable": 656 raise Unavailable 657 return 658 if unitname not in selg.getUnitList(): 659 raise NotValidUnit 660 return 661 662 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 663 p = Iq(frm=self.name+"@"+self.muc_name,typ='result', attrs={"id":ID}) 664 t1 = Behaviour.MessageTemplate(p) 665 b=self.GetUnitInfoBehaviour(self.muc_name,unitname,ID) 666 self.myAgent.addBehaviour(b, t1) 667 b.join() 668 return b.result
669 670
671 - class GetUnitInfoBehaviour(Behaviour.OneShotBehaviour):
672 - def __init__(self,muc_name,roomname,ID):
673 Behaviour.OneShotBehaviour.__init__(self) 674 self.ID=ID 675 self.muc_name=muc_name 676 self.name=roomname 677 self.result=None
678
679 - def _process(self):
680 info={} 681 iq = Iq(to=self.name+"@"+self.muc_name,typ='get', attrs={"id":self.ID}) 682 query = Protocol('query',xmlns="http://jabber.org/protocol/disco#info") 683 iq.addChild(node=query) 684 self.myAgent.jabber.send(iq) 685 msg=self._receive(True,10) 686 if msg: 687 query = msg.getTag("query") 688 if query: 689 x = query.getTag("x") 690 if x: 691 items =x.getChildren() 692 for item in items: 693 if item.getAttr("var")=="muc#roominfo_description": 694 if item.getTags("value"): 695 info["type"]=item.getTags("value")[0].getData() 696 if item.getAttr("var")=="muc#roominfo_subject": 697 if item.getTags("value"): 698 info["goal"]=item.getTags("value")[0].getData() 699 if item.getAttr("var")=="muc#roominfo_type": 700 if item.getTags("value"): 701 info["contentLanguage"]=item.getTags("value")[0].getData() 702 self.result=info
703
704 - def leave(self):
705 """ 706 Agent leaves and it is removed from the member list 707 """ 708 if self.state=="unavailable": 709 raise Unavailable 710 return 711 owners=self.getOwnerList() 712 if self.myAgent.JID not in owners or len(owners)>1: 713 units=self.getUnitList() 714 units.append(self.name) 715 for u in units: 716 p = Presence(to=u+"@"+self.muc_name+"/"+self.nick,typ="unavailable") 717 self.myAgent.jabber.send(p) 718 self.state="unavailable" 719 self.myAgent.removeBehaviour(self.presenceBehaviour) 720 self.myAgent.removeBehaviour(self) 721 else: 722 raise LastOwner
723
724 - def destroy(self):
725 #deberia implicar dejar tambien las salas de la organizacion??? 726 """ 727 Organization owner destroys the organization 728 """ 729 if self.state=="unavailable": 730 raise Unavailable 731 return 732 if self.getUnitList==[]: 733 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 734 p = Iq(frm=self.name+"@"+self.muc_name, attrs={"id":ID}) 735 t1 = Behaviour.MessageTemplate(p) 736 b=self.DestroyBehaviour(self.muc_name,self.name,ID) 737 self.myAgent.addBehaviour(b, t1) 738 b.join() 739 if b.result: 740 #destruir los comportamientos 741 self.myAgent.removeBehaviour(self.presenceBehaviour) 742 self.myAgent.removeBehaviour(self) 743 self.state="unavailable" 744 #destruir las unidades 745 else: 746 raise DestroyError
747 748
749 - class DestroyBehaviour(Behaviour.OneShotBehaviour):
750 - def __init__(self,muc_name,roomname,ID):
751 Behaviour.OneShotBehaviour.__init__(self) 752 self.ID=ID 753 self.muc_name=muc_name 754 self.name=roomname 755 self.result=False
756
757 - def _process(self):
758 iq = Iq(to=self.name+"@"+self.muc_name,typ='set', attrs={"id":self.ID}) 759 query = Protocol('query',xmlns="http://jabber.org/protocol/muc#owner") 760 item= Node(tag="destroy") 761 query.addChild(node=item) 762 iq.addChild(node=query) 763 self.myAgent.jabber.send(iq) 764 msg = self._receive(True,10) 765 if msg: 766 if msg.getAttr("type")!="result": 767 #print "Error: This agent is not a owner of the organization" 768 print msg.getError() 769 return 770 else: 771 self.result=True
772 773
774 - def joinUnit(self,unit):
775 if self.state=="unavailable": 776 raise Unavailable 777 return 778 if unit.name not in self.getUnitList(): 779 raise NotValidUnit 780 return 781 if self.type=="Federation": 782 if self.checkIsMember(unit.name): 783 raise MemberOfFederation 784 return 785 unit.create=False 786 self.myAgent.addBehaviour(unit)
787 788
789 - def checkIsMember(self,unit):
790 ismember=False 791 units=self.getUnitList() 792 if unit in units: 793 units.remove(unit) 794 team="Team:"+self.name 795 if team in units: 796 units.remove(team) 797 jid=str(self.myAgent.JID) 798 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 799 p = Iq(frm=jid, attrs={"id":ID}) 800 t1 = Behaviour.MessageTemplate(p) 801 b=self.IsMemberBehaviour(jid,ID) 802 self.myAgent.addBehaviour(b, t1) 803 b.join() 804 b.result 805 for u in units: 806 if u in b.result: 807 ismember=True 808 return ismember
809
810 - class IsMemberBehaviour(Behaviour.OneShotBehaviour):
811 - def __init__(self,jid,ID):
812 Behaviour.OneShotBehaviour.__init__(self) 813 self.ID=ID 814 self.jid=jid 815 self.result=[]
816
817 - def _process(self):
818 iq = Iq(to=self.jid,typ='get', attrs={"id":self.ID}) 819 query = Protocol('query',xmlns="http://jabber.org/protocol/disco#items",attrs={"node":"http://jabber.org/protocol/muc#rooms"}) 820 iq.addChild(node=query) 821 self.myAgent.jabber.send(iq) 822 msg = self._receive(True,10) 823 if msg: 824 items =msg.getChildren() 825 for item in items: 826 if item.getAttr("jid"): 827 sala=str(item.getAttr("jid")) 828 self.result.append(sala.split('@')[0])
829 830 831 832 833
834 - def addUnit(self,unit):
835 """ 836 Creates a new unit inside an organization 837 """ 838 if self.state=="unavailable": 839 raise Unavailable 840 return 841 if self.checkTypes(self.type,unit.type): 842 #un sitwch para aquellas organizaciones donde todos puedan crear unidades 843 if self.type!="Matrix" and self.type!="Federation": 844 if self.checkOwner(self.myAgent.JID): 845 unit.create=True 846 unit.parent=self.name 847 unit.parent_type=self.type 848 self.myAgent.addBehaviour(unit) 849 else: 850 raise NotOwner 851 elif self.checkSupervisor(self.myAgent.JID): 852 unit.create=True 853 unit.parent=self.name 854 unit.parent_type=self.type 855 self.myAgent.addBehaviour(unit) 856 else: 857 raise NotSupervisor 858 else: 859 raise NotValidType
860
861 - def checkTypes(self,orgType,unitType):
862 if orgType=="Flat": 863 return True 864 if orgType=="Team" and unitType=="Team": 865 return True 866 if orgType=="Hierarchy" and unitType=="Hierarchy": 867 return True 868 if orgType=="Bureaucracy" and unitType=="Hierarchy": 869 return True 870 if orgType=="Matrix" and unitType=="Hierarchy": 871 return True 872 if orgType=="Federation" and unitType=="Hierarchy": 873 return True 874 if orgType=="Coalition" and unitType=="Team": 875 return True 876 if orgType=="Congregation" and unitType=="Hierarchy": 877 return True 878 if orgType=="Congregation" and unitType=="Team": 879 return True 880 if orgType=="Congregation" and unitType=="Flat": 881 return True 882 return False
883
884 - def checkOwner(self,agentJID):
885 ownerList=self.getOwnerList() 886 try: 887 ownerList.index(agentJID) 888 except: 889 return False 890 return True
891 892
893 - def getSupervisorList(self):
894 list=[] 895 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 896 p = Iq(frm="Team:"+self.name+"@"+self.muc_name, attrs={"id":ID}) 897 t1 = Behaviour.MessageTemplate(p) 898 b=self.GetMemberListBehaviour(self.muc_name,"Team:"+self.name,ID) 899 self.myAgent.addBehaviour(b, t1) 900 b.join() 901 member=b.result 902 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 903 p = Iq(frm="Team:"+self.name+"@"+self.muc_name, attrs={"id":ID}) 904 t = Behaviour.MessageTemplate(p) 905 b=self.GetOwnerListBehaviour(self.muc_name,"Team:"+self.name,ID) 906 self.myAgent.addBehaviour(b, t) 907 b.join() 908 owner=b.result 909 ID="".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(5)]) 910 p = Iq(frm=self.name+"@"+self.muc_name, attrs={"id":ID}) 911 t = Behaviour.MessageTemplate(p) 912 b=self.GetAdminListBehaviour(self.muc_name,"Team:"+self.name,ID) 913 self.myAgent.addBehaviour(b, t) 914 b.join() 915 admin=b.result 916 for i in owner: 917 list.append(i) 918 for i in member: 919 list.append(i) 920 for i in admin: 921 list.append(i) 922 return list
923
924 - def sendMessage(self,message):
926
927 - def sendPrivateMessage(self,recName,message):
929
930 - def giveVoice(self,nickname):
932
933 - def revokeVoice(self,nickname):
935
936 - def _process(self):
937 pass
938