Skip to content

Instantly share code, notes, and snippets.

@0xa
Created September 4, 2012 20:08
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 0xa/3625840 to your computer and use it in GitHub Desktop.
Save 0xa/3625840 to your computer and use it in GitHub Desktop.
IRC message encoding/decoding
import re
class BadMessageInput(Exception):
pass;
class Message:
buffer = "";
prefix = "";
senderNick = "";
senderHost = "";
command = "";
trailing = "";
params = [];
def __init__(self):
pass;
# Encode
def encode(self, prefix, command, data="", params=[]):
self.prefix = prefix;
self.command = command;
self.data = data;
self.params = params;
if len(prefix) > 0:
self.buffer += ":";
self.buffer += prefix;
self.buffer += " ";
self.buffer += command;
if len(params) > 0:
self.buffer += " ";
self.buffer += " ".join(params);
if len(data) > 0:
self.buffer += " :";
self.buffer += data;
return self;
# Parse a buffer
def decode(self, buffer):
self.buffer = buffer;
# Prefix
if buffer[0] == ":":
pos = buffer.find(" ");
if pos == -1:
raise BadMessageInput;
self.prefix = buffer[1:pos];
self.prefix = self.prefix.strip();
buffer = buffer[pos+1:];
prefixSep = self.prefix.find("!");
if prefixSep == -1:
self.senderNick = self.prefix;
else:
self.senderNick = self.prefix[:prefixSep];
self.senderHost = self.prefix[prefixSep+1:];
# Command
pos = buffer.find(" ");
if pos == -1:
raise BadMessageInput;
self.command = buffer[:pos];
self.command = self.command.strip();
buffer = buffer[pos+1:];
buffer = buffer.strip();
# Args
if len(buffer) == 0:
# No args
return;
pos = buffer.find(":");
if pos == -1:
# Only params
self.params = buffer.split(" ");
elif pos == 0:
# Only trailing
self.trailing = buffer[1:];
self.trailing = self.trailing.strip();
else:
self.params = buffer[:pos].split(" ");
self.trailing = buffer[pos+1:];
#print "----------";
#print "BUFFER: ", self.buffer;
#print "PREFIX: ", self.prefix;
#print "CMD : ", self.command;
#print "TRAIL : ", self.trailing;
#print "PARAMS: ", self.params;
#print "----------";
return self;
def sentBy(self, nick=None, host=None, hostre=None):
if nick and self.senderNick == nick:
return True;
if host and self.senderHost == host:
return True;
if hostre and re.match(hostre, self.senderHost):
return True;
return False;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment