import tpt
import sys
import time
import socket
import tpt_console

HOST="irc.freenode.net"
PORT=6667
name=tpt.get_name()
print "name is %s"%repr(name)
if(name==""):
    #fuck. abort?
    raise SystemExit("please log in!")

def raw(s,st):
    s.send("%s\n\r"%st)

def init():
    global frame,s,rec,readbuffer,namelist,typing,typed,IDENT,NICK
    global REALNAME,CHANNEL
    frame=0
    s=None
    rec=([("",0,0,0,255)]*20)+[("connected.",255,0,0,128)]
    readbuffer=""
    namelist=[]
    typing=False
    typed=""
    NICK=name+"[tpt]"
    IDENT=name+"[tpt]"
    REALNAME=name
    CHANNEL="#powder"
    readbuffer=""

def exit():
    raw(s,"QUIT")
    s.close()

def console_handle(txt):
    """
    :doxin!~lieuwe@unaffiliated/lieuwe JOIN :#foobar7
    :doxin!~lieuwe@unaffiliated/lieuwe PRIVMSG #foobar7 :there
    :doxin!~lieuwe@unaffiliated/lieuwe PRIVMSG #foobar7 :ACTION is fat
    """
    lst=txt.split(" ")
    if(lst[0]=="/me"):
        rec.append(("%s %s"%(NICK,txt[4:]),255,0,255,128))
        raw(s,"PRIVMSG %s :\x01ACTION %s\x01"%(CHANNEL,txt[4:]))
        tpt.console_close()
    else:
        rec.append(("<%s>: %s"%(NICK,txt),255,255,0,128))
        raw(s,"PRIVMSG %s :%s"%(CHANNEL,txt))
        tpt.console_close()

def key(keyy) :
    try:
        a=key.pmod
    except:
        key.pmod=(False,False,False)
    global typing,typed
    #print "got %s"%repr(keyy)
    ctrl1,ctrl2,alt1,alt2,shift1,shift2=tpt.get_modifier()
    mod=(ctrl1 or ctrl2,alt1 or alt2,shift1 or shift2)
    skip=False
    if(not key.pmod[0] and mod[0]):
       skip=True
    if(not key.pmod[1] and mod[1]):
        skip=True
    if(not key.pmod[2] and mod[2]):
        skip=True
    key.pmod=mod
    if(skip):
        return
    
    if(typing and ord(keyy)>=32 and ord(keyy)<=126):
        if(mod[2]):
            typed+=keyy.upper()#needs to be fixed for special chars
        else:
            typed+=keyy
    if(keyy=="\x1b" and typing):
        typing=False
        typed=""
        tpt.shortcuts_enable()
    if(keyy=="t" and typing==False):
        typing=True
        tpt.shortcuts_disable()
    if(keyy=="\r" and typing==True):
        console_handle(typed)
        typed=""
        typing=False
        tpt.shortcuts_enable()
    #got '\t'
    #got '\x08'
    if(keyy=="\x08"):
        typed=typed[:-1]
    #if(keyy=="\t"):
    #    startswith=


