#!/usr/bin/env python # # Claire Cavanaugh, 2016 # Written in Python 3. Follows RFC 2812 # The purpose of this project is to create a bot that connects to an IRC server # and joins a channel to perform various tasks, including: # # * Providing the titles of pages linked to through URLs import re class Message: """Represents an IRC Message, allowing access to the components of it.""" def __init__(self, message=b''): self.message = message self.items = {"servername" : None, "nickname" : None, "user" : None, "hostname" : None, "hostaddr" : None, "command" : None, "params" : None, "middle" : None, "trailing" : None } def lex(self): """Lex self.message into its components.""" shortname = rb"(?: [a-zA-Z0-9] (?: [a-zA-Z0-9-]* [a-zA-Z0-9])?)" ip4addr = rb"(?: [0-9]{1,3} (?: \. [0-9]{1,3}){3})" ip6addr = (rb"(?: (?: [0-9a-fA-F]+ (?: :[0-9a-fA-F]+){7})|" rb"(?: (?: 0:){5} (?: 0|FFFF):%s))" % ip4addr ) servername = rb"(?P %s (?: \.%s*)*)" % (shortname, shortname) hostaddr = rb"(?P %s | %s )" % (ip4addr, ip6addr) hostname = rb"(?P %s (?: \.%s*)*)" % (shortname, shortname) nickname = rb"(?P []a-zA-Z[\\`_^{|}] []a-zA-Z0-9[\\`_^{|}-]*)" user = rb"(?P [^\x00\n\r @]+)" host = rb"(?P %s|%s )" % (hostname, hostaddr) clientname = rb"(?: %s (?: (?: !%s)? @%s)?)" % (nickname, user, host) middle = rb"(?: [^ \x00\r\n:] [^ \x00\r\n]*)" params = (rb"(?P(?: (?P(?: \ %s){,14})(?P \ :[^\x00\r\n]*)?)|" rb"(?:(?P(?: \ %s){14}) (?P \ :? [^\x00\r\n]*)?))?" % (middle, middle)) prefix = rb"(?P : (?:%s|%s) \ )?" % (servername, clientname) prefix2 = rb"(?: " command = rb"(?P [a-zA-Z]+ | [0-9]{3})" msg_re = re.compile(prefix + command + params + rb"[\r\n]+", re.X) matched = msg_re.match(self.message) items = matched.groupdict() if items["middle"] is None: items["middle"] = items.pop("m2") if items["trailing"] is None: items["trailing"] = items.pop("t2") del items["m2"]; del items["t2"] self.items = items