From 17cc14e0f609a4d2a1846e3db4a16e5ac360816b Mon Sep 17 00:00:00 2001 From: "P. Mathieu" Date: Thu, 21 Jun 2012 20:09:36 +0900 Subject: [PATCH] Initial commit --- basic.py | 21 ++++++ debug.py | 49 ++++++++++++++ edit.py | 80 ++++++++++++++++++++++ guiniol.py | 16 +++++ ircbot.py | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++ testmod.py | 61 +++++++++++++++++ 6 files changed, 419 insertions(+) create mode 100644 basic.py create mode 100644 debug.py create mode 100644 edit.py create mode 100644 guiniol.py create mode 100644 ircbot.py create mode 100644 testmod.py diff --git a/basic.py b/basic.py new file mode 100644 index 0000000..b89f78b --- /dev/null +++ b/basic.py @@ -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:]))) diff --git a/debug.py b/debug.py new file mode 100644 index 0000000..79ffcc6 --- /dev/null +++ b/debug.py @@ -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) + diff --git a/edit.py b/edit.py new file mode 100644 index 0000000..b97a440 --- /dev/null +++ b/edit.py @@ -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 + + + diff --git a/guiniol.py b/guiniol.py new file mode 100644 index 0000000..ae4d0c0 --- /dev/null +++ b/guiniol.py @@ -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)) \ No newline at end of file diff --git a/ircbot.py b/ircbot.py new file mode 100644 index 0000000..03d3c10 --- /dev/null +++ b/ircbot.py @@ -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() + diff --git a/testmod.py b/testmod.py new file mode 100644 index 0000000..eedf4e3 --- /dev/null +++ b/testmod.py @@ -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() + +