callAt changed (is now less accurate, but in the same thread as the other callbacks)

cancelCall added
master
Stefan Krulj 14 years ago
parent 4b510b76b9
commit 504f5f6fbf
  1. 44
      brathuhn.py

@ -13,6 +13,8 @@ commands_private = dict()
group_listeners = [] group_listeners = []
private_listeners = [] private_listeners = []
status_listeners = [] status_listeners = []
call_ats = dict()
call_ats_id = 0
users = dict() users = dict()
@ -235,11 +237,21 @@ def connect_and_join():
cl.send(xmpp.Presence(to=room_to,status=NAME+" --(brathuhn bot framework (v"+VERSION+"), type !help)")) cl.send(xmpp.Presence(to=room_to,status=NAME+" --(brathuhn bot framework (v"+VERSION+"), type !help)"))
def loop(): def loop():
global last_connect
"""Loop forever and handle the event-queue.""" """Loop forever and handle the event-queue."""
global last_connect
global call_ats
while True: while True:
try: try:
cl.Process(1) cl.Process(1)
to_remove = []
for cid in call_ats:
call=call_ats[cid]
if time.time()>=call[1]:
call[0](*call[2])
to_remove.append(cid)
for cid in to_remove:
del call_ats[cid]
except xmpp.protocol.Conflict: except xmpp.protocol.Conflict:
print "detected another connection, quitting..." print "detected another connection, quitting..."
sys.exit(0) sys.exit(0)
@ -248,7 +260,7 @@ def loop():
sys.exit(0) sys.exit(0)
except: except:
print "-------ERROR OCCURED-------" print "-------ERROR OCCURED-------"
exc_type, exc_value, exc_traceback = sys.exc_info() exc_type, exc_value, exc_tracebackW = sys.exc_info()
traceback.print_tb(exc_traceback, file=sys.stdout) traceback.print_tb(exc_traceback, file=sys.stdout)
if not cl.connected: if not cl.connected:
s=MIN_CONNECT_INTERVAL-(time.time()-last_connect) s=MIN_CONNECT_INTERVAL-(time.time()-last_connect)
@ -258,10 +270,24 @@ def loop():
print "---------------------------" print "---------------------------"
def callAt(func,_time,*args): def callAt(func,_time,*args):
s=_time-time.time() """Call a function at given time; The call is not very exact but it is
def run(): guaranteed that it will happen after the specified time. The call happens
if s>0: in the same thread, so no synchronization is needed. You can append any
time.sleep(s) number of arguments you need. Returns the call id, needed to cancel a call
func(*args)
threading.Thread(target=run).start() @param func -- Function to be called
@param time -- Message body"""
global call_ats
global call_ats_id
call_ats[call_ats_id]=[func,_time,args]
call_ats_id+=1
return call_ats_id
def cancelCall(cid):
"""Remove the call from the list of pending calls
@param cid -- The id of the call to remove
"""
if cid in call_ats:
del call_ats[cid]

Loading…
Cancel
Save