Initial commit
This commit is contained in:
commit
17cc14e0f6
21
basic.py
Normal file
21
basic.py
Normal 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
49
debug.py
Normal 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
80
edit.py
Normal 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
16
guiniol.py
Normal 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
192
ircbot.py
Normal 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
61
testmod.py
Normal 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()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user