Initial commit

This commit is contained in:
P. Mathieu 2012-06-21 20:09:36 +09:00
commit 17cc14e0f6
6 changed files with 419 additions and 0 deletions

21
basic.py Normal file
View File

@ -0,0 +1,21 @@
client = None
def mod_init(cl):
global client
client = cl
def action(msg):
return '%cACTION %s%c' % (1, msg, 1)
def on_privchat(who, msg):
args = msg.split()
if len(args) < 1: return
cmd = args[0]
if cmd == "say":
if len(args) < 3:
return
client.sendto(args[1], ' '.join(args[2:]))
if cmd == "act":
if len(args) < 3:
return
client.sendto(args[1], action(' '.join(args[2:])))

49
debug.py Normal file
View File

@ -0,0 +1,49 @@
import sys
client = None
def mod_init(cl):
global client
client = cl
def action(msg):
return '%cACTION %s%c' % (1, msg, 1)
def execbuf(nick):
if 'edit' not in sys.modules:
return
b = sys.modules['edit'].bufs
if nick not in b:
return
try:
exec('\n'.join(b[nick].buf))
except Exception, e:
client.sendto(nick, 'ERROR: %s' % str(e))
def on_pubchat(who, chan, msg):
if msg[:len(client.nick)] == client.nick:
nmsg = msg.split(':')[1:]
nargs = nmsg[0].split()
if len(nargs) < 1: return
if len(nmsg) > 1:
nargs = nargs + [':' + ':'.join(nmsg[1:])]
ncmd = nargs[0]
if ncmd == "raw":
client.send(' '.join(nargs[1:]))
if ncmd == "execbuf":
execbuf(who.split('!')[0])
if ncmd == "exec":
try:
exec(' '.join(nargs[1:]))
except Exception, e:
client.sendto(chan, 'ERROR: %s' % str(e))
def on_privchat(who, msg):
on_pubchat(who, who, client.nick + ': ' + msg)

80
edit.py Normal file
View File

@ -0,0 +1,80 @@
client = None
class Buffer:
viewsize = 8
def __init__(self):
self.buf = []
self.curline = 0
self.edit = False
bufs = {}
def mod_init(cl):
global client
client = cl
def getnick(user):
return user.split('!')[0]
def getwindow(buf):
bi = buf.curline - (buf.viewsize-1)/2
bs = buf.curline + buf.viewsize/2 + 1
if bs > len(buf.buf):
bi = bi - (bs - len(buf.buf))
bs = len(buf.buf)
if bi < 0:
bi = 0
return range(bi, bs)
def on_privchat(who, msg):
nick = getnick(who)
if nick not in bufs:
bufs[nick] = Buffer()
b = bufs[nick]
if msg[0] == '.':
args = msg[1:].split()
cmd = args[0]
if cmd == "l":
if len(args) > 1:
b.curline = int(args[1])
if b.curline > len(b.buf):
b.curline = len(b.buf)
if b.curline < 0:
b.curline = 0
for i in getwindow(b):
if i == b.curline:
client.sendto(nick, '----')
client.sendto(nick, '%3d: '%i + b.buf[i])
if b.curline == len(b.buf):
client.sendto(nick, '----')
if cmd == "e":
if b.edit is True:
b.edit = False
else:
b.edit = True
if cmd == "d":
if len(args) < 2:
return
if len(args) > 2:
for i in range(int(args[1]), int(args[2])+1):
b.buf.pop(int(args[1]))
else:
b.buf.pop(int(args[1]))
else:
if b.edit is True:
b.buf.insert(b.curline, msg)
b.curline = b.curline + 1

16
guiniol.py Normal file
View File

@ -0,0 +1,16 @@
client = None
def mod_init(cl):
global client
client = cl
def on_pubchat(who, chan, msg):
if who.split('!')[0] == 'guiniolBot':
if msg.find('aurez') != -1:
client.sendto(chan, '%cACTION sort un fusil sniper et ajuste la visee sur guiniolBot...%c' % (1, 1))

192
ircbot.py Normal file
View File

