commit b26490f1083c1ba5a163d3cf92fa73843253d194 Author: Michael Murtaugh Date: Sun Sep 27 19:10:21 2020 +0200 gulp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7275bb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +venv/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..5a7f590 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +A small selection of IRC bots +================================= + +simplebot.py is a really minimal bot (meant as a proof of concept and starting point) written in standard library python 3. The source is from IRC Hacks, Paul Mutton, 2004. + +ircpipebot and reversebot make use of the irc module, installable with: + + pip3 install irc + + + diff --git a/ircpipebot.py b/ircpipebot.py new file mode 100644 index 0000000..f0794cc --- /dev/null +++ b/ircpipebot.py @@ -0,0 +1,77 @@ +from __future__ import print_function +import irc.bot +import sys, time +from _thread import start_new_thread + + +def chunks(l, n): + """ Yield successive n-sized chunks from l. + """ + for i in range(0, len(l), n): + yield l[i:i+n] + +class Bot (irc.bot.SingleServerIRCBot): + def __init__(self, channel, nickname, server, input, port=6667, idle=False): + irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname) + self.input = input + self.channel = channel + if idle: + start_new_thread(self.idle, ()) + + def on_welcome(self, c, e): + c.join(self.channel) + print ("join", file=sys.stderr) + start_new_thread(self.receive, (c,)) + + def idle(self): + while True: + tstr = time.strftime("%H:%M:%S", time.localtime()) + out = u"({0}) {1}: {2}".format(tstr, "_system", "idle") + sys.stdout.write(out.encode("utf-8")+"\n") + sys.stdout.flush() + time.sleep(1) + + def receive (self, c): + if self.input == sys.stdin: + # print ("reading from stdin", file=sys.stderr) + _in = sys.stdin + else: + # print ("reading from {0}".format(self.input), file=sys.stderr) + _in = open(self.input) + + while True: + line = _in.readline() + if line == '': + break + # line = line.rstrip().decode("utf-8") + line = line.rstrip() + if line: + # print ("read line: {0}".format(line), file=sys.stderr) + # CHUNK IT + for chunk in chunks(line, 400): + c.privmsg(self.channel, chunk) + + def on_pubmsg(self, c, e): + # e.target, e.source, e.arguments, e.type + msg = e.arguments[0] + tstr = time.strftime("%H:%M:%S", time.localtime()) + nick = e.source.split("!", 1)[0] + out = u"({0}) {1}: {2}".format(tstr, nick, msg) + # sys.stdout.write(out.encode("utf-8")+"\n") + sys.stdout.write(out+"\n") + sys.stdout.flush() + # print ("pubmsg: {0}".format(msg), file=sys.stderr) + +if __name__ == "__main__": + from argparse import ArgumentParser + parser = ArgumentParser() + parser.add_argument('--server', default='irc.freenode.net', help='server hostname (default: localhost)') + parser.add_argument('--port', default=6667, type=int, help='server port (default: 6667)') + parser.add_argument('--channel', default='#botopera', help='channel to join (default: #botopera)') + parser.add_argument('--nickname', default='pipebot', help='bot nickname (default: pipebot)') + parser.add_argument('--input', default=sys.stdin, help='input') + parser.add_argument('--idle', default=False, action="store_true", help='output idle messages') + args = parser.parse_args() + + bot = Bot(args.channel, args.nickname, args.server, args.input, port=args.port, idle=args.idle) + bot.start() diff --git a/reversebot.py b/reversebot.py new file mode 100644 index 0000000..bc0dafa --- /dev/null +++ b/reversebot.py @@ -0,0 +1,37 @@ +import irc.bot + + +class ReverseBot(irc.bot.SingleServerIRCBot): + def __init__(self, channel, nickname, server, port=6667): + irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname) + self.channel = channel + + def on_welcome(self, c, e): + c.join(self.channel) + print ("join") + + def on_privmsg(self, c, e): + pass + + def on_pubmsg(self, c, e): + # print e.arguments, e.target, e.source, e.arguments, e.type + msg = e.arguments[0] + if "bot" in msg: + words = msg.split() + words.reverse() + msg = " ".join(words) + c.privmsg(self.channel, msg) + +if __name__ == "__main__": + import sys, argparse + + parser = argparse.ArgumentParser(description='I am a bot!') + parser.add_argument('--server', default='irc.freenode.net', help='server hostname (default: irc.freenode.net)') + parser.add_argument('--port', default=6667, type=int, help='server port (default: 6667)') + parser.add_argument('--channel', default='#botopera', help='channel to join (default: #botopera)') + parser.add_argument('--nickname', default='reverseb0t', help='bot nickname (default: botoperahost)') + + args = parser.parse_args() + bot = ReverseBot(args.channel, args.nickname, args.server, args.port) + bot.start() + diff --git a/simplebot.py b/simplebot.py new file mode 100644 index 0000000..8f30468 --- /dev/null +++ b/simplebot.py @@ -0,0 +1,23 @@ +import sys +import socket +import string +HOST="irc.freenode.net" +PORT=6667 +NICK="MauBot" +IDENT="maubot" +REALNAME="MauritsBot" +readbuffer="" + +s=socket.socket( ) +s.connect((HOST, PORT)) +s.send("NICK %s\r\n" % NICK) +s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME)) +while 1: + readbuffer=readbuffer+s.recv(1024) + temp=string.split(readbuffer, "\n") + readbuffer=temp.pop( ) + for line in temp: + line=string.rstrip(line) + line=string.split(line) + if(line[0]=="PING"): + s.send("PONG %s\r\n" % line[1]) \ No newline at end of file