Binds PUBM, précisions sur le match
#1
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
Répondre Avertir
#2
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 :]
Répondre Avertir
#3
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
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté