#!/usr/bin/python3
# See the LICENSE file for licensing information
import re

nick = 'seddy'
server = 'chat.freenode.net'
channel = '#example'
gecos = 'A text processing bot'

receive = open('/tmp/' + server + '.in', 'r')
send = open('/tmp/' + server + '.out', 'w')

parse_msg = re.compile(' :(.*)')
parse_sed = re.compile('(?<!\\\\)/')
is_sed = re.compile('^s/.*/.*')

class Queue:
    size = 0
    data = []
    head = 0
    tail = 0
    count = 0

    def __init__(self, size):
        self.size = size
        self.data = [None]*size

    def enqueue(self, s):
        if not self.full():
            self.count += 1
            self.data[self.tail] = s
            self.tail = (self.tail + 1) % self.size

    def dequeue(self):
        if not self.empty():
            self.count -= 1
            s = self.data[self.head]
            self.head = (self.head + 1) % self.size
            return s

    def full(self):
        return self.size == self.count

    def empty(self):
        return self.head == self.count

    def find(self, s):
        i = self.tail-1
        while True:
            if i == -1:
                i = self.size-1
            if re.search(s, self.data[i]):
                return self.data[i]
            i -= 1
            if i == self.tail-1:
                return False

def seddy(sed, history):
    regex = parse_sed.split(sed)
    msg = history.find(regex[1])
    f = 0

    if msg == False:
        return False
    if 'i' in regex[3]:
        f |= re.I
    if "g" in regex[3]:
        return re.sub(regex[1], regex[2], msg, flags=f)
    else:
        return re.sub(regex[1], regex[2], msg, 1)

def notice(msg):
    send.write('NOTICE ' + channel + ' :' + msg + '\r\n')
    send.flush()

def privmsg(msg):
    send.write('PRIVMSG ' + channel + ' :' + msg + '\r\n')
    send.flush()

if __name__ == "__main__":
    history = Queue(48)

    send.write('NICK ' + nick + '\r\n')
    send.flush()
    send.write('USER ' + nick + ' * 8 :' + gecos + '\r\n')
    send.flush()
    send.write('JOIN ' + channel + '\r\n')
    send.flush()

    for line in receive:
        msg = parse_msg.search(line)
        if msg is None:
            continue
        else:
            msg = msg.group(1)

        if history.full():
            history.dequeue()
        if 'PRIVMSG' in line and not is_sed.match(msg):
            history.enqueue(msg)

        if 'PING' in line:
            send.write('PONG\r\n')
            send.flush()
        if '.bots' in msg[:5] or '.bot ' + nick in msg[:5 + len(nick)]:
            notice("I was written to correct your mistakes.")
	if '.source ' + nick in msg[:8 + len(nick)]:
            notice('[Python] https://github.com/sys-fs/seddy')
        elif is_sed.match(msg):
            foo = seddy(msg, history)
            if foo != False:
                privmsg(re.sub('\\\\/', '/', foo))

@@ -1359,16 +1359,53 @@
 it(sed)%0A
+    if len(regex) %3C 4:%0A%09return False%0A
     msg 

If the parser fails, return False