Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/isida/3.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiSabler <dissy@ya.ru>2014-02-04 22:45:56 +0400
committerdiSabler <dissy@ya.ru>2014-02-04 22:45:56 +0400
commit251e41d454bc169e3efe226dcd85dd5d38002cda (patch)
treeadc62a695b9031a4efe936977c92bf37c230896c
parent6ac39ef6a07c07bf885380cb5a64ef037a4df387 (diff)
add: lock for in timer for slow processors
-rw-r--r--plugins/muc.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/plugins/muc.py b/plugins/muc.py
index f42faa9..360956f 100644
--- a/plugins/muc.py
+++ b/plugins/muc.py
@@ -22,6 +22,7 @@
# --------------------------------------------------------------------------- #
visitors_list = {}
+visitors_list_lock = False
# -------------- affiliation -----------------
@@ -195,8 +196,13 @@ def check_unban():
for t in ul: sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':t[0]}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'none', 'jid':getRoom(unicode(t[1]))},[])])]))
cur_execute('delete from tmp_ban where time<%s;',(tt,))
+def visitors_list_lock_wait():
+ while visitors_list_lock: time.sleep(0.05)
+ return True
+
def check_visitor():
- global visitors_list
+ global visitors_list, visitors_list_lock
+ visitors_list_lock = visitors_list_lock_wait()
ITT = int(time.time())
for t in visitors_list:
room = t.split('/')[0]
@@ -205,16 +211,21 @@ def check_visitor():
reason = [xmpp.Node('reason',{},L('Too long was without voice!',t))]
if VISITOR_ACT == 'kick': sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':room}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'role':'none', 'nick':t.split('/',1)[1]},reason)])]))
else: sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':room}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'outcast', 'jid':get_jid_by_nick(t.split('/',1))},reason)])]))
+ visitors_list_lock = False
def visitor_presence(room,jid,nick,type,mass):
- global visitors_list
+ global visitors_list, visitors_list_lock
if getRoom(jid) == getRoom(Settings['jid']): return
- was_joined = not mass[7] or is_start
if type == 'error': return
elif type == 'unavailable':
+ visitors_list_lock = visitors_list_lock_wait()
try: visitors_list.pop('%s/%s' % (room,nick))
except: pass
- if mass[1] == 'visitor': visitors_list['%s/%s' % (room,nick)] = int(time.time()) + get_config_int(getRoom(room),'visitor_action_time')
+ visitors_list_lock = False
+ if mass[1] == 'visitor':
+ visitors_list_lock = visitors_list_lock_wait()
+ visitors_list['%s/%s' % (room,nick)] = int(time.time()) + get_config_int(getRoom(room),'visitor_action_time')
+ visitors_list_lock = False
global execute, timer, presence_control