Ayuda con cliente IRC en python

Nucklear

Buenas, a ver si podeis ayudarme. Estoy escribiendo un cliente IRC en python para aprender un poco como va el tema.

El código es este:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import socket

#Definimos los datos de conexion
nick = 'Nucklear_'
debug = False
chan='#testchan'
host = 'irc.quakenet.org'
port = 6667


ircSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Creamos el socket para la conexion
try:
    ircSocket.connect((host,port)) #Conectamos con el servidor establecido
except socket.gaierror:
    print "No se pudo conectar a: " + str(host) + ":" + str(port)
    sys.exit(1) #Paramos le ejecución en caso de error
    
ircSocket.recv(4096) ircSocket.send('NICK ' + nick + '\r\n') ircSocket.send('USER John Doe Doe :Nuck IRC\r\n') ircSocket.send('JOIN ' + chan + '\r\n') while True: data = ircSocket.recv(4096) #Almacenamos Buffer print data #Imprimimos en consola la respuesta del servidor if data.find('PING') != -1: #Buscamos en la respuesta 'PING' ircSocket.send('PONG ' + data.split()[1] + '\r\n') #Enviamos 'PONG' como respuesta

El problema que tengo es que conecta al servidor pero no entra al canal porque creo que el comando JOIN se ejecuta antes de que esté conectado al 100%. ¿Sabeis como lo podría solucionar?

Y otra duda, el while True mantiene la conexión viva, ¿para seguir con la ejecución y que esa parte siga ejecutandose y no se desconecte debería ejecutarla en paralelo o como?

elkaoD

http://docs.python.org/library/select.html

Lo del while depende. Si tu programa responde suficientemente rápido al ping no necesitas hacerlo multihilo.

while True: 
    data = ircSocket.recv(4096) #Almacenamos Buffer
    print data #Imprimimos en consola la respuesta del servidor
    if data.find('PING') != -1: #Buscamos en la respuesta 'PING'
        ircSocket.send('PONG ' + data.split()[1] + '\r\n') #Enviamos 'PONG' como respuesta
    _resto_de_cosas_

Mientras que resto_de_cosas termine antes del siguiente ping no pasa nada.

1 respuesta
Nucklear

#2 Thanks, ya he logrado conectar a un canal. Y una duda que me entra ahora, si por ejemplo hago lo siguiente...

while True: 
    data = ircSocket.recv(4096) #Almacenamos Buffer
    print data #Imprimimos en consola la respuesta del servidor
    if data.find('PING') != -1: #Buscamos en la respuesta 'PING'
        ircSocket.send('PONG ' + data.split()[1] + '\r\n') #Enviamos 'PONG' como respuesta
    ircSocket.send('JOIN ' + chan + '\r\n')

En la última línea trataría de conectar al canal que yo le paso en "chan" en cada iteración, ¿eso no provocaría un error del lado del servidor?

1 respuesta
elkaoD

#3 del lado del servidor te va a echar por flood. El servidor como mucho te dice "ya estás en el canal"

Pero... ¿por qué querrías hacer eso?

1 respuesta
Nucklear

#4 Es lo que me imaginaba a ver, según yo entiendo...

Una vez abierta la conexión con el servidor yo le paso los datos de conexión. Una vez autenticado en el servidor con X parámetros, vamos al while para que mantenga la conexión abierta y podamos estar "ausentes".

Entonces ¿donde hago el JOIN para el canal? Porque cuando le paso los parametros aún no estoy autenticado, pero dentro del while floodearía el server...

#6 ¿Un ejemplo simple de ello? :b

1 respuesta
B

dentro del while verificando si tu le has enviado datos desde algún dispositivo de entrada.

1 respuesta
elkaoD

#5

  1. Conexión
  2. Wait con select
  3. Autentificarte
  4. Más wait a la respuesta con select
  5. join y otros comandos post-conexión

Y a partir de aquí ya estás conectado y dentro del canal, sólo queda:

  1. While infinito
    6.1 if (hay entrada) manda entrada
    6.2 if (hay respuesta [aunque sea de otras entradas]) imprime respuesta o ping o lo que sea

La respuesta simplemente redirígela a un handler en cuanto la recibas (p.ej. algo como el handler de los frameworks REST si has trabajado con alguno)

1 respuesta
Nucklear

#7 Thanks, ya entendí mas o menos. Voy a implementarlo y en caso de duda vuelvo por aqui :b

Usuarios habituales