#!/usr/bin/python

#
# Invocador de Wit para python multiplataforma, basado en el código
# en C para Linux de Norwegian (norwegian@interlink.es)
#
# Adaptado a Python por Heimy (ricardo@id-agora.com)
# Copyright (C) 2001 Ricardo J. Cárdenes Medina
#
#	Autorizado por peletier.com. (jm@peletier.com)
# WitSummon es propiedad de peletier.com. Todos los derechos reservados.
# http://www.peletier.com/trivial/WitSummon
#
# Este módulo es software libre. Puede distribuirlo y modificarlo
# ciñéndose a los términos de la versión 2 de la licencia GNU General
# Public License tal como la publica la Free Software Foundation
#
# http://www.gnu.org/licenses/gpl.txt
#

from string import split, strip
from select import select
import socket
import sys

def uso():
	print "Uso:"
	print "%s canal [-s]" % (sys.argv[0])
	print "  (El canal debe ir sin #)"
	print "  -s: modo silente"
	print
	print "(C) 2001 Ricardo J. Cardenes Medina (adaptado a Python)"
	sys.exit( 0 )

# comprobar opciones
nopts = len( sys.argv )
if ( nopts < 2 ) or ( nopts > 3 ):
	uso()

canal = sys.argv[1]
if canal[0] == '#':
	uso()

imprime = 1
if nopts > 2:
	if sys.argv[2] == '-s':
		# Cambiar a modo "Silente"
		imprime = 0

#
# conectar a peletier.com, puerto 5520
#

sockPeletier = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sockPeletier.connect( ( '212.25.146.30', 5520 ) )

# Negociación de versión
print 'WitSummon 0.1 para Python, por Ricardo J. Cardenes Medina'
print 'Autorizado por peletier.com. Protocolo WitSummon 1.0'
print
res = strip( sockPeletier.recv( 1024 ) )
print res
print
print 'Enviando versión'
res = sockPeletier.send( 'VERSION 1.0\n' )

# Recibimos la cadena FORCECONNECT
# que nos indica el servidor IRC y
# el puerto al que debemos conectar
print 'Recibiendo FORCECONNECT'
( res, servidor, puerto ) = split( strip( sockPeletier.recv( 1024 ) ) )
puerto = int( puerto )
print 'Usando el servidor %s, puerto %s' % ( servidor, puerto )
print

# Envío de información
res = sockPeletier.send( 'USER anonymous connect\n' )
print 'Usando el canal', canal
res = sockPeletier.send( 'CHANNEL #' + canal + '\n' )
if not imprime:
	print "Modo Silente"
res = sockPeletier.send( 'DONE\n' )

#
# Entrar en IRC
#
print 'Conectando al servidor IRC...'

sockHispano = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sockHispano.connect( ( servidor, puerto ) )
print 'Conectado'
print

# Indicamos a peletier el éxito de la conexión
res = sockPeletier.send( 'CONNECTED\n' )

# Ahora nos quedamos en bucle infinito, conectando ambos
# sockets
print 'Iniciando diálogo...'

sPfn = sockPeletier.fileno()
sHfn = sockHispano.fileno()

while 1:
	( inp, out, err ) = select( [ sPfn, sHfn ], [], [] )
	if sPfn in inp:
		res = sockPeletier.recv( 1024 )
		if imprime:
			print strip( res )
		res = sockHispano.send( res )

	if sHfn in inp:
		res = sockHispano.recv( 1024 )
		if imprime:
			print strip( res )
		res = sockPeletier.send( res )
