#! /usr/bin/python

##
## clirc -- An IRC client in Python.
##
## Copyleft 1997 Teemu Kalvas <chery@s2.org>
##

## +class P
##  -method quit
##  -method wait
##  -method screen
##  -method servers
##  -method reload

import select
import string
import sys
import time
import traceback

## If this file's full pathname is $PREFIX/bin/$FOO, use $PREFIX/lib/$FOO as
## a library directory.

pos = string.rfind(sys.argv[0], '/')
dir, name = sys.argv[0][:pos], sys.argv[0][pos:]
if len(dir) >= 3 and dir[-3:] == 'bin':
    dir = dir[:-3] + 'lib' + name
sys.path.insert(0, dir)

import config
import editfield
import screen
import server
import statline
import user
import window

class P:
    def __init__(self):
	self.quit = 0
	self.wait = []
	self.screen = screen.Screen()
	self.rand = int(time.time())

    def wait_add(self, time, func, context):
	i = 0
	for entry in self.wait:
	    if entry[0] > time:
		self.wait.insert(i, (time, func, context))
		return
	    i = i + 1
	self.wait.append((time, func, context))

p = P()

config.init(p)

try:
    p.servers = [user.User()]
    for serv in config.want_servers:
	srv = server.Server(p, serv)
	if srv.connected:
	    p.servers.append(srv)

    while not p.quit:
	config.do(p)
	p.reload = 0
	while not p.reload and not p.quit:
	    if p.screen.touched:
		p.servers[0].out = [1]
	    rl = map(lambda x: x.sock, p.servers)
	    sl = filter(lambda x: len(x.out) > 0, p.servers)
	    wl = map(lambda x: x.sock, sl)
	    if len(p.wait) > 0:
		timeout = max(p.wait[0][0] - time.time(), 0.0)
	    else:
		timeout = 3600.0
	    rr, wr = select.select(rl, wl, [], timeout)[:2]
	    if len(rr) > 0:
		for serv in p.servers[:]:
		    if serv.sock == rr[0]:
			serv.read(p)
			if not serv.connected and serv.quitting:
			    p.servers.remove(serv)
			    win = p.screen.current.next
			    while win <> p.screen.current:
				next = win.next
				if win.server == serv:
				    win.next.prev = win.prev
				    win.prev.next = win.next
				    del win
				win = next
			    if win.next <> win:
				p.screen.current = win.next
				p.screen.touched = p.screen.touched | 63
				win.next.prev = win.prev
				win.prev.next = win.next
			    else:
				p.quit = 1
			del rr[0]
			if len(rr) == 0:
			    break
	    elif len(wr) > 0:
		for serv in p.servers:
		    if serv.sock == wr[0]:
			serv.write(p)
			del wr[0]
			if len(wr) == 0:
			    break
	    while len(p.wait) > 0 and p.wait[0][0] <= time.time():
		p.wait[0][1](p, p.wait[0][2])
		del p.wait[0]
	if not p.quit:
	    reload(editfield)
	    reload(screen)
	    reload(server)
	    reload(statline)
	    reload(user)
	    reload(window)
	    reload(config)
	    for old, new in [(p.servers[0].__class__, user.User),
			     (p.servers[1].__class__, server.Server),
			     (p.screen.__class__, screen.Screen),
			     (p.screen.edit_field.__class__,
			      editfield.EditField),
			     (p.screen.stat_line.__class__, statline.StatLine),
			     (p.screen.current.__class__, window.Window)]:
		for attr in new.__dict__.keys():
		    old.__dict__[attr] = new.__dict__[attr]
except:
    dump = sys.exc_type, sys.exc_value, sys.exc_traceback
    screen.clean()
    traceback.print_exception(dump[0], dump[1], dump[2])
else:
    screen.clean()

## End. ##
