~ubuntu-branches/ubuntu/utopic/gozerbot/utopic

« back to all changes in this revision

Viewing changes to debian/gozerbot/usr/lib/python2.5/site-packages/gozerplugs/plugs/relay.py

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Malcolm
  • Date: 2009-09-14 09:00:29 UTC
  • mfrom: (1.1.4 upstream) (3.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20090914090029-uval0ekt72kmklxw
Tags: 0.9.1.3-3
Changed dependency on python-setuptools to python-pkg-resources
(Closes: #546435) 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# plugs/relay.py
2
 
#
3
 
#
4
 
 
5
 
"""
6
 
 the bot can relay between different bots both IRC and Jabber ones.
7
 
 relay uses the following format.
8
 
 
9
 
 <botname> <channel> <botname> <channel>
10
 
 
11
 
 <------ from -----> <------- to ------>
12
 
"""
13
 
 
14
 
__copyright__ = 'this file is in the public domain'
15
 
__gendoclast__ = ['relay-del', ]
16
 
 
17
 
from gozerbot.commands import cmnds
18
 
from gozerbot.examples import examples
19
 
from gozerbot.callbacks import callbacks, jcallbacks
20
 
from gozerbot.fleet import fleet
21
 
from gozerbot.monitor import saymonitor, jabbermonitor
22
 
from gozerbot.datadir import datadir
23
 
from gozerbot.pdol import Pdol
24
 
from gozerbot.plughelp import plughelp
25
 
from gozerbot.ignore import shouldignore
26
 
from gozerbot.generic import rlog
27
 
from gozerbot.thr import start_new_thread
28
 
import time, os
29
 
 
30
 
plughelp.add('relay', 'relay between fleet bots or channels')
31
 
 
32
 
class Relay(Pdol):
33
 
 
34
 
    """ relay is implemented as a pickled dict of lists """
35
 
 
36
 
    def check(self, botname, channel, txt, fromm=None):
37
 
        """ check if we relay on (botname, channel) .. if so do output """
38
 
        channel = channel.lower()
39
 
        if self.data.has_key((botname, channel)):
40
 
            for i in self.data[(botname, channel)]:
41
 
                if i != (botname, channel):
42
 
                    bot = fleet.byname(i[0])
43
 
                    if bot:
44
 
                        if txt.count('[%s]' % bot.nick) > 0:
45
 
                            return
46
 
                        if not bot.stopped:
47
 
                            time.sleep(1)
48
 
                            bot.outputnolog(i[1], txt, 'msg', fromm=fromm)
49
 
 
50
 
    def wouldrelay(self, botname, channel):
51
 
        """ check if (botname, channel) would relay """
52
 
        return self.data.has_key((botname, channel.lower()))
53
 
 
54
 
    def channels(self, botname):
55
 
        """ show channels that are relayed on bot """
56
 
        result = []
57
 
        for i in self.data.keys():
58
 
            if i[0] == botname:
59
 
                result.append(i[1].lower())
60
 
        return result
61
 
 
62
 
def init():
63
 
    """ called after reload """
64
 
    saymonitor.add('relay', saycb, prerelaysay, True)
65
 
    jabbermonitor.add('relay', jabbersaycb, jabberprerelaysay, True)
66
 
    return 1
67
 
    
68
 
relay = Relay(datadir + os.sep + 'relay')
69
 
 
70
 
jabberjoined = {}
71
 
 
72
 
def size():
73
 
    """ return number of relays """
74
 
    return len(relay.data)
75
 
 
76
 
def prerelay(bot, ievent):
77
 
    """ precondition """
78
 
    if shouldignore(ievent.userhost):
79
 
        return 0
80
 
    return relay.wouldrelay(bot.name, ievent.channel)
81
 
 
82
 
def cbrelayquit(bot, ievent):
83
 
    """ relay quit callback """
84
 
    time.sleep(1)
85
 
    nick = ievent.nick.lower()
86
 
    if nick in bot.splitted:
87
 
        return
88
 
    try:
89
 
        for i in bot.userchannels[nick]:
90
 
            if i in bot.state['joinedchannels']:
91
 
                relay.check(bot.name, i, "%s (%s) quit %s - %s" % \
92
 
(ievent.nick, ievent.userhost, bot.server, ievent.txt))
93
 
    except KeyError:
94
 
        rlog(10, 'relay', 'missing %s in userchannels' % nick)
95
 
 
96
 
callbacks.add('QUIT', cbrelayquit, nr=0, threaded=True)
97
 
 
98
 
def cbrelaykick(bot, ievent):
99
 
    """ relay kick callback """
100
 
    relay.check(bot.name, ievent.channel, "%s kicked %s from %s (%s) - %s" % \
101
 
(ievent.nick, ievent.arguments[1], ievent.channel, bot.server, ievent.txt))
102
 
 
103
 
callbacks.add('KICK', cbrelaykick, prerelay, threaded=True)
104
 
 
105
 
def cbrelaynick(bot, ievent):
106
 
    """ relay nick callback """
107
 
    nick = ievent.nick.lower()
108
 
    try:
109
 
        for i in bot.userchannels[nick]:
110
 
            if i in bot.state['joinedchannels']:
111
 
                relay.check(bot.name, i, "%s is now known as %s" % \
112
 
(ievent.nick, ievent.txt))
113
 
    except KeyError:
114
 
        rlog(10, 'relay', 'missing %s in userchannels' % nick)
115
 
 
116
 
callbacks.add('NICK', cbrelaynick, threaded=True)
117
 
 
118
 
def cbrelaytopic(bot, ievent):
119
 
    """ relay topic callback """
120
 
    relay.check(bot.name, ievent.channel, "%s changed topic to %s" % \
121
 
(ievent.nick, ievent.txt))
122
 
 
123
 
callbacks.add('TOPIC', cbrelaytopic, prerelay, threaded=True)
124
 
 
125
 
def cbrelaymode(bot, ievent):
126
 
    """ callback for MODE events """
127
 
    relay.check(bot.name, ievent.channel, "mode change on %s by %s \
128
 
(%s): %s" % (bot.server, ievent.nick, ievent.userhost, ievent.postfix))
129
 
 
130
 
callbacks.add('MODE', cbrelaymode, prerelay, threaded=True)
131
 
 
132
 
def cbrelaypriv(bot, ievent):
133
 
    """ PRIVMSG relay callback """
134
 
    if not ievent.txt:
135
 
        return
136
 
    if ievent.txt[0] == '\001' and ievent.txt.find('ACTION') != -1:
137
 
        result = "[%s] *** %s" % (ievent.nick, ievent.origtxt[8:-1])
138
 
    else:
139
 
        result = "[%s] %s" % (ievent.nick, ievent.origtxt)
140
 
    relay.check(bot.name, ievent.channel, result, fromm=ievent.userhost)
141
 
 
142
 
callbacks.add('PRIVMSG', cbrelaypriv, prerelay, threaded=True)
143
 
 
144
 
def cbMessage(bot, msg):
145
 
    """ jabber relay message callback """
146
 
    if msg.usercmnd and not msg.groupchat:
147
 
        return
148
 
    if bot.google:
149
 
        result = "[%s] %s" % (msg.userhost, msg.origtxt)
150
 
    else:
151
 
        result = "[%s] %s" % (msg.nick, msg.origtxt)
152
 
    relay.check(bot.name, msg.channel, result, fromm=msg.userhost)
153
 
 
154
 
jcallbacks.add('Message', cbMessage, prerelay, threaded=True)
155
 
 
156
 
def cbPresence(bot, msg):
157
 
    """ jabber relay presence callback """
158
 
    result = None
159
 
    got = False
160
 
    if msg.type == 'unavailable':
161
 
        result = "%s (%s) left %s" % (msg.nick, msg.userhost, msg.channel)
162
 
        try:
163
 
            jabberjoined[msg.channel].remove(msg.nick)
164
 
        except (ValueError, KeyError):
165
 
            pass
166
 
    elif msg.joined:
167
 
        try:
168
 
            if msg.nick in jabberjoined[msg.channel]:
169
 
                got = True
170
 
            else:
171
 
                got = False
172
 
        except KeyError:
173
 
            got = False
174
 
        if not got:
175
 
            if not jabberjoined.has_key(msg.channel):
176
 
                jabberjoined[msg.channel] = []
177
 
            jabberjoined[msg.channel].append(msg.nick)
178
 
            if bot.timejoined.has_key(msg.channel):
179
 
                if time.time() - bot.timejoined[msg.channel] > 10:
180
 
                    result = "%s (%s) joined %s" % (msg.nick, msg.userhost, msg.channel)
181
 
    if result:
182
 
        relay.check(bot.name, msg.channel, result)
183
 
 
184
 
jcallbacks.add('Presence', cbPresence, prerelay, threaded=True)
185
 
 
186
 
def cbrelayjoin(bot, ievent):
187
 
    """ JOIN relay callback """
188
 
    if ievent.nick.lower() in bot.splitted:
189
 
        return
190
 
    relay.check(bot.name, ievent.channel, "%s (%s) joined %s on %s" % \
191
 
(ievent.nick, ievent.userhost, ievent.channel, bot.server))
192
 
 
193
 
callbacks.add('JOIN', cbrelayjoin, prerelay, nr=0, threaded=True)
194
 
 
195
 
def cbrelaypart(bot, ievent):
196
 
    """ PART relay callback """
197
 
    relay.check(bot.name, ievent.channel, "%s left %s on %s" % \
198
 
(ievent.nick, ievent.channel, bot.name))
199
 
 
200
 
callbacks.add('PART', cbrelaypart, prerelay, threaded=True)
201
 
 
202
 
def prerelaysay(botname, printto, txt, who, how, fromm):
203
 
    """ precondition on bot.say callbacks """
204
 
    return relay.wouldrelay(botname, printto)
205
 
 
206
 
def saycb(botname, printto, txt, who, how, fromm):
207
 
    """ callback for bots output """
208
 
    relay.check(botname, printto, "[bot] %s" % txt, fromm=fromm)
209
 
 
210
 
def jabberprerelaysay(bot, jmsg):
211
 
    """ precondition on bot.say callbacks """
212
 
    if jmsg:
213
 
        return relay.wouldrelay(bot.name, jmsg.to.split('/')[0])
214
 
 
215
 
def jabbersaycb(bot, jmsg):
216
 
    """ callback for bots output """
217
 
    if jmsg.botoutput and not jmsg.groupchat:
218
 
        return
219
 
    try:
220
 
        relay.check(bot.name, jmsg.to.split('/')[0], "[%s] %s" % (bot.nick, \
221
 
jmsg.txt), fromm=bot.name)
222
 
    except AttributeError:
223
 
        return
224
 
        
225
 
def handle_relaylist(bot, ievent):
226
 
    """ realy-list .. list all relays """
227
 
    result = []
228
 
    for item, value in relay.data.iteritems():
229
 
        tempstr = ""
230
 
        for relayto in value:
231
 
            tempstr += "(%s,%s) .. " % (relayto[0], relayto[1])
232
 
        tempstr = tempstr[:-4]
233
 
        result.append("(%s,%s) => %s" % (item[0], item[1], tempstr))
234
 
    if result:
235
 
        ievent.reply(result, dot=' | ')
236
 
    else:
237
 
        ievent.reply('no relays')
238
 
 
239
 
cmnds.add('relay-list', handle_relaylist, 'OPER')
240
 
examples.add('relay-list', 'list the relays', 'relay-list')
241
 
 
242
 
def handle_relayadd(bot, ievent):
243
 
    """ relay-add <botname> <channel> <botname> <channel> .. add a relay """
244
 
    try:
245
 
        (botnamefrom, channelfrom, botnameto, channelto) = ievent.args
246
 
    except ValueError:
247
 
        ievent.missing('<botnamefrom> <channelfrom> <botnameto> <channelto>')
248
 
        return
249
 
    relay[(botnamefrom, channelfrom.lower())] = (botnameto, channelto.lower())
250
 
    relay.save()
251
 
    ievent.reply('relay added')
252
 
 
253
 
cmnds.add('relay-add', handle_relayadd, 'OPER')
254
 
examples.add('relay-add', 'relay-add <botname> <channel> <botname> \
255
 
<channel> .. add bot/channel to relay', 'relay-add main #dunkbots test \
256
 
#dunkbots')
257
 
 
258
 
def handle_relaydel(bot, ievent):
259
 
    """ relay-del <botname> <channel> <botname> <channel> .. delete a relay """
260
 
    try:
261
 
        (botnamefrom, channelfrom, botnameto, channelto) = ievent.args
262
 
    except ValueError:
263
 
        ievent.missing('<botnamefrom> <channelfrom> <botnameto> <channelto>')
264
 
        return
265
 
    try:
266
 
        relay.data[(botnamefrom, channelfrom.lower())].remove((botnameto, \
267
 
channelto.lower()))
268
 
    except (KeyError, ValueError):
269
 
        ievent.reply("there is no %s %s - %s %s relay" % \
270
 
(botnamefrom, channelfrom, botnameto, channelto))
271
 
        return
272
 
    if len(relay[(botnamefrom, channelfrom.lower())]) == 0:
273
 
        del relay[(botnamefrom, channelfrom.lower())]
274
 
    relay.save()
275
 
    ievent.reply('relay deleted')
276
 
 
277
 
cmnds.add('relay-del', handle_relaydel, 'OPER')
278
 
examples.add('relay-del', 'relay-del <botname> <channel> <botname> \
279
 
<channel> .. delete bot/channel from relay', 'relay-del main #dunkbots \
280
 
test #dunkbots')