comparison bot.py @ 155:63db565438bd

fixed the halt command Signed-off-by: Charly COSTE <changaco@changaco.net>
author Charly COSTE <changaco@changaco.net>
date Sun, 17 Jan 2010 23:24:00 +0100
parents 17305e57f71d
children 3f299ad4d452
comparison
equal deleted inserted replaced
154:25f6778b8841 155:63db565438bd
35 35
36 class Bot(threading.Thread): 36 class Bot(threading.Thread):
37 37
38 def __init__(self, jid, password, nickname, admins_jid=[], error_fd=sys.stderr, debug=False): 38 def __init__(self, jid, password, nickname, admins_jid=[], error_fd=sys.stderr, debug=False):
39 threading.Thread.__init__(self) 39 threading.Thread.__init__(self)
40 self.halt = False
40 self.bare_jid = xmpp.protocol.JID(jid=jid) 41 self.bare_jid = xmpp.protocol.JID(jid=jid)
41 self.bare_jid.setResource('') 42 self.bare_jid.setResource('')
42 self.nickname = nickname 43 self.nickname = nickname
43 self.password = password 44 self.password = password
44 self.error_fd = error_fd 45 self.error_fd = error_fd
74 75
75 def _xmpp_loop(self): 76 def _xmpp_loop(self):
76 """[Internal] XMPP infinite loop.""" 77 """[Internal] XMPP infinite loop."""
77 i = 1 78 i = 1
78 while True: 79 while True:
80 if self.halt:
81 s = len(self.xmpp_connections)
82 for i in range(s):
83 self.close_xmpp_connection(self.xmpp_connections.keys()[s-i-1], force=True)
84 break
79 unlock = False 85 unlock = False
80 try: 86 try:
81 if len(self.xmpp_connections) == 1: 87 if len(self.xmpp_connections) == 1:
82 sleep(0.5) # avoid bot connection being locked all the time 88 sleep(0.5) # avoid bot connection being locked all the time
83 for j, c in enumerate(self.xmpp_connections.itervalues()): 89 for j, c in enumerate(self.xmpp_connections.itervalues()):
778 for m in c.mucs: 784 for m in c.mucs:
779 m.rejoin() 785 m.rejoin()
780 return c 786 return c
781 787
782 788
783 def close_xmpp_connection(self, nickname): 789 def close_xmpp_connection(self, nickname, force=False):
784 if not self.xmpp_connections.has_key(nickname): 790 if not self.xmpp_connections.has_key(nickname):
785 return 791 return
786 c = self.xmpp_connections[nickname] 792 c = self.xmpp_connections[nickname]
787 c.lock.acquire() 793 c.lock.acquire()
788 c.used_by -= 1 794 c.used_by -= 1
789 if c.used_by < 1: 795 if c.used_by < 1 or force:
790 self.error('===> Debug: closing XMPP connection for "'+nickname+'"', debug=True) 796 self.error('===> Debug: closing XMPP connection for "'+nickname+'"', debug=True)
791 self.xmpp_connections.pop(nickname) 797 self.xmpp_connections.pop(nickname)
792 c.send(xmpp.protocol.Presence(typ='unavailable')) 798 c.send(xmpp.protocol.Presence(typ='unavailable'))
793 c.lock.release() 799 c.lock.release()
794 del c 800 del c
844 self.error(error_message, send_to_admins=True) 850 self.error(error_message, send_to_admins=True)
845 851
846 852
847 def stop(self, message='Stopping bot'): 853 def stop(self, message='Stopping bot'):
848 for bridge in self.bridges: 854 for bridge in self.bridges:
855 bridge.stop(message=message)
856
857
858 def __del__(self):
859 for bridge in self.bridges:
849 self.removeBridge(bridge, message=message) 860 self.removeBridge(bridge, message=message)
850 861 self.halt = True
851
852 def __del__(self):
853 self.stop()