Skip to content

Instantly share code, notes, and snippets.

@vampjaz
Created July 14, 2014 16:26
Show Gist options
  • Save vampjaz/89396248299e6d5c67e9 to your computer and use it in GitHub Desktop.
Save vampjaz/89396248299e6d5c67e9 to your computer and use it in GitHub Desktop.
Mniip's minimal framework for IRC, with improvements by me
import socket, errno, time
from string import maketrans
ircupper = maketrans(
"abcdefghijklmnopqrstuvwxyz[]~\\",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ{}^|")
def parse(cmd):
data = cmd.split(" ")
if data[0][0] != ':':
data.insert(0, None)
else:
data[0] = data[0][1:]
for i in range(1, len(data)):
if data[i][0] == ':':
data[i:] = [(" ".join(data[i:]))[1:]]
break
return data
def get_nickname(hostmask):
return hostmask.split("!", 1)[0]
def get_host(hostmask):
return hostmask.split("@", 1)[1]
def toupper(nickname):
return nickname.translate(ircupper)
def compile(*args):
data = list(args)
data[-1] = ':' + data[-1]
return " ".join(data)
def account(serv, nick):
serv.send("WHOIS", nick)
account = None
unseen = []
while True:
try:
cmd = serv.read()
if cmd[1] == "318" and cmd[3] == nick:
break
elif cmd[1] == "330" and toupper(cmd[3]) == toupper(nick):
account = cmd[4]
else:
unseen.append(cmd)
except socket.error as e:
if e[0] == errno.EAGAIN:
time.sleep(0.01)
else:
raise e
serv.unread(unseen)
return account
def anyone(serv, nick):
serv.send("WHO", nick)
exists = False
unseen = []
while True:
try:
cmd = serv.read()
if cmd[1] == "315" and cmd[3] == nick:
break
elif cmd[1] == "352" and toupper(cmd[7]) == toupper(nick):
exists = True
else:
unseen.append(cmd)
except socket.error as e:
if e[0] == errno.EAGAIN:
time.sleep(0.01)
else:
raise e
serv.unread(unseen)
return exists
import socket, time, random
import Config, Irc
class IrcServer:
def send(self, *args):
print(self.nick + ": " + Irc.compile(*args))
t = self.lastsend - time.time() + 0.25
if t > 0:
time.sleep(t)
self.connection.sendall(Irc.compile(*args) + "\n")
self.lastsend = time.time()
def unread(self, data):
self.unseen.extend(data)
def read(self):
if len(self.unseen):
return self.unseen.pop(0)
try:
while self.buffer.find('\n') == -1:
data = self.connection.recv(4096)
self.buffer += data
except:
return ['']*4
line, self.buffer = self.buffer.split('\n', 1)
print(line)
return Irc.parse(line.rstrip('\r'))
def connect(self):
host = random.choice(socket.gethostbyname_ex(Config.config["host"])[2])
self.connection = socket.create_connection((host, Config.config["port"]), None)
self.connection.settimeout(None)
self.connection.setblocking(0)
self.buffer = ''
self.send("NICK", self.nick)
self.send("USER", Config.config["user"], "*", "*", Config.config["rname"])
self.send("NS", "identify " + Config.config["password"])
def disconnect(self):
self.send("QUIT")
self.connection.close()
self.connection = None
def is_ignored(self, host):
r = self.ignored.get(host, None)
if r:
if r < time.time():
del self.ignored[host]
return False
return True
return False
def ignore(self, host, duration):
self.ignored[host] = time.time() + duration
def __init__(self, nick):
self.connection = None
self.unseen = []
self.autojoin = []
self.nick = nick
self.lastsend = 0
self.running = True
self.ignored = {}
self.flood_score = {}
self.connect()
def is_admin(self, hostmask):
return Config.config["admins"].get(hostmask, False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment