Vos identifiants
Bienvenue
Voir tous les scripts
Pour mirc 6.1 et moins
Pour mirc 6.2
Pour mirc 6.3
Pour mirc 7.1
Top 10
Vous aimez ou détestez
Soumettre un script
Foire aux questions
Forum de discussion



Les bases du Scripting
Le virus "irc.worm.gen"
Le mIRC D'Or
Snippets
ScreenShots
Le Défi du moment
Tag-moi-ça
Le Pire de l'IRC
L'IRC pour les nuls
Configurer UnrealIRCD
Configurer votre box
Attention à l'arnaque!
Usenet et les News
Arrêter de fumer
Un peu d'orthographe
Unreal/Anope Admin
mIRC Script Server
Proxy Web Chat
Magneto for Unreal
Super Poupées
Tour de cartes
L'Equipe
Partenariat
Administration

Web Of Trust
www.chat.exolia.net (Francophone)
fantasya.org (Francophone)

                                            

Un script open-source

Article soumis par Averell le 2/2/08

Ce document est un peu long, vu que je baratine beaucoup. En voici le sommaire:
  • Introduction
  • Le meilleur script, c'est quoi?
  • Un classement des fonctionnalités: indispensables, pratiques, fun, et sans intérêt
  • Mon script à moi: un noyau pour démarrer
  • Les limitations de ce noyau
  • Téléchargement du noyau et forum de discussion
  • Une idée d'amélioration immédiate
  • Introduction

    C'est une idée qui me travaille depuis longtemps: la plupart des scripts pour mirc (sinon tous) sont en fait open-source: cela signifie qu'ils sont livrés avec les codes sources (il n'existe pas encore de scripts compilés), et que la plupart des utilisateurs, même si l'auteur le leur interdit expressément, ne se gênent pas pour en modifier le code. Ceci, dans le but, par exemple, d'y rajouter des fonctionnalités interessantes. C'est ainsi que mon vieux mirc Script Server dont je suis l'initiateur, a été repris par mon ami Kotake (que devient-il?) et MrSecurix pour y rajouter des fonctions qu'il n'avait pas au départ. J'ai pu d'ailleurs m'apercevoir au hasard de mes balades sur la page serverlist, qu'il existait des personnes ayant tellement modifié ce script, que j'ai eu au début bien du mal à le reconnaître (je pense en particulier à la modification de l'écran de démarrage, ou du rajout d'un système de masquage des hosts, que j'ai pu déjà observer chez certains utilisateurs chevronnés). Malheureusement, leurs utilisateurs ont gardé leur code pour eux; quel dommage de ne pas en faire profiter la société!

    Donc ma question: pourquoi ne pas faire un vrai script open-source sous licence GPL? L'intérêt d'un tel script, qui rejoint la philosophie du logiciel libre, serait de créer un outil excessivement stable, convivial et sécurisé. Et ce, justement parce que tout le monde participe à son développement: ajout de fonctionnalités pratiques, suppression des bogues, suppression enfin des codes malveillants que certains seraient susceptibles d'y insérer.

    Pendant longtemps, le plus grand reproche que j'ai adressé aux nombreux scripts que j'ai testés, est... qu'ils se ressemblaient tous! Non pas dans le design, mais dans les fonctionnalités. Souvent, et cela est bien dommage, on trouve énormément de choses inutiles dans ces scripts; parfois au contraire, on y trouve un truc tellement fun qu'on souhaite garder le script pendant de longues années. Mais c'est très rare. Et si ce truc tellement fun est reconnu par la société des scripteurs comme vraiment indispensable, alors on voit fleurir toute une kyrielle de nouveaux scripts qui incluent cette fonctionnalité.

    Le meilleur script, c'est quoi?

    C'est élémentaire, mais à mon avis, et pour citer mon vieux pote Cid créateur de coolzone-irc.com (site initialement dédié à l'irc et au scripting, dans les années 2000), le meilleur script, c'est encore celui que vous écrivez! Et j'irais même jusqu'à dire: celui que vous écrivez dans le but de vous en servir! Cela paraît trivial, mais beaucoup de scripteurs font des scripts qu'ils n'utilisent pas, ou qu'ils utilisent un moment puis s'en désintéressent. Cela existe, comme il existe des gens qui créent des applis dans le but de les commercialiser, mais qui ne s'en servent pas eux même (malheureusement, des gens comme ça, il y en a trop!!)

    Un classement des fonctionnalités: indispensables, pratiques, fun, et sans intérêt

    Volontairement je mets de côté les scripts de guerre, que n'affectionnent qu'une certaine caste d'utilisateurs, dont le nombre est à la baisse depuis ces dernières années - le hacking n'étant plus tellement tendance. Au contraire, je me mets du côté des victimes potentielles: pour moi, un bon script est avant tout un script qui garantit l'intégrité de votre connexion, et qui permet de se protéger des attaques de hackers. De plus, je ne parlerai que très succinctement des scripts de modération, ou d'aide à la modération. Cela ne veut pas dire que je les néglige: au contraire, ceux-ci constituent une catégorie de scripts à part entière. Il est courant qu'un script "all around" intègre des fonctions de modération.

    Cinq catégories de fonctionnalités existent, à mon avis, dans le domaine du scripting:

    1) Les truc indispensables, et même tellement indispensables que l'auteur de mirc lui même les a finalement incluses dans son logiciel. Par exemple:
  • Un système permettant de limiter le flot de ctcp reply automatiques renvoyés par mirc lorsqu'on le sollicite par des ctcp ping ou des ctcp version. Ce système a tordu le cou aux pratiques de hackers de l'irc utilisant cette faille historique pour forcer la personne à flooder et à se faire killer du serveur pour excess flood (voir le détail dans la section l'irc pour les nuls). Pour pallier cela, longtemps les auteurs de scripts de protection ont inclus un système d'ignore indexé sur le timer.

  • Le rejoin when kicked qui, d'ailleurs, a forcé les opérateurs de channels à prévoir un ban supplémentaire (de quelques secondes souvent) pour ne pas voir la personne kickée revenir. Parallèlement à cela, il existait une caractéristique pénible de mirc qui a été corrigée depuis: le fait que la fenêtre du channel disparaisse lorsque vous en étiez kické-banni (donc vous perdiez aussi sec tout l'historique de la conversation sur le chan). Pour se prémunir de cela, il était donc recommandé de logguer. Personnellement, à l'époque je gérais une user-window sur laquelle tous mes chans étaient mirrorisés. Si jamais un chan disparaissait pour cause de kick-ban, j'avais toujours la possibilité de jeter un oeil sur la fenêtre miroir pour essayer d'en connaître la raison.

  • L'ajout des signes distinctifs des ops ou des voices (ou plus tard, des half-ops) lorsqu'ils parlent dans le channel. Fonctionnalité moins indispensable que les autres, mais qui a été intégrée à mirc.
  • 2) Les trucs qui rendent la vie du chatteur plus agréable, à tel point qu'on pourrait presque les placer dans les indispensables bien que l'auteur de mirc ne les aient jamais intégrés à son produit. Par exemple:
  • Un système d'accès rapide et convivial aux fonctions des services (chanserv/nickserv, ou X, ou UWorld), qui dépend évidemment du serveur sur lequel on utilise le script. C'est souvent la raison pour laquelle un script a été écrit pour un serveur particulier.

  • Un débannisseur, qui ne marche que si on vous bannit alors que vous êtes opérateur. Le système réagit alors instantanément pour vous débannir et kicker (ou déopper) la personne qui a prononcé le ban sur vous. Evidemment cette protection est connue, c'est pourquoi les scripts de kick/ban prévoient la plupart du temps de vous déopper avant de vous bannir. Je dois donner le code de ce bout de script (qui prend une ligne, et qui était déjà connu dans les années 90) dans la section "l'irc pour les nuls".

  • Un système d'away, qui vous met automatiquement (sur configuration) en away après un certain temps d'inactivité.

  • Un notifieur de présence dont je parlerai plus en détail plus bas, et qui a été un défi de ce site. Il s'agit de savoir quand la personne à qui vous parlez en PV s'en va. C'est une fonctionnalité qu'on trouve sur tous les systèmes de messagerie de PC à PC tel que MSN ou AIM, mais pas sur mirc.

  • L'utilisation intelligente de certains sons pour signifier votre changement d'état sur irc (oppage ou déoppage, ou arrivée d'un PV...)

  • La traduction des raws du serveur en français...

  • Un anti-autogreet ou anti-spam, dont j'aurai l'occasion de vous parler car c'est une fonctionnalité qui n'est pas courante.
  • 3) Les trucs fun mais relativement inutiles (le player de mp3, la lagbar, les thèmes de couleurs, les slaps, le répondeur, les infos sur votre système, et, d'une manière plus générale, les différents outils "classiques" en sockets, genre un mailer, un navigateur intégré, ou encore un système permettant de vérifier si votre script est bien la dernière version en date). J'ai trouvé une fois dans un vieux script appelé "Gnognon ring" une fonction permettant de trouver les clones d'un pseudo sur tout le serveur. C'est vachement trop inutile, mais encore fallait-il y avoir pensé ;)

    4) Les trucs vraiment inutiles et/ou pénibles qui font lamer (le revenge kick, l'autogreet, les remerciements automatiques (merci pour l'op), les auto joins, les anti-pv, les systèmes de gestion de shit-list, les lecteurs de mp3 qui affichent sur le chan ce que vous écoutez, et en général tous les dispositifs qui affichent sur le channel ce que vous ne devriez voir que vous seul, parce que le monde s'en tape que vous écoutiez Aqua - Barbie Girl.mp3 ou que, selon vos statistiques, il n'y a que 2 ops et 0 voices sur le chan. J'aimerais ne plus jamais voir ces choses-là dans un script.

    5) Les trucs malveillants qui salissent le monde du scripting en général; je pense principalement à deux choses:

    I) les protections bidons pour éviter que l'utilisateur ne mette le nez dans le code du script (utilisation de polices de caractères illisibles, systèmes anti-modification qui bloquent l'usage du script si on en modifie une ligne, bidouillages divers de mirc pour éviter l'affichage du code),

    II) les systèmes d'espionnage de l'utilisateur à son insu, genre /msg sur des channels secrets, ou socket parallèles. Ceci est détaillé dans la section le manuel du neuneu.).

    En dehors de tout cela, il arrive souvent qu'un script ait aussi des fonctions de modération. Parmi celles-ci, on trouve évidemment le détecteur de clones, moins couramment le scanneur de proxies, le détecteur de flood, le détecteur de gros mots, le détecteur de répétitions...

    Mon script à moi: un noyau pour démarrer

    Depuis des années j'utilise mon propre "script", qui est plus une collection d'addons organisés autour d'un noyau, qu'autrechose. Ce noyau ne contient pas beaucoup d'actions (surtout les actions inutiles ou guerrières; donc ne cherchez pas le massdeop!) mais il contient des automatismes, et me permet d'avoir plus de renseignements que n'en donne mirc. Ces renseignements sont parfois inutiles: je sais d'un seul coup d'oeil sur un channel qui est clone de qui, quel est ou quels sont, en temps réel, les pseudos concernés par le dernier ban; sous certaines conditions, je peux reconnaître les ircops, ainsi que les away. Dans les renseignements plus utiles, il y a le fameux notifieur de PV, qui me permet de savoir si la personne à qui je parle ne se tire pas en douce pendant que je lui écris, ou un détecteur de netsplits, qui permet d'éviter le flood dû aux mass disconnections.

    La seule protection que j'y ai intégré est l'anti-spam: il s'agit d'un dispositif qui ferme automatiquement le PV provoqué par un spam ou par un autogreet lorsque le message contient au moins un des mots d'une liste de mots interdits (genre sex, free, download, etc.). Par précaution, parce que le système n'est pas infaillible, le message du PV est recopié sur une fenêtre utilisateur consultable à tout moment.

    Dans les actions possibles, il y a principalement un "mode tapageur" qu'il faut utiliser le moins possible, par opposition au mode "discret". Le mode tapageur effectue un /who channel sur tous les channels sur lesquels je chatte, et ce, toutes les minutes, afin de récupérer des informations de type user-hosts, ainsi que les états des utilisateurs (présence d'away et présence d'ircops). L'intérêt de le faire régulièrement est motivé par le fait que ces états (away, ircops) peuvent changer au cours du temps, et qu'il n'existe aucun moyen d'avoir des informations sur ces changements d'état en temps réel, principalement parce que ce n'est pas très important de les connaître. C'est la raison pour laquelle... je n'utilise que très rarement ce mode, car en plus, il monopolise de la bande passante. Ce mode peut être intéressant sur les serveurs privés fréquentés par un très petit nombre de personnes: c'est souvent là qu'on y trouve le plus grand nombre d'ircops. A l'opposé, sur certains serveurs institutionnels, le simple fait de faire un /who sur un gros channel vous kille du serveur: ça a été le cas, à une certaine époque, sur undernet.

    Enfin j'ai ajouté la possibilité de localiser un pseudo dans tous les channels de chat, ainsi qu'une commande altruiste appelée /uban permettant de vérifier si un pseudo est banni d'un chan, et de le débannir automatiquement si j'en suis op. La plupart du temps, il faut le faire manuellement, c'est à dire: regarder le userhost de la personne bannie, ensuite double-cliquer la fenêtre du chan pour essayer de repérer la ligne qui correspond au ban. S'il y a une centaine de bans (cas de #france sur undernet) cela peut être fastidieux.

    Les limitations de ce noyau

    Je serais très heureux de voir du monde s'inspirer de ce noyau, pour le faire évoluer vers, grosso modo, cinq directions:

    1) La configurabilité: rien n'est configurable dans ce script, pour la raison que je n'en voyais pas l'intérêt à l'époque ou j'en ai écrit des morceaux, et aussi pour la raison que les dialogs n'ont jamais été ma tasse de thé. J'ai spécifié, dans des commentaires, les endroits où il serait bon d'y apporter la possibilité de configuration.

    2) L'aspect multi-serveur: j'ai honte de le dire, mais j'ai arrêté de scripter il y a longtemps, à tel point que je ne sais même pas prendre en compte la caractéristique apportée dans mirc 6 de se connecter à plusieurs serveurs.

    3) La correction des bugs: je me suis aperçu que certaines choses, qui marchaient il y a quelques années encore, ne marchent plus, ou mal. En particulier, la fonction /uban que j'ai scriptée, permettant d'avoir des informations sur un pseudo banni (ou de le débannir) fonctionne très mal: il faut l'appeler 4 ou 5 fois pour qu'elle produise un effet. Je ne l'ai pas vérifié sur un mirc plus ancien, mais je suis absolument certain que cela provient d'un bug de la version actuelle de mirc (et que cela ne provient pas du serveur); cela marchait systématiquement du premier coup il y a seulement 2 ans.

    4) La modernisation du code: c'est du script qui marchait déjà il y a 5 ans. Beaucoup de choses ont évolué depuis, ce serait bien de dépoussiérer un peu ce code et l'optimiser, à la fois en taille et éventuellement, en rapidité.

    5) L'amélioration du code: certaines fonction présentes sur ce script sont restées à l'état de prototype (notamment la localisation de pseudos, voire la fonction /uban qui pourrait faire plus de choses).

    Téléchargement du noyau et forum de discussion

    Bien entendu, en tant qu'instigateur du projet de script open-source, je me dois de commencer le boulot; vous pouvez donc télécharger le bout de script que j'ai appelé "noyau" en cliquant ici. J'ai essayé de le commenter le mieux possible, et il est libre de droits; vous pouvez le modifier à loisir (et vous recommande de le faire) et j'attends de vous que vous échangiez vos codes et vos impressions via ce forum spécialement dédié. J'aimerais évidemment avoir du feed-back (c'est aussi l'une des raisons de l'existence de ce forum), et pas seulement que vos codes restent sur vos disques durs.

    Vous n'êtes absolument pas forcés de TOUT reprendre dans ce noyau: peut être qu'il existe des idées bien plus géniales à développer que celles que j'ai proposées; c'est à vous de voir.

    Une idée d'amélioration immédiate

    Si vous avez lu la section Configurer votre box, vous comprendrez facilement qu'une personne ayant mal configuré sa box ou son firewall est dans l'incapacité d'envoyer un fichier par dcc send sur l'irc. Comment faire pour que cette personne, qui a le fichier rare dont vous rêviez, puisse quand même vous l'envoyer? A cela, plusieurs réponses possibles:
  • Vous lui donnez votre adresse e-mail pour qu'elle vous l'envoie par ce biais. C'est bien si le fichier n'est pas trop gros, (moins de 10 Mo) et si vous n'avez pas peur de donner votre adresse e-mail à un inconnu.

  • Vous lui demandez d'héberger le fichier chez un hébergeur spécialisé, genre yousendit ou turbo-upload. De la même manière, ces échange sont possibles gratuitement si le fichier à échanger n'est pas trop gros (moins de 100 Mo je crois). En plus, ces transfert sont énormément surveillés: gare à vous si vous uploadez du warez!

  • Vous lui demandez d'uploader le fichier sur son compte ftp; encore faut-il qu'il en ait un, et qu'il sache comment s'en servir.

  • Vous ouvrez un serveur ftp sur votre pc (il en existe de gratuits et de performants sur la toile, cf. telecharger.com). IL vous suffit de communiquer à la personne votre adresse ip pour qu'elle puisse y uploader le fichier. C'est une solution que j'ai, personnellement, déjà adoptée en certaines occasions. Le problème, c'est que, du fait que la personne n'est pas accessible en tant que serveur, il est possible que la liaison ftp échoue: il faut, pour que cela marche, lui demander de cocher expressément le mode passif (PASV mode) dans son client ftp.

  • Ma méthode à moi est un peu atypique; elle consiste à dire: puisque la personne ne peut pas uploader quand je me connecte chez elle, alors il faut qu'elle uploade en se connectant chez moi. Pour ce faire, je fais tourner sur ma machine, au moyen d'un serveur Apache, un petit site web écrit en langage Perl (mon langage favori). Ce site n'est constitué que d'une page web contenant un formulaire d'upload de fichier. Il suffit que je fournisse un lien contenant mon adresse ip sous la forme http://10.20.30.40/upload à la personne, pour que son navigateur affiche ledit formulaire (cliquer le lien précédent pour voir l'exemple). Lorsque le fichier a fini d'être uploadé, la personne reçoit un message de remerciement, et un dispositif d'alerte m'envoie un message au travers de mirc.

    Mon idée, mais vous en ferez ce que vous voulez, consisterait à scripter ce système en émulant un serveur web par scripting (c'est chose maintenant courante), ce qui permettrait de s'affranchir de tout le fatras serveur web + interpreteur perl (ou php) + page écrit en perl ou php, et d'introduire cela dans le script open-source. Il suffirait d'une simple commande, accessible par menu dans le PV de la personne susceptible d'uploader, pour automatiquement "brancher" le serveur web de votre pc et envoyer à la personne l'adresse http de votre système d'upload.

    J'avais pensé le faire, mais, d'une part je n'ai plus tellement le temps ni l'envie de scripter, et d'autre part, je ne connais pas le protocole d'upload de fichier en mode http. Il est bien probable qu'en cherchant un peu sur Google (ou en lisant la RFC qui va bien), on trouve la réponse exhaustive à cette question.


    Réagir à cet article (2 commentaires)

    Titre de l'article Date d'édition Auteur Comm
    Différence entre un bot client et un bot de service 01/08/02 Averell 8
    Le link entre serveurs - comment ça marche 29/09/02 Averell 1
    Créer des fonctions de type $fct() 14/10/02 Vlad 2
    Les expressions régulières 9/03/03 Averell 1
    Avoir le Saint du jour - Snippet 15/11/04 Vestax 1
    Un script open-source 2/2/08 Averell 2


    Retour à la page des tutoriaux