def step():
    global frame,s,rec,readbuffer,namelist
    frame+=1
    if(frame==1):
        tpt.console_close()
        #lets see if we can seize the console:
        tpt_console._handle=console_handle
    if(frame==2):
        tpt.draw_fillrect(0,0,612,384,0,0,0,128)
        tpt.draw_text(32,32,"opening connection\nhold on to your pants.",255,255,255)
    if(frame==3):
        s=socket.socket()
        s.settimeout(5)
        s.connect((HOST, PORT))
        raw(s,"NICK %s" % NICK)
        raw(s,"USER %s %s bla :%s" % (IDENT, HOST, REALNAME))
        s.settimeout(0)
    if(frame==120):
        raw(s,"JOIN %s"%CHANNEL)
        rec.append(("joined",255,0,0,255))
    if(frame>=3):
        try:
            readbuffer=readbuffer+s.recv(1024)
        except IOError:
            pass
        else:
            temp=readbuffer.split("\n")
            readbuffer=temp.pop()

            for line in temp:
                line=line.strip()
                #print repr(line)
                line=line.split()
                if(line[1]=="PRIVMSG"):
                    #:doxin!~lieuwe@unaffiliated/lieuwe PRIVMSG doxin[tpt] :some shit
                    frm=line[0][1:].partition("!")[0]
                    msg=' '.join(line[3:])[1:]
                    tmp=["<",frm,"> ",msg]
                    if(msg[0]=="\x01" and msg[-1]=="\x01"):
                        msg=msg[8:-1]#ACTION
                        tmp=[frm," ",msg]
                    if(line[2]==NICK):
                        rec.append((''.join(tmp),255,255,255,255))
                    else:
                        rec.append((''.join(tmp),255,255,255,128))
                elif(line[0]=="PING"):
                    raw(s,"PONG %s"%line[1])
                elif(line[1]=="353"):
                    #:leguin.freenode.net 353 doxin[tpt] = #powder :doxin[tpt] ZebraineZ _-_Rafael_-_ doxin bildramer BlueMaxima TheRazorsEDGE raj-k webb|AP where @devast8a Merbo FrozenKnight EppyMoon EvilJStoker Mortvert SpitfireWP @frankbro Ares
                    names=line[4:]
                    namelist=[]
                    for item in names:
                        item=item.strip()
                        r=255
                        g=255
                        b=255
                        if(item[0]==":"):
                            item=item[1:]
                        elif(item[0]=="@"):
                            g=0
                            b=0
                        namelist.append((item,r,g,b,128))
                elif(line[1]=="JOIN"):
                    #':savask!~savask@95-190-25-195-xdsl-dynamic.kuzbass.net JOIN :#powder'
                    tmp=line[0][1:].partition("!")[0]
                    namelist.append((tmp,255,255,255,128))
                    rec.append(("%s joined"%name,0,255,0,128))
                elif(line[1]=="PART"):
                    #':savask!~savask@95-190-25-195-xdsl-dynamic.kuzbass.net PART #powder :"Leaving."'
                    tmp=line[0][1:].partition("!")[0]
                    msg=' '.join(line[2:])[1:]
                    rem=None
                    for item in namelist:
                        if(item[0]==tmp or item[0]=="@"+tmp):
                            rem=item
                    rec.append(("%s parted: %s"%(name,msg),0,255,0,128))
                    if(rem!=None):
                        namelist.remove(rem)
                elif(line[1]=="NICK"):
                    #:doxin!~lieuwe@unaffiliated/lieuwe NICK :d0x1n
                    tmp=line[0][1:].partition("!")[0]
                    rem=None
                    for item in namelist:
                        if(item[0]==tmp or item[0]=="@"+tmp):
                            rem=item
                    rec.append(("%s is now known as %s"%(name,line[2]),0,255,0,128))
                    if(rem!=None):
                        if(rem[0][0]=="@"):
                            namelist.append(("@"+line[2][1:],rem[1],rem[2],rem[3],rem[4]))
                        else:
                            namelist.append((line[2][1:],rem[1],rem[2],rem[3],rem[4]))
                        namelist.remove(rem)


                    
    
        yy=32
        if(len(rec)>20):
            rec=rec[-20:]
        for item in rec:
            tpt.draw_text(8,yy,item[0],item[1],item[2],item[3],item[4])
            yy+=8
        if(typing):
            if(frame%30<15):
                tpt.draw_text(8,yy,typed+"|",255,255,255,255)
            else:
                tpt.draw_text(8,yy,typed,255,255,255,255)
        #print namelist
        yy=32
        for item in namelist:
            tpt.draw_text(604-tpt.get_width(item[0]),yy,item[0],item[1],item[2],item[3],item[4])
            yy+=8