1
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
69
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)])
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
96
127
128
150
151
160
161
162
163
164
165
167 - def __init__(self,ID,muc_name,roomname):
173
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
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
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
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
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
247 while msg and msg.getName()!="iq":
248 msg = self._receive(True,10)
249
250
251 if not msg or msg.getAttr("type")=="error":
252 print "No configuration is possible: "
253 self.result= False
254 return
255
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]
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")
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"
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":
303
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
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
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
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
359 while msg and msg.getName()!="iq":
360 msg = self._receive(True,10)
361
362
363 if not msg or msg.getAttr("type")=="error":
364 print "No configuration is possible: "
365 self.result= False
366 return
367
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]
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")
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"
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":
415
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
433
434 if goalList!=None:
435 return True
436 else:
437 return False
438
439
441 types=("Flat","Team","Hierarchy","Bureaucracy","Matrix","Federation","Coalition","Congregation")
442 if self.type in types:
443 return True
444 return False
445
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
468
470 - def __init__(self,muc_name,roomname,nick):
476
477
501
520
545
564
591
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
612 - def __init__(self,ID,muc_name,roomname):
618
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
669
670
672 - def __init__(self,muc_name,roomname,ID):
678
703
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
747
748
750 - def __init__(self,muc_name,roomname,ID):
756
772
773
787
788
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
829
830
831
832
833
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
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
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
885 ownerList=self.getOwnerList()
886 try:
887 ownerList.index(agentJID)
888 except:
889 return False
890 return True
891
892
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
926
929
932
935
938