Published on Wednesday, September 13th, 2006 at 11:40 am

El passat diumenge 27 d’Agost, en el canal #twiggi de l’IRC-Hispano, Futurist donà una conferència privada sobre el desenvolupament de TwiggiBot, encara que no siga el creador del bot (que és [ErAdEs]) i encara que no siga qui més linies haja teclejat (que sóc jo), ha sigut una peça fonamental en tota l’estructuració del bot, que és un treball tant important o més que l’elaborat per mi o per Erades.

Mentre ell estava explicant tots els fonaments del bot, se m’ocorregué escriure una tirada d’articles explicant pràcticament línia per línia el nostre bot per a l’IRC. Així, que avuí comence per el principi. L’espina dorsal del TwiggiBot és la classe IRC, planificada per Futurist i per mi i escrita principalment per mi junt amb aportacions i revisions de Futurist i basant-me en algunes coses de l’antic codi d’Erades.

IMPORTANT MÒDULS:
Doncs bé, comencem veient quins mòduls són necessaris per a aquesta classe i per què:
[syntax,ircpy/imports.py,python]

Què fem en aquestes línies? Primer, importem des del mòdul socket.py, la classe socket i les constants AF_INET i SOCK_STEAM. La classe socket no fa falta descriure-la, a partir d’ella crearem l’objecte encarragat de comunicar-se amb el servidor. La constant AF_INET representa el protocol de connexió i la SOCK_STEAM representa el tipus de socket.

Després importem tot el que hi ha declarat en el mòdul general.py, necessitem les funcions error() i info(), per mostrar missatges d’error i la classe Buffer ques l’encarregada de gestionar els missatges que apleguen del socket.

Finalment del mòdul string.py importem les funcions upper(), strip() i split() per convertir el text a majúscules, per tallar una cadena i per convertir una cadena en una llista, respectivament.

VARIABLES DE CONFIGURACIÓ:
Ara, analitzarem breument un grapat de variables que són la configuració bàsica del bot.
[syntax,ircpy/configuration.py,python]

No crec que siga necessari descrire-ho detalladament, cfg_server conté el nom del servidor a connectar-se, en cfg_port trobem el port al que es connecta el client, cfg_nick i cfg_nick_pass conté el nom i la contrassenya del nick amb que s’identificarà el bot, cfg_chan conté el canal al qual es connectarà el bot i en cfg_username trobem el nom d’usuari del bot en el servidor. La llista irc_hispano_servers no s’usa per a res de moment.

__INIT__ DE LA CLASSE IRC:
Doncs ara que ja tenim els mòduls necessaris importats i les variables de configuració a punt, comencem a definir la classe IRC. Per definir la classe tots sabem com és… class IRC:
Doncs una vegada tenim aquestes dues paraules escrites comencem amb la funció __init__() que és la que s’executa quan es crea un objecte descendent de la classe IRC.
[syntax,ircpy/init.py,python]

D’acord, analitzem la funció… En primer lloc es crea l’objecte irc dins de la classe IRC, aquest objecte és descendent de la classe socket, el que significa que herada les seves propietats. Així doncs, no em fet res més que crear un objecte socket que s’anomena irc i que servirà per establir la comunicació amb el servidor.

Les variables _botw i botr són les encargades d’enviar (_botw de write) i llegir (botr de read) informació al/del servidor, simplement aixó. La variable line, és una línia auxiliar que recull la última línia escrita llegida del arxiu botr. Per últim, la variable active, indica si el socket està connectat o no està connectat, al principi no està connectat, és clar. Canviarà el seu valor a True quan s’execute la funció connect() que descriurem més avant.

Una xicoteta anotació per als que no esteu molt familiaritzats amb les classes en Python, notareu que les variables es defineixen amb la paraula self. d’avant del nom de la variable, això és per indicar, que la variable pertany a la classe i no a la funció.

CONNECTANT-SE AL SERVIDOR:
Ara veure’m de prop la funció encarregada de connectar-se al servidor IRC usant els sockets, la funció connect().
[syntax,ircpy/connect.py,python]

En primer lloc, el que fem es connectar el socket al servidor amb el mètode connect indicant la direcció del servidor i el port al qual ens connectarem.

En segon lloc, enviarem un missatge al servidor per establir un nom d’usuari, amb la funció self.send(); i també, n’enviarem un altre per posar un nick al bot amb la funció setnick().

