source: slavebot/slavebot.py

Last change on this file was 2, checked in by mancausoft, 13 years ago

Added slavebot and Radio rai downloader

  • Property svn:executable set to *
File size: 9.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Copyright (C) 2007  Daniele Tricoli aka Eriol <eriol@mornie.org>
5# Copyright (C) 2010 Andrea Milazzo aka mancausoft <me@mancausoft.org>
6#
7#  Daniele Tricoli, 2010 Reliceinsed to WTFPL
8#
9#  This Program is free software. It comes without any warranty, to
10#  the extent permitted by applicable law. You can redistribute it
11#  and/or modify it under the terms of the Do What The Fuck You Want
12#  To Public License, Version 2, as published by Sam Hocevar. See
13#  http://sam.zoy.org/wtfpl/COPYING for more details.
14
15
16import os
17import re
18
19from twisted.words.protocols import irc
20from twisted.internet import reactor, protocol, ssl
21
22from dataslavebot import *
23
24import logging as log
25log.basicConfig(level=log.DEBUG,
26                format='[%(asctime)s] %(levelname)s %(message)s',
27                datefmt='%d/%m/%Y %H:%M:%S %Z',
28                filename='slavebot.log',
29                filemode='a')
30console = log.StreamHandler()
31console.setLevel(log.INFO)
32log.getLogger().addHandler(console)
33
34
35def save():
36    f = open('dataslavebot.py', 'w')
37    f.write('BOT_NICKNAME = "' + BOT_NICKNAME +'"\n')
38    f.write('MASTER_USER = ' + str(MASTER_USER))
39    f.write('\n\nRE_CONV = ' + str(RE_CONV))
40    f.write('\nRE_CONV_ME = ' + str(RE_CONV_ME))
41    f.write("\nOP_BOT = '"+ OP_BOT + "'\n")
42    f.write('SERVER = '+ str(SERVER))
43
44class SlaveBot(irc.IRCClient):
45
46    nickname = BOT_NICKNAME
47
48    def __init__(self):
49        self.op = False
50        self.nicks = {}
51
52    def opOnlyMaster (self, nick, channel):
53        if ((nick in MASTER_USER) or (nick[:-1] in MASTER_USER) or (nick[:-2] in MASTER_USER)) and self.op:
54            if nick == "tosky":
55                self.msg(channel, "Ďekuji vám, pane " + nick + ", protože mi jste ctíl jako operátor.")
56            elif nick == "geenna":
57                self.msg(channel, "Grazie mio padrone " + nick + " mettiti a 90 che cominciamo!.")
58            else:
59                self.msg(channel, "Grazie mio padrone " + nick + " per avermi dato l'onore di poterti oppare.")
60            self.sendLine('MODE ' + channel + ' +o ' + nick)
61            self.nicks[nick] = 1
62 
63    def signedOn(self):
64        log.info('Signed On:')
65        for chan in self.factory.channel:
66            self.join(chan)
67
68    def joined(self, channel):
69        log.info('Joined: %s', channel)
70        self.nicks = {}
71        self.msg(channel, "Grazie di avermi creato, datemi l'onore del'op e saro' il vostro schiavo per il resto della mia vita")
72
73    def action (self, username, channel, emote):
74        if (emote.find("si inchina") != -1) or (emote.find("s'inchina") != -1):
75            self.msg(channel, username.split('!')[0] + ": Stai attento in questo canale e' pericoloso fare cose del genere!")
76
77    def userLeft (self, user, channel):
78        del self.nicks[user]
79
80    def userRenamed(self, oldname, newname):
81        self.nicks[newname] = self.nicks[oldname]
82        del self.nicks[oldname]
83
84    def userJoined (self, user, channel):
85        self.me(channel, "si prostra davanti a " + user)
86        self.nicks[user] = 0
87        self.opOnlyMaster(user, channel)
88
89    def irc_RPL_NAMREPLY(self, prefix, params):
90        log.info('irc_RPL_NAMREPLY')
91        nicks = params[3].split()
92        for nick in nicks:
93           if nick[0] == '@':
94               self.nicks[nick[1:]] =  1
95           else:
96               self.nicks[nick] = 0
97        if OP_BOT in self.nicks.keys():
98            self.msg(params[2], "ciao " + OP_BOT)
99
100    def irc_ERR_NICKNAMEINUSE (self, prefix, params):
101       self.nickname = self.nickname + "_"
102       self.setNick(self.nickname)
103
104    def privmsg(self, user, channel, message):
105        user = user.split('!')[0]
106        if channel != self.nickname:
107           for regexp in RE_CONV:
108              rexp = re.sub('(?i)\$bot', self.nickname, regexp)
109              try:
110                if re.search(rexp, message, re.IGNORECASE):
111                  msg = re.sub('(?i)\$nick', user, RE_CONV[regexp])
112                  self.msg(channel, re.sub('(?i)\$bot', self.nickname, msg))
113              except:
114                  print "ERRORE PORC!"
115           for regexp in RE_CONV_ME:
116              rexp = re.sub('(?i)\$bot', self.nickname, regexp)
117              if re.search(rexp, message, re.IGNORECASE):
118                  msg =re.sub('(?i)\$nick', user, RE_CONV_ME[regexp])
119                  self.me(channel, re.sub('(?i)\$bot', self.nickname, msg))       
120           if re.search(self.nickname, message, re.IGNORECASE):
121               if re.search('aiutami|help', message, re.IGNORECASE):
122                   self.msg(channel, self.polygen('if')[:440].rsplit('.',1)[0] + '.')
123               elif re.search('spot', message, re.IGNORECASE):
124                   self.msg(channel, self.polygen('poster').replace('\n',''))
125               elif re.search('consigli', message, re.IGNORECASE):
126                   msg = self.polygen('kamasutra')
127                   m = re.search('(?i)\<strong\> (.*) \</strong\>', msg)
128                   message =  m.groups()[0]
129                   m = re.search('\</strong\>.*\n.*\n+(.*)', msg)
130                   message += ': ' + m.groups()[0]
131                   self.msg(channel, message)
132
133        else:
134           if re.match('(?i) *LIST( |$)', message):
135               self.msg(user, "MESSAGE: ")
136               for i in RE_CONV:
137                   self.msg(user, i + " -> " + RE_CONV[i])
138               self.msg(user, "/ME: ")
139               for i in RE_CONV_ME:
140                   self.msg(user, i + " -> " + RE_CONV_ME[i])
141
142           m = re.match('(?i) *ADD +"(.*)".*,.*"(.*)"', message)
143           if m:
144               RE_CONV[m.groups()[0]] = m.groups()[1]
145               for i in RE_CONV:
146                   self.msg(user, i + " -> " + RE_CONV[i])
147               log.info(user + ": "+ message)
148               save()
149
150           m = re.match('(?i) *DEL +"(.*)".*', message)
151           if m:
152               del RE_CONV[m.groups()[0]]
153               for i in RE_CONV:
154                   self.msg(user, i + " -> " + RE_CONV[i])
155               log.info(user + ": "+ message)
156               save()
157
158           m = re.match('(?i) *ADDME +"(.*)".*,.*"(.*)"', message)
159           if m:
160               RE_CONV_ME[m.groups()[0]] = m.groups()[1]
161               for i in RE_CONV_ME:
162                   self.msg(user, i + " -> " + RE_CONV_ME[i])
163               log.info(user + ": "+ message)
164               save()
165
166           m = re.match('(?i) *DELME +"(.*)".*', message)
167           if m:
168               del RE_CONV_ME[m.groups()[0]]
169               for i in RE_CONV_ME:
170                   self.msg(user, i + " -> " + RE_CONV_ME[i])
171               log.info(user + ": "+ message)
172               save()
173
174           m = re.match('(?i) *NICK +"(.*)".*', message)
175           if m:
176               BOT_NICKNAME = m.groups()[0]
177               self.nickname = BOT_NICKNAME
178               self.setNick(self.nickname)
179               save()
180
181           m = re.match('(?i) *TALK +(.*)', message)
182           if m:
183               msg = m.groups()[0].split(' ',1)
184               self.msg(msg[0], msg[1])
185
186           m = re.match('(?i) *ADDOP +(.*)', message)
187           if m:
188               for nick in m.groups()[0].split(' '):
189                   MASTER_USER.append(nick)
190                   self.msg(user, str(MASTER_USER))
191                   save()
192 
193           if re.match('(?i) *HELP *.*', message):
194               self.msg(user.split('!')[0], 'TALK #channel message | LIST | ADD "reg-exp", "message" | DEL "regexp" | ADDME "reg-exp", "message" | DELME "regexp" | NICK "NEW NICK"')
195               self.msg(user.split('!')[0], 'In message you can use $nick. $nick will replace with the name to sender.')
196               self.msg(user.split('!')[0], 'In message and regexp you can use $bot. $bot will replace with the name to bot.')
197
198    def modeChanged (self, user, channel, set, modes, args):
199        toOp = False
200        for i in range(len(args)):
201            if modes[i] == 'o':
202                user = user.split('!')[0]
203                self.op = set
204                if set:
205                    if args[i] == self.nickname:
206                        self.msg(channel, "Grazie " + user + " saro' il vostro schiavo per il resto della mia vita.")
207                        toOp = True
208                    self.nicks[args[i]] = 1
209                else:
210                    if args[i] == self.nickname:
211                        self.msg(channel, "Grazie " + user + " non sono degno di essere il vostro schiavo. La mia vita e' nelle vostre mani!")
212                    self.nicks[args[i]] = 0
213        if toOp:
214            for nick in self.nicks:
215                if self.nicks[nick] == 0  and nick != BOT_NICKNAME:
216                    self.opOnlyMaster(nick, channel)
217
218    def polygen (self, name):
219        filename = '/usr/share/polygen/ita/' + name + '.grm'
220        prog = os.popen("polygen " + filename)
221        return prog.read()
222   
223    def ctcpUnknownQuery (self, user, channel, tag, data):
224         pass
225
226class SlaveBotFactory(protocol.ClientFactory):
227
228    protocol = SlaveBot
229
230    def __init__(self, channel):
231         self.channel = channel
232
233    def clientConnectionLost(self, connector, reason):
234        log.critical('Connection lost: %s', reason)
235        connector.connect()
236
237    def clientConnectionFailed(self, connector, reason):
238        log.critical('Connection failed: %s', reason)
239        connector.connect()
240
241if __name__ == '__main__':
242
243    for server in SERVER:
244         f = SlaveBotFactory(server['channel'])
245         if server['ssl'] == 1:
246             contextFactory = ssl.ClientContextFactory()
247             reactor.connectSSL(server['name'], server['port'], f, contextFactory)
248         else:
249             reactor.connectTCP(server['name'], server['port'], f)
250    reactor.run()
Note: See TracBrowser for help on using the repository browser.