Skip to content

Instantly share code, notes, and snippets.

@aji
Created March 16, 2012 02:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aji/2048264 to your computer and use it in GitHub Desktop.
Save aji/2048264 to your computer and use it in GitHub Desktop.
killer -- a deadly IRC "server"
#!/usr/bin/env python
import select
import random
import string
import socket
class Killer:
def __init__(self, sock):
self.sock = sock
self.nick = None
self.killbuf = b''
self.recvd = b''
self.lines = []
self.sent = 0
def is_read(self):
return self.nick == None
def fileno(self):
return self.sock.fileno()
def gen(self):
if self.nick == None:
return b''
killnick = ''.join([random.choice(string.ascii_letters) for x in range(8)])
return ':{0}!foo@over.nine.thousand.net PRIVMSG {1} :wat\r\n'.format(killnick, self.nick).encode()
def fill(self):
while len(self.killbuf) < 1024:
self.sent += 1
self.killbuf += self.gen()
def send(self):
self.fill()
sent = self.sock.send(self.killbuf)
self.killbuf = self.killbuf[sent:]
def recv(self):
self.recvd += self.sock.recv(1024).replace(b'\r', b'')
if b'\n' in self.recvd:
bef, sep, self.recvd = self.recvd.partition(b'\n')
self.lines.append(bef.decode())
while len(self.lines) > 0:
split = self.lines.pop(0).split()
if split[0] == 'NICK':
self.nick = split[1]
self.killbuf = ':over.nine.thousand.net 001 {0} :WELCOME TO OVER9000NET DOUCHEBAG, HAHAHA\r\n'.format(self.nick).encode()
break
def main():
listener = socket.socket()
listener.bind(('', 6667))
listener.listen(5)
killers = []
print('Listening...')
while True:
r = [listener]
w = []
x = []
for killer in killers:
if killer.is_read():
r.append(killer)
else:
w.append(killer)
r, w, x = select.select(r, w, x)
for reader in r:
if reader == listener:
conn, addr = reader.accept()
print('Hahaha, we got one: {0}'.format(addr))
killers.append(Killer(conn))
else:
reader.recv()
for writer in w:
try:
writer.send()
except socket.error:
killers.remove(writer)
print('Sent {0}'.format(writer.sent))
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment