#! /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:
	    try:
		if p.screen.touched:
		    p.servers[0].out = [1]
		rl = map(lambda x: x.sock,
			 filter(lambda x: x.connected, 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:
				if serv.quitting:
				    serv.clean(p)
				else:
				    p.screen.touched = p.screen.touched | 16
			    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]
	    except select.error:
		pass
	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. ##
