1
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
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
31 thr.start_new_thread(self.dotimeout, (timeout, self.ticket))
32 return self.ticket
33
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
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
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
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
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
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
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
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
123
124 """ wait for jabber errors """
125
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