Inititation au script perl pour xchat

Introduction

Ce cours a pour but de vous faire découvrir comment faire des script perl pour xchat sans forcement connaître le perl. Bien évidement pour faire des scripts bien élaboré connaître le perl est nécessaire, mais pour faire des choses simples il suffit de connaître un peu les fonctions de controles que de toute façon nous allons aborder ou d'opérateur. Si vous connaisait un autre langage que le perl, je pense que vous n'aurez aucu problème de ce coté là. Il faut savoir aussi que je ne suis pas un spécialiste de perl ni de xchat et que ce cours est juste fait à partir de observation et de propre test de script perl. Une dernière chose si vous voulez vraiment avoir une documentation complète sur toutes possibilité des script xchat lire la documentation qui est fournit sur le site de xchat (www.xchat.org) est un bon début. je ferai beaucoup alusion à cette documentation mais sachez qu'il n'est pas nécessaire de l'avoir pour comprendre ce cours.

Structure du documents

  • Première partie : découverte des scripts

     

    Première partie: découverte des scripts

     

    I Le PERL

    Extrait de l'un de mes docs sur le perl (dont l'adresse figure en fin du document): P.E.R.L. signifit "Pratical Extraction and Report Language" que l'on pourrai (essayer de) traduire par "langage pratique d'extraction et d'édition".
    Je vais vous passer les détails historique sur le perl car ceci n'est pas un cour de perl, mais comprenez par là que perl est LE lanagage pour manipuler facilement du texte (appellé chaine de texte).
    Pour ceux qui ont xchat sous win ils doivent bien sur installer un interpréteur perl disponnible à l'adresse suivante: http://www.activestate.com/Products/ActivePerl/Download.html

    Il faut savoir que perl est un langage interprété, c'est à dire que chaque instruction est lut puis ensuite est exécuté, contrairement à un langage comme le C qui lui est d'abord compilé (c'est à dire qu'un compilateur vas d'abord lire le programme puis ensuite le traduire en langage compréhensible par l'ordinateur (en fait le processeur)) puis sera exécuté ce qui à pour conséquence d'être plus rapide qu'un langage interprété comme le perl

    On pourai ce poser la question de pourquoi ne pas faire nos script en C (déjà le fait de dire script indique que le langage utilisé est interprété et non compilé) ? Pour la simple est bonne raison qu'un module en C pour Xchat serai long est fastidieux à écrire et que celà pourrai emdommager Xchat, et puis aussi car le C n'est pas forcement adapté à la manipulation de texte. De toute façon rassurez-vous la vitesse d'execution (0.01 secondes ?) est largement suffisante pour l'IRC

    II Introduction au langage perl

    PERL, comme tout langage, possède ce que l'on appelle une synthaxe, une synthaxe dertermine le fait que les chose doivent être écrite en respectant certaine règle, comme dans les langues écrite comme le français où l'on doit mettre un point à la fin d'un phrase, ou encore le sujet avant le verbe etc...

    Notion de variable

    Tout d'abord il faut bien comprendre la notion de variable, une variable est en fait un moyen de stocker des informations et dont on se servira sans pour autant connaitre leur contenu, une variable associe un nom à une information qui peut varier ou pas.
    Par exemple en mathématique on utilise la variable x dans une fonction comme f(x)=3x+2, le fait ensuite d'écrire x=2 par exemple dit que la variable x vas contenir le nombre (l'information) 2, comme ça par la suite on va remplacé x par sa valeur et on pourra calculer f(2) en remplaçant x par son contenu qui est le nombre 2, en fait le fait d'écrire x dans la fonction permet d'avori toujour le même calcul masi on o à juste à changer sa valeur pour obtenir des résultats différents.
    La différence entre les mathématiques est la programmation est l'emploi que peut être fait des variables, ainsi on peut stocker du texte, des chiffres, une liste de nombre ou de morceaux de texte...

    La synthaxe pour associer une information à une variable est la suivante :
    $nom_de_la_variable=information;
    -Le $ avant le nom désigne le type de variable, il n'en existe que 3, $ variable scalaire, sachez seulement que ce sont généralement les variables où l'on stock une information et non pas une liste d'information, le @ et le % qui eux désigne une liste d'information généralement un tableu de valeur, je reviendrai plus tard sur la différence entre les deux. Autre chose le $,le @ ou le % seront toujours mit qand on fera appel à une variable.
    -nom_de_la_variable est le nom de la variable qui ne peut comporter d'espace ainsi que divers caractères spéciaux.
    -Le = signifie que l'on associe information à la variable nom_de_la_variable
    -le ; signifie la fin d'un instruction on l'utilise car si l'on veut associer à uen variable un long texte pour plus de lisibilité on sautera des ligne donc le ; signifie que l'on à finit d'associer, à ne pas oublier.

    Exemples :
    $fruit="pomme"; signifit que l'on associe à la variable fruit le texte pomme, les " servent à désigner une chaine de texte.
    $x=2; signifit que l'on associe le nombre 1 à la variable x, contrairement à la chaine de texte les guillements ne sont pas obligatoire, il faut savoir que perl ne fait pas la différence entre "1" et 1 ce qui est un avantage pour les manipulations qu'on poura faire avec.

    Print

    la fonction print permet de faire afficher (écrire est le terme exact) quelque chose sur la sortie que l'on veut, par défault print vas écrire sur ce que l'on appelle la sortie standart qui dépend de comment est lancé le programme, dans le cadre des script Xchat l'équivalent de print vas écrire sur la fenêtre actuelle en dessous de texte déjà présent (les messages des gens par exemple)

    la synthax de print est:
    print kelkechose;
    le kelkechose peut être à peut près n'importe quoi comme par exemple une variable, une chaine de texte, un tableau, un nombre...

    Nous allons utiliser ici ce qui remplace le print dans les script Xchat, c'est IRC::print("kelkechose");

    Exemple :
    IRC::print("salut"); celà affichera salut dans la fenêtre Xchat, Attention ça n'envera pas le message "salut", mais seulement vous indiquera salut (on peut s'en servir par exemple pour vérifier que le programme exécute bien certaine chose)
    IRC::print("$fruit"); affichera le message pomme dans la fenêtre Xchat. note: les variables sont traité avant les guillemets, ainsi vous pouvez mettre IRC::print("J'aimes les $fruit"); affichera: J'aimes les pomme

    Bon j'irai pas plus loin dans mon introduction à perl (regarder à la fin du document pour allez voir des documentations qui traitent plus en détail tout ça) et vous ferez découvrir la suite des possibilité et des nombreuses fonction à travers la suite du document, les complements d'information typiquement perl, souvent la synthaxe de la notion décrite, seront écrit en vert pour plus de lisibilité

    III La structure d'un script Xchat

    Deux choses interviennent dans la structure d'un script Xchat, tout d'abord la notion de handler et de sous-routines ou sous-fonctions

    Une sous-routine ou sous-fonction, est en fait une partie d'un programme à laquelle on à associé un nom, généralement elle contient un ensemble d'instructions auxquels on à souvent besoin de faire appel, celà permet de gagner de la place car au lieu de mettre à chaque fois le groupes d'instructions là où en à besoin on va juste appeller le nom de la sous-fonction qui les regroupent. Il faut savoir que l'on peut passer des arguments (ou valeurs) à la fonction ce qui dans l'exemple mathématiques précédent permettrai d'écire f(2) au lieu de 3x2+2.
    La synthaxe pour creer une sous fonction est la suivante :
    sub nom_de_la_sous_routine
    {
    instructions diverses
    }
    le { et le } délimite la fonction

    Un Handler (appellé aussi gestionaire) permet de faire exécuter une tache en fonction d'un événement qui arrive, pour les scripts perl Xchat un handler déclenche une sous-routine en fonction d'un événement. donc les script Xchat se compose généralement d'un certian nombre de sous-fonctions et de handler qui sont mit en début de script.

    la synthaxe des handler est décrite dans la documentation non-officiel des script Xchat, on va ici utiliser seulement deux de ces handlers, car l'explication du fonctionement des ces deux handler vous permettra de comprendre la doc.

    Exemple de structure d'un script Xchat:
    #!/usr/bin/perl <===== désigne le type de fichier ici un script perl


    IRC::register("Skarsnik's script"," 2.0","",""); #ligne obligatoire pour identifier le script
    #les fameux handler (les # servent à mettre des lignes de commentaire, c'est à dire des choses qui en seront pas exécuté)
    IRC::add_command_handler("/quotee","quote");
    IRC::add_message_handler("PRIVMSG","msg_analyse");
    #puis les sous-routines
    sub msg_analyse() # les parenthèses ne sont pas obligatoire on verra plus tard leur utilité
    {
    .divers instructions;
    }
    sub quote
    {
    encore des instructions;
    }

    IV les handlers

    IRC::add_command_handler

    Ce handler met en place l'écoute d'un commande tapé par l'utilisateur de Xchat, /ping est uen commande, donc grâce à ce handler vous pourrez mettre en place facilement vos commandes personnel, dans l'exemple précédent /quotee est uen commande qui va envoyer une citation choissit eu hasard parmit une liste, on vera plus tard sa mise en place
    Sa synthaxe est
    IRC::add_command_handler("/nom_de_la_commande","nom_de_la_sous_routine");
    la struture ("quelquechose","autrechose") se retrouve souvent en perl les parenthèses signifie que l'on fait appel à une fonction,"quelquechose" est un argument qui est du texte, la virgule signifie que l'on va passer un autre arguments, c'est en fait le séparateur d'arguments.
    ne pas oublier le / avant le nom de la commande , le nom de la sous routine associé doit exister, on remarque la précense du poit virgule obligatoire dans la synthaxe perl.

    IRC::add_message_handler

    Ce handler comme son nom le laisse à supposer permet de déclencher des sous routines en fonction de message.
    Sa synthaxe est IRC::add_message_handler("message","nom_de_la_sous_routine");
    la synthaxe est la même en faite que pour le handler précédent.

    Tout de suite ecrivez , ou copier coller ce petit script appeler le par exemple : bonjour.pl:
    IRC::register("script de test","1.0","",""); #le premier arguments est le nom du script et le deuxième sa version, le reste ne sert à rein pour l'instant.
    IRC::add_message_handler("bonjour","reponsedebonjour");
    sub reponsedebonjour
    {
    IRC::print("on m'a dit bonjour !!!!!!\n");#le \n n'est pas obligatoire et permet de faire un retour à la ligne
    }
    Pour le lancer allez dans le menu script & plugin puis load perl script rechercher bonjour.pl puis mettez ok, allez sur votre serveur irc préféré, allez dans un channel puis demander à quelqu'un de vous dire bonjour, et là Oh! surprise il ne se passe rien, ne cherchez pas une erreur dans le script, celà vient du fait que ce qui est appeller message pour ce handler sont tout ce que le serveur IRC dit à Xchat. Rassurez-vous pas besoin de connaître la norme des messages serveur.
    Si on lit la doc non-officiel à propos de ce handler on aurai pus s'en douter, car en fait ce handler écoute le type de message. Nous allons tester le premier type qui est citer en exemple dans la doc, pour cela nous allons avoir recours à une variable spéciale propre à perl qui est le tableau @_, ce tableau contient les arguments passés à une sous routine par exemple dans f(2), @_ contiendra 2, or il se trouve que les handlers envoie certains arguments aux sous routines qu'ils lancent. donc on va crée un script qui vas nous donner le contenu de @_ quand IRC::add_message_handler comporte le type de message PRIVMSG.

    Pour cela on va metre en place le script suivant, le handler suivit d'une sous-routine qui va afficher ses arguments, donc la variable @_, je pense que vous avez déjà une idée de l'allure du script
    IRC::register("2 eme script de test","1.0","","");
    IRC::add_message_handler("PRIVMSG","affiche_argument");
    sub affiche_argument
    {
    IRC::print @_ ; # il n'y pas besoin de mettre en forme le tableau chaque ligne sera afficher avec un retour à la ligne
    }

    vous obtenez quelquechose comme ça : :WildZeck_!~Zeck@zeck999.net1.nerim.net PRIVMSG #linuxfr :mdr , nous allons apprendre à l'exploiter dans la suite de ce cours

     

    Deuxième partie: mise en place d'un script

     

    I Analyse du résultat de affiche_argument

    pour prendre l'exmple que j'ai donné il faut savoir dabord que "WildZeck_" à dit dans la salle "#linuxfr" le message suivant "mdr", et l'on obtient ça avec le script précédent
    :WildZeck_!~Zeck@zeck999.net1.nerim.net PRIVMSG #linuxfr :mdr
    On peut voir que la ligne commence par ":" puis ensuite vient le nom de la personne qui à dit le message, ~Zeck@zeck999.net1.nerim.net est le nom de l'host de WildZeck_ qui est précédé d'un "!". Ensuite on à un espace puis le type de message "PRIVMSG", puis encore un espace, puis le nom du channel, encore un espace, ":" puis enfin le message envoyé.
    D'après ces observations on peut donc conclure qu'un message envoyé par quelqu'un dans un channel respect la forme suivante:
    :nick!hostname PRIVMSG #channel :message de nick
    maintenant il nous reste plus qu'a séparer les informations qui nous interesse et les associer à des variables pour facilité l'écriture du script, la puissance de manipulation de texte de perl va ici beaucoup servir.

    II Extraction des informations