Poster une réponse  Créer un sujet 
Binds PUBM, précisions sur le match
Auteur Message
Artix
Boulet qu'a tort
*****


Messages : 117
Groupe : Moderators
Inscription : Jan 2009
Statut : Hors ligne
Message : #1
Binds PUBM, précisions sur le match

Bon voilà:
Aujourd'hui, Haly à demandé sur #eggdrop comment on pouvait matcher des commandes non existantes sur un canal via un bind pubm.
Le simple fait que ca soit un bind pubm assure déjà que les commandes n'existent pas, mais le vrai problème concernait le mask à utiliser.

Au début on pensait utiliser un mask "* !*", mais ça va pas, car le mask des binds pubm est de la forme "chan text", et le * du canal va 'déborder' sur le texte, c'est à dire matcher le texte en même temps que le canal.
Le résultat, c'est que "!boo" est matché aussi bien que "salut ! ca va ?"

Donc j'ai fait des recherches dans le code source de l'egg.

Tout commence dans le module irc, chan.c, avec gotmsg, qui est appelé lorsqu'un PRIVMSG est reçu.
Pour déclencher les binds pubm, cette fonction appelle ensuite check_tcl_pubm, dans irc.c du module irc.
Viens ensuite check_tcl_bind dans tclhash.c pour déclencher les bindings de façon plus générale,
Déclenchant ensuite check_bind_match du même fichier, qui appelle pour finir wild_match_per de match.c (le type de recherche passé par le bind pubm étant MATCH_MASK).
Dans ce fichier on peut voir l'algo de match (une vraie usine à gaz oO), et les defines utilisés par la fonction.

Bref, beaucoup de baratin pour rien, mais en regardant les defines correspondant présents au début de match.c, on peut voir ceci:

Code :
#define QUOTE '\\' /* quoting character (overrides wildcards) */
#define WILDS '*'  /* matches 0 or more characters (including spaces) */
#define WILDP '%'  /* matches 0 or more non-space characters */
#define WILDQ '?'  /* matches ecactly one character */
#define WILDT '~'  /* matches 1 or more spaces */

(tain le typo sur exactly)

Et donc, pour ceux qui sont fâchés avec l'anglais:
\ permet d'annuler un joker
* matche 0 ou plus caractères
% matche 0 ou plus caractères, sans les espaces
? matche un seul caractère
~ matche un ou plusieurs espaces

CE QUI SIGNIFIE qu'il y a une erreur dans la plus part des scripts TCL utilisant des binds pubm : le canal ne contenant pas d'espaces, il faut utiliser le caractère % pour le matcher et pas un * : ca évite d'éventuels débordements du joker pour le canal !

Dans le cas de Haly, il faudrait donc utiliser un bind sur "% !%" (j'ai testé).
Ah, et j'ajouterais que ce message s'adresse particulièrement à MenzAgitat, et ses binds en "* %*" XD

16/06/2010 15:36
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
MenzAgitat
Moderator ou à raison
*****


Messages : 519
Groupe : Moderators
Inscription : Jul 2007
Statut : Hors ligne
Message : #2
RE: Binds PUBM, précisions sur le match

Tu as raison, il semble que je n'avais pas compris l'utilisation de % : je m'en servais pour que mes binds fonctionnent même sur des commandes écrites en couleurs/gras/...
Merci pour cette information indispensable.

Artix a écrit :
Dans le cas de Haly, il faudrait donc utiliser un bind sur "% !%" (j'ai testé).

Mais en faisant ça, tu ne matcheras pas la commande si on lui passe un argument.

Artix a écrit :
(tain le typo sur exactly)
(...)
CE QUI SIGNIFIE qu'il y a une erreur dans la plus part des scripts TCL (...)

no comment :]


toute l'actualité de mes scripts ici     (dernière mise à jour le 21/04/2012)

Tout programme comporte au moins un bug et pourrait être raccourci d'au moins une instruction. De quoi par implication, on peut déduire que tout programme peut être réduit à une seule instruction qui ne fonctionne pas.

Ce message a été modifié le: 16/06/2010 22:16 par MenzAgitat.

16/06/2010 22:11
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
CrazyCat
Administrator
*******


Messages : 1,392
Groupe : Administrators
Inscription : Apr 2004
Statut : Hors ligne
Message : #3
RE: Binds PUBM, précisions sur le match

Même si je l'ai dit sur le canal, merci Artix et j'ai modifié la page wiki sur les binds: http://www.eggdrop.fr/Binds#Masques

N'hésitez pas à la corriger et/ou ajouter des informations pertinentes


Trucs et astuces en programmation - Je suis actuellement
17/06/2010 08:32
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse  Créer un sujet 

Voir une version imprimable
Envoyer ce sujet à un ami
S'abonner au sujet | Ajouter le sujet aux favoris

Aller à :