Finalment, indiquem el canal al que es connectarà el client i assignem el valor True a la variable active de la classe, que és la que indica si el socket està connectat.

Fixem-nos que tot l’esmentat es troba en un bloc try-except, si alguna de les instruccions anteriors provoca un error, aleshores, es notificarà amb la funció error(), que ja veurem quan analitzem el mòdul general.py.

ARA, DESCONNECTAR-SE:
La funció disconnect de la classe no fa falta descriure-la molt, simplement es desconnecta del servidor. Observeu la seva simplicitat:
[syntax,ircpy/disconnect.py,python]

En primer lloc envia el missatge ‘quit’ al servidor, açò fa que el socket es desconnecte del servidor d’IRC, per què ‘quit’? Doncs RFC1459…

La següent línia tanca el socket i finalment assigna False el valor de la variable active, per indicar que ja no s’està connectat al servidor.

CANVIANT DE NICK:
La següent funció fou creada per fer més fàcil la tasca de canviar de nick. Veiem-la:
[syntax,ircpy/setnick.py,python]

En primer lloc canvia el valor de les variables _nick i _pass de la classe pels arguments de les funcions newNick i newPassw.

Finalment, envia el missatge correcte al servidor per canviar-ne el nick. Per a més informació sobre la sintaxi del missatge, mireu el RFC1459.

OBTINDRE EL NICK I SEVA CONTRASSENYA:
Aquestes dos senzilles funcions no mereixen més atenció que mostrar el codi, simplement tornen el valor una de _nick i l’altra de _pass.
[syntax,ircpy/getnick-getpass.py,python]

OBTINDRE L’ÚLTIMA LÍNIA DEL SERVIDOR:
La funció setline obté l’última línia recibida del servidor pel socket i l’enmagatzema en la variable line de la classe IRC. Les dos línies que contenen la funció crec que no mereixen cap dedicació especial.
[syntax,ircpy/setline.py,python]

ENVIAR MISSATGES AL SERVIDOR: La funció send és una de les més importants ja que és l’encarregada d’enviar informació al socket (i aquest al servidor).
[syntax,ircpy/send.py,python]

Aquesta funció, encara que no és molt complicada, crec que si que es mereix més atenció. Simplement, la funció intenta escriure el text indicat en l’argument de la funció en _botw (recordem que es la variable que recull el que el socket ha d’enviar i ho envia), si hi ha cap error, mostrarà un missatge en pantalla informant-nos de que l’enviament del missatge no ha estat satisfactori.

OBTINDRE LES PARTS DE LÍNIA D’ENTRADA:
Aquesta funció [getlineparts()] és molt útil per al processament dels missatges rebuts del socket, vegem-la.
[syntax,ircpy/getlineparts.py,python]

En primer lloc comproba mitjançant un if si hi ha cap text en el paràmetre line de la funció, en cas afirmatiu, assignarà a la variable result el valor d’aquest paràmetre, però amb la diferència de que ara, result no serà un cadena de text, sinú una llista separada pels espais del paràmetre line. Per exemple si line era “hola, learning to program mola!”, ara result serà [”hola,”, “learning”, “to”, “program”, “mola!”].

Després escriu en majúscules el primer valor de la llista, en el nostre exemple quedaría així la variable result [”HOLA,”, “learning”, “to”, …].

Les dos línies que queden són per a saber si s’ha de retornar la llista completa o el valor d’un dels ítems d’aquesta, comprova si el paràmetre pos és -1, si és així retorna tota la llista, si no, retorna el valor de la llista indicat en pos:

pos = -1 -> return result;

pos => 0 -> return result[pos];

ENVIAR TEXT A UN CANAL D’IRC:
Aquesta funció ha estat feta per simplificar un poc l’enviament de text a un canal de l’IRC, ja que amb la funció send() era suficient.
[syntax,ircpy/talk.py,python]

Bàsicament, la funció crida a la funció send(), esmentada anteriorment, però passant-li com a paràmetre la sintaxi correcta per a enviar text a un canal (veure RFC1459).Bo, doncs açó és el que és el mòdul irc.py ara per ara (28/08/2006). Sols espere no haver-vos avorrit massa, :-) i fer-vos saber, que aquest mòdul pot sofrir variacions, per saber les últimes novetats passeuvos per el servidor subversion del projecte.

Related Posts

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>