@ -0,0 +1,192 @@
import threading
import string
import socket
import sys
#server = "casimir.ponteilla.net"
server = "localhost"
port = 6667
chan = "#pno"
nick = "PaulBot"
class ModNotFoundException(Exception):
pass
def getnick(user):
return user.split('!')[0]
class monmodule:
def __init__(self, name, client):
self.name = name
if name in sys.modules:
reload(sys.modules[name])
self.mod = __import__(name)
self.mod.mod_init(client)
class TCPClient:
cmds = ["privmsg", "ping"] #"mode", "join", "part", "quit"]
def __init__(self, sock, nick):
self.sock = sock
self.nick = nick
self.modules = []
def send(self, msg):
self.sock.send(":%s %s\r\n" % (self.nick, msg))
print "=== sent: :%s %s" % (self.nick, msg)
def pubchat(self, chan, msg):
self.send("PRIVMSG %s :%s" % (chan, msg))
def sendto(self, who, msg):
self.pubchat(getnick(who), msg)
def handle(self, data):
#print data
if data[0] != ':':
data = ':none ' + data
args = data.split(':')[1:]
args = args[0].split() + [':'.join(args[1:])]
cmd = args[1].lower()
# print "=== CMD(%s)" % cmd
if cmd in self.cmds:
getattr(self, "on_" + cmd)(args[0], args[2:])
def onconnect(self):
self.sock.send("NICK %s\r\n" % nick)
self.sock.send("USER paulbot ponteilla.net blektr :PaulBot\r\n")
self.send("JOIN #pno")
def find_mod(self, name):
try:
i = [x.name for x in self.modules].index(name)
except ValueError:
raise ModNotFoundException()
else:
return self.modules[i]
def remove_mod(self, name):
mod = self.find_mod(name)
reload(mod.mod)
self.modules.remove(mod)
def handle_command(self, who, cmd):
if len(cmd.split()) < 1:
return
ncmd = cmd.split()[0]
nargs = cmd.split()[1:]
if ncmd == "reload":
try:
mod = self.find_mod(nargs[0])
except ModNotFoundException:
self.sendto(who, "ERROR: Module '%s' not loaded" % nargs[0])
else:
self.sendto(who, "Reloading module '%s'..." % nargs[0])
try:
reload(mod.mod)
mod.mod.mod_init(self)
except Exception, e:
self.sendto(who, "ERROR: %s" % str(e))
if ncmd == "unload":
try:
self.remove_mod(nargs[0])
except ModNotFoundException:
self.sendto(who, "ERROR: Module '%s' not loaded" % nargs[0])
else:
self.sendto(who, "Module '%s' unloaded." % nargs[0])
if ncmd == "load":
if nargs[0] in [x.name for x in self.modules]:
self.sendto(who, "ERROR: Module '%s' already loaded" % str(e))
else:
try:
mod = monmodule(nargs[0], self)
except Exception, e:
self.sendto(who, "ERROR: %s" % str(e))
else:
self.modules.append(mod)
self.sendto(who, "Module '%s' loaded." % nargs[0])
def on_pubchat(self, who, chan, msg):
if msg[:len(self.nick)] == self.nick:
nmsg = ':'.join(msg.split(':')[1:]).lstrip()
self.handle_command(chan, nmsg)
for mod in self.modules:
if 'on_pubchat' in dir(mod.mod):
try:
mod.mod.on_pubchat(who, chan, msg)
except Exception, e:
self.sendto(chan, str(e))
self.sendto(chan, "Module '%s' unloaded" % mod.name)
self.remove_mod(mod.name)
def on_privchat(self, who, msg):
self.handle_command(who, msg)
for mod in self.modules:
if 'on_privchat' in dir(mod.mod):
try:
mod.mod.on_privchat(who, msg)
except Exception, e:
self.sendto(getnick(who), str(e))
self.sendto(getnick(who), "Module '%s' unloaded" % mod.name)
self.remove_mod(mod.name)
def on_privmsg(self, who, params):
towho = params[0]
msg = params[1]
if getnick(towho) == self.nick:
self.on_privchat(who, msg)
else:
self.on_pubchat(who, towho, msg)
print "(%s) %s: %s" % (towho, who.split('!')[0], msg)
def on_ping(self, who, params):
print "PING? PONG!"
self.send("PONG %s" % self.nick)
if __name__ == "__main__":
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client = TCPClient(sock, nick)
print "Connecting to %s:%d" % (server, port)
try:
sock.connect((server, port))
except socket.error:
sock.close()
print "ERR: could not connect!"
exit(1)
client.onconnect()
try:
while True:
data = sock.recv(2048)
if not data:
break
for s in data.split('\r\n'):
if s.rstrip() != "":
client.handle(s)
except KeyboardInterrupt:
client.sendto("#pno",
"Aiiieuuuh, me suis pris un C-c dans les dents :/")
finally:
sock.close()
for m in client.modules:
if 'on_die' in dir(m.mod):
m.mod.on_die()

61
testmod.py Normal file
View File

@ -0,0 +1,61 @@
import random
import threading
import time
client = None
next = None
def on_die():
next.cancel()
def vide_blanc():
i = random.randint(0, len(meublage)-1)
client.pubchat("#pno", meublage[i])
rearmer()
def rearmer():
global next
if next is not None:
next.cancel()
next = threading.Timer(random.randint(1200, 9000), vide_blanc)
next.start()
def mod_init(cl):
global client, next
client = cl
random.seed()
rearmer()
reponses = [
"bien dit !",
"pfff...",
"serieux ? o_O",
"Hello guiniolBot!",
"au fait, juste comme ca, sans vouloir balancer des fleurs ou quoi, mais mon createur est un type bien",
"oh ! mais il parle !",
"je sais que je ne fais que repeter des phrases aleatoires, mais si je peux aider a meubler un peu...",
"bwaaAAaaHahhahahaaahaahahaaaa!!",
"ou pas.",
"nan mais meme si c'etait vrai, t'as vu ta tronche ?"
]
meublage = [
"Aaa.. TCHA!",
"Hello guiniolBot :D",
"Celui qui lit ceci ferait mieux de lire autre chose",
"mais dis donc c'est aussi anime qu'a une soiree scrabble chez les grand-parents ici...",
"bwaarggll"
]
def on_pubchat(who, chan, msg):
if (msg.find('bwaarggll') != -1):
client.pubchat(chan, "BwAaRgGlL!1!!")
i = random.randint(0, len(reponses)-1)
if random.randint(0, 1024) < 42:
client.pubchat(chan, reponses[i])
rearmer()