#!/usr/bin/python

import socket, select, os, sys, re, time
import curses


class BuddyList:
    def __init__(self, server, prefix="%s/irc"%os.environ['HOME'], buffer=1024):
        self.server=os.path.join(prefix,server)
        self.server=os.path.join(self.server, "buddylist")
        self.socket=socket.socket(socket.AF_UNIX, socket.SOCK_STREAM,0)
        self.buffer=buffer
        try:
            self.socket.connect(self.server)
        except:
            self.socket=None
    def has_data(self):
        try:
            (iwtd, owtd, ewtd)=select.select([self.socket],[],[],0.05)
        except:
            return False
        if len(iwtd)==0:
            return False
        return True
    def get_buddylist(self):
        self.socket.send("getbuddylist\n")
        text=self.socket.recv(self.buffer)
        ret=[]
        for i in text.split('\n'):
            (status, nickname)=i.split(",",2)
            if(status=="END"):
                return ret
            ret.append([status, nickname])
        return ret
    def read(self):
        return self.socket.recv(self.buffer).replace("\n", "")

class DeMultiplexer:
    def __init__(self, prefix="%s/irc"%os.environ['HOME']):
        self.servers=[]
        self.scr=None
        self.buddylist=[]
        for i in os.walk(prefix):
            if  "buddylist" in i[2]:
                server=BuddyList(i[0].replace(prefix, "")[1:])
                if server.socket==None:
                    continue
                self.servers.append(server)
    def init_curses(self):
        self.scr = curses.initscr()
        curses.start_color()
        curses.noecho()
        curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
        curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
        curses.init_pair(3, curses.COLOR_BLUE, curses.COLOR_BLACK)
        self.scr.attron(curses.A_BOLD)
    def sort_buddylist(self):
        online=[]
        away=[]
        gone=[]
        detach=[]
        for i in self.buddylist:
            if "D" in i[0]: detach.append(i)
            elif "G" in i[0]: gone.append(i)
            elif "I" in i[0]: away.append(i)
            else: online.append(i)
        self.buddylist=[]
        for i in online: self.buddylist.append(i)
        for i in away: self.buddylist.append(i)
        for i in gone: self.buddylist.append(i)
        for i in detach: self.buddylist.append(i)
    def refresh(self):
        self.buddylist=[]
        for i in self.servers:
            for x in i.get_buddylist():
                self.buddylist.append(x)
        self.scr.clear()
        self.sort_buddylist()
        for i in self.buddylist:
            if "D" in i[0]:
                self.scr.addstr("[%s] %s\n"%(i[0], i[1]), curses.color_pair(3))
            elif "G" in i[0]:
                self.scr.addstr("[%s] %s\n"%(i[0], i[1]), curses.color_pair(3) | curses.A_BOLD)
            elif "I" in i[0]:
                self.scr.addstr("[%s] %s\n"%(i[0], i[1]), curses.color_pair(2) | curses.A_BOLD)
            else:
                self.scr.addstr("[%s] %s\n"%(i[0], i[1]), curses.color_pair(1) | curses.A_BOLD)
        self.scr.refresh()
    def run(self):
        self.init_curses()
        self.refresh()
        try:
            while True:
                for i in self.servers:
                    if i.has_data():
                        if i.read() == "update":
                            self.refresh()
                time.sleep(1)
        except:
            curses.endwin()
                            
fd=DeMultiplexer()
fd.run()

sys.exit(1)
