Package gozerbot :: Module wait
[hide private]
[frames] | no frames]

Source Code for Module gozerbot.wait

  1  # gozerbot/wait.py 
  2  # 
  3  # 
  4   
  5  """ wait for ircevent based on ircevent.CMND """ 
  6   
  7  __copyright__ = 'this file is in the public domain' 
  8   
  9  from gozerbot.generic import rlog, lockdec 
 10  import gozerbot.thr as thr 
 11  import time, thread 
 12   
 13  waitlock = thread.allocate_lock() 
 14  locked = lockdec(waitlock) 
15 16 -class Wait(object):
17 18 """ lists of ircevents to wait for """ 19
20 - def __init__(self):
21 self.waitlist = [] 22 self.ticket = 0
23
24 - def register(self, cmnd, catch, queue, timeout=15):
25 """ register wait for cmnd """ 26 rlog(1, 'wait', 'registering for cmnd ' + cmnd) 27 self.ticket += 1 28 self.waitlist.insert(0, (cmnd, catch, queue, self.ticket)) 29 if timeout: 30 # start timeout thread 31 thr.start_new_thread(self.dotimeout, (timeout, self.ticket)) 32 return self.ticket
33
34 - def check(self, ievent):
35 """ check if there are wait items for ievent .. check if 'catch' 36 matches on ievent.postfix if so put ievent on queue """ 37 cmnd = ievent.cmnd 38 for item in self.waitlist: 39 if item[0] == cmnd: 40 if cmnd == "JOIN": 41 catch = ievent.txt + ievent.postfix 42 else: 43 catch = ievent.nick + ievent.postfix 44 if item[1] in catch: 45 ievent.ticket = item[3] 46 item[2].put_nowait(ievent) 47 self.delete(ievent.ticket) 48 rlog(1, 'wait', 'got response for %s' % item[0])
49
50 - def dotimeout(self, timeout, ticket):
51 """ start timeout thread for wait with ticket nr """ 52 rlog(1, 'wait', 'starting timeouthread for %s' % str(ticket)) 53 time.sleep(float(timeout)) 54 self.delete(ticket)
55 56 @locked
57 - def delete(self, ticket):
58 """ delete wait item with ticket nr """ 59 for itemnr in range(len(self.waitlist)-1, -1, -1): 60 if self.waitlist[itemnr][3] == ticket: 61 self.waitlist[itemnr][2].put_nowait(None) 62 del self.waitlist[itemnr] 63 rlog(1, 'wait', 'deleted ' + str(ticket)) 64 return 1
65
66 -class Privwait(Wait):
67 68 """ wait for privmsg .. catch is on nick """ 69
70 - def register(self, catch, queue, timeout=15):
71 """ register wait for privmsg """ 72 rlog(1, 'privwait', 'registering for ' + catch) 73 return Wait.register(self, 'PRIVMSG', catch, queue, timeout)
74
75 - def check(self, ievent):
76 """ check if there are wait items for ievent """ 77 for item in self.waitlist: 78 if item[0] == 'PRIVMSG': 79 if ievent.userhost == item[1]: 80 ievent.ticket = item[3] 81 item[2].put_nowait(ievent) 82 self.delete(ievent.ticket) 83 rlog(1, 'privwait', 'got response for %s' % item[0])
84
85 -class Jabberwait(Wait):
86 87 """ wait object for jabber messages """ 88
89 - def register(self, catch, queue, timeout=15):
90 """ register wait for privmsg """ 91 rlog(1, 'jabberwait', 'registering for %s' % catch) 92 self.ticket += 1 93 self.waitlist.append((catch, queue, self.ticket)) 94 if timeout: 95 thr.start_new_thread(self.dotimeout, (timeout, self.ticket)) 96 return self.ticket
97
98 - def check(self, msg):
99 """ check if <msg> is waited for """ 100 for teller in range(len(self.waitlist)-1, -1, -1): 101 i = self.waitlist[teller] 102 if i[0] == msg.userhost: 103 msg.ticket = i[2] 104 i[1].put_nowait(msg) 105 self.delete(msg.ticket) 106 rlog(1, 'jabberwait', 'got response for %s' % i[0])
107 108 @locked
109 - def delete(self, ticket):
110 """ delete wait item with ticket nr """ 111 for itemnr in range(len(self.waitlist)-1, -1, -1): 112 item = self.waitlist[itemnr] 113 if item[2] == ticket: 114 item[1].put_nowait(None) 115 try: 116 del self.waitlist[itemnr] 117 rlog(1, 'jabberwait', 'deleted ' + str(ticket)) 118 except IndexError: 119 pass 120 return 1
121
122 -class Jabbererrorwait(Jabberwait):
123 124 """ wait for jabber errors """ 125
126 - def check(self, msg):
127 """ check if <msg> is waited for """ 128 if not msg.getType() == 'error': 129 return 130 errorcode = msg.getErrorCode() 131 for teller in range(len(self.waitlist)-1, -1, -1): 132 i = self.waitlist[teller] 133 if i[0] == 'ALL' or i[0] == errorcode: 134 msg.error = msg.getError() 135 msg.ticket = i[2] 136 i[1].put_nowait(msg) 137 self.delete(msg.ticket) 138 rlog(1,'jabbererrorwait','got error response for %s' % i[0])
139