Created
July 14, 2014 16:26
-
-
Save vampjaz/89396248299e6d5c67e9 to your computer and use it in GitHub Desktop.
Mniip's minimal framework for IRC, with improvements by me
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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