1
2
3
4
5 """ monitors .. call callback on bot output """
6
7 __copyright__ = 'this file is in the public domain'
8
9 from gozerbot.generic import rlog, handle_exception
10 from gozerbot.ircevent import Ircevent
11 from gozerbot.config import config
12 if config['jabberenable']:
13 from gozerbot.jabbermsg import Jabbermsg
14 from gozerbot.jabberpresence import Jabberpresence
15 from gozerbot.threadloop import ThreadLoop
16 from gozerbot.runner import cbrunners
17 import gozerbot.thr as thr
18 import Queue
19
21
22 """ monitor base class """
23
27
28 - def add(self, name, callback, pre, threaded=False):
29 """ add a say monitoring callback """
30 name = name.lower()
31 self.outs.append((name, callback, pre, threaded))
32 rlog(0, self.name, 'added %s (%s)' % (name, str(callback)))
33
35 """ delete monitor item """
36 name = name.lower()
37 for i in range(len(self.outs)-1, -1, -1):
38 if self.outs[i][0] == name:
39 del self.outs[i]
40
42
43 """ monitor bot output (bot.say) """
44
45 - def handle(self, botname, printto, txt, who, how, fromm):
46 """ fire saymonitor callbacks """
47 for i in self.outs:
48
49 try:
50 if i[2]:
51 doit = i[2](botname, printto, txt, who, how, fromm)
52 else:
53 doit = 1
54 except Exception, ex:
55 handle_exception()
56 doit = 0
57 if doit:
58
59 rlog(0, 'saymonitor', 'excecuting saymonitor callback %s' \
60 % i[0])
61 if not i[3]:
62 cbrunners[5].put("monitor-%s" % i[0], i[1], botname, \
63 printto, txt, who, how, fromm)
64 else:
65 thr.start_new_thread(i[1], (botname, printto, txt, who, \
66 how, fromm))
67 else:
68 rlog(9, self.name, '%s failed for %s' % (str(i[2]), str(i[1])))
69
71
72 """ monitor for bot output (bot.send) """
73
75 """ fire outmonitor callbacks """
76 ievent = Ircevent().parse(bot, txt)
77 if not ievent:
78 rlog(10, 'monitor', "can't make ircevent: %s" % txt)
79 return
80 ievent.nick = bot.nick
81 try:
82 ievent.userhost = bot.userhosts[bot.nick]
83 except KeyError:
84 ievent.userhost = "bot@bot"
85 for i in self.outs:
86
87 try:
88 if i[2]:
89 doit = i[2](bot, ievent)
90 else:
91 doit = 1
92 except Exception, ex:
93 handle_exception()
94 doit = 0
95 if doit:
96
97 rlog(0, 'outmonitor', 'excecuting outmonitor callback \
98 %s' % i[0])
99 if not i[3]:
100 cbrunners[5].put("monitor-%s" % i[0], i[1], bot, ievent)
101 else:
102 thr.start_new_thread(i[1], (bot, ievent))
103
105
106 """ monitor jabber output """
107
109 """ fire jabber monitor callbacks """
110 if not config['jabberenable']:
111 return
112 try:
113 if msg.startswith('<presence'):
114 jmsg = Jabberpresence(msg)
115 else:
116 jmsg = Jabbermsg(msg)
117 jmsg.toirc(bot)
118 jmsg.botoutput = True
119 except AttributeError:
120 return
121 for i in self.outs:
122
123 try:
124 if i[2]:
125 rlog(0, 'jabbermonitor', 'checking inloop %s' % str(i[2]))
126 doit = i[2](bot, jmsg)
127 else:
128 doit = 1
129 except Exception, ex:
130 handle_exception()
131 doit = 0
132 if doit:
133
134 rlog(0, 'jabbermonitor', 'excecuting jabbermonitor callback \
135 %s' % i[0])
136 if not i[3]:
137 cbrunners[5].put("monitor-%s" % i[0], i[1], bot, jmsg)
138 else:
139 thr.start_new_thread(i[1], (bot, jmsg))
140
141
142 outmonitor = Outmonitor('outmonitor')
143
144
145 saymonitor = Saymonitor('saymonitor')
146
147
148 jabbermonitor = Jabbermonitor('jabbermonitor')
149