gulp
commit
b26490f108
@ -0,0 +1 @@
|
|||||||
|
venv/
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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()
|
@ -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()
|
||||||
|
|
@ -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])
|
Loading…
Reference in New Issue