Petit rappel sur les hostmasks
#1
Suite à une conversation vu hier sur #eggdrop, je pense qu'il est important de faire un rappel sur la fonction maskhost.
On l'utilise bien souvent avec les types de 0 à 9 (le 3 étant par défaut) car ils sont bien expliqués:

Code:
Type    Mask
0     *!user@host
1     *!*user@host
2     *!*@host
3     *!*user@*.host
4     *!*@*.host
5     nick!user@host
6     nick!*user@host
7     nick!*@host
8     nick!*user@*.host
9     nick!*@*.host
Mais on ne lit pas assez la suite de la documentation:
Quote:You can also specify types from 10 to 19 which correspond to types 0 to 9, but instead of using a * wildcard to replace portions of the host, only numbers in hostnames are replaced with the '?' wildcard. Same is valid for types 20-29, but instead of '?', the '*' wildcard will be used. Types 30-39 set the host to '*'.

Ce qui donne dans les faits:

tcl
% set tmask idiot!la4m3r@abo127.fai.fr
% for {set i 0} {$i<40} {incr i} { putlog "$i => [maskhost $tmask $i]" }
0 => *!la4m3r@abo127.fai.fr
1 => *!*la4m3r@abo127.fai.fr
2 => *!*@abo127.fai.fr
3 => *!*la4m3r@*.fai.fr
4 => *!*@*.fai.fr
5 => idiot!la4m3r@abo127.fai.fr
6 => idiot!*la4m3r@abo127.fai.fr
7 => idiot!*@abo127.fai.fr
8 => idiot!*la4m3r@*.fai.fr
9 => idiot!*@*.fai.fr
10 => *!la4m3r@abo???.fai.fr
11 => *!*la4m3r@abo???.fai.fr
12 => *!*@abo???.fai.fr
13 => *!*la4m3r@abo???.fai.fr
14 => *!*@abo???.fai.fr
15 => idiot!la4m3r@abo???.fai.fr
16 => idiot!*la4m3r@abo???.fai.fr
17 => idiot!*@abo???.fai.fr
18 => idiot!*la4m3r@abo???.fai.fr
19 => idiot!*@abo???.fai.fr
20 => *!la4m3r@abo*.fai.fr
21 => *!*la4m3r@abo*.fai.fr
22 => *!*@abo*.fai.fr
23 => *!*la4m3r@abo*.fai.fr
24 => *!*@abo*.fai.fr
25 => idiot!la4m3r@abo*.fai.fr
26 => idiot!*la4m3r@abo*.fai.fr
27 => idiot!*@abo*.fai.fr
28 => idiot!*la4m3r@abo*.fai.fr
29 => idiot!*@abo*.fai.fr
30 => *!la4m3r@*
31 => *!*la4m3r@*
32 => *!*@*
33 => *!*la4m3r@*
34 => *!*@*
35 => idiot!la4m3r@*
36 => idiot!*la4m3r@*
37 => idiot!*@*
38 => idiot!*la4m3r@*
39 => idiot!*@*


Donc pour le cas qui intéressait hier (ban sur l'ident, ou plutôt username), il suffit d'un maskhost [getchanhost $nick] 30

ATTENTION L'exemple montre que certains types ne doivent *JAMAIS* être utilisés, tel le 32 et le 34.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#2
J'ajoute quelques informations qui ne sont pas dans la documentation:
  • maskhost ne nécessite pas un host valide, toute chaine de caractères (même vide) est acceptée
  • les chaines ne contenant pas de @ sont considérées comme la partie host et *!*@ est ajouté. mon.super.fai est pris comme *!*@mon.super.fai
  • les chaines ne contenant pas de ! sont interprétées comme s'il n'y avait pas de nick. toto@mon.super.fai est pris comme *!toto@mon.super.fai
  • une chaine vide est prise comme *!*@*
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#3
La discussion vu hier sur IRC concernait moi et Gringo (Anakin), je ne connaissais pas la fonction maskhost , donc Gringo tu peux aussi faire :


tcl
bind pub - !oust pub:!oust
proc pub:!oust { nick host hand chan arg } {
global chanbans
    set pseudo [lindex $arg 0]
    set duree [lindex $arg 1]  
    if {![isop $nick $chan] || ![ishalfop $nick $chan]} { return 0 }
    set hostmask "[maskhost [getchanhost $pseudo] 30]"
    set raison "\00302Tu es banni(e) du salon pour\002\00304 $duree \002\00302minute(s) - \037\002\00304Comportement à revoir.\002\037"
    putquick "kick $chanbans $pseudo $raison"
    putquick "mode #adultes +b ~time:$duree:$hostmask"
    } 
}



Explication du problème :

L'utilisateur voulait pouvoir récupérer seulement l'ident dans le mask d'un l'utilisateur pour appliquer un ban dessus.

Son script de base :


tcl
bind pub - !oust pub:!oust
proc pub:!oust { nick host hand chan arg } {
global chanbans
    set pseudo [lindex $arg 0]
    set duree [lindex $arg 1]  
    if {[isop $nick $chan] || [ishalfop $nick $chan]} {
    set hostmask "[getchanhost $pseudo $chanbans]"
    set raison "\00302Tu es banni(e) du salon pour\002\00304 $duree \002\00302minute(s) - \037\002\00304Comportement à revoir.\002\037"
    putquick "kick $chanbans $pseudo $raison"
    putquick "mode #adultes +b ~time:$duree:$hostmask"
    putquick "mode #adultes +b ~time:$duree:$pseudo*!*@*"
 
    } else {
    return 0
  }
}



Je lui ai proposé de faire un lassign et split pour capturer l'ident et l'host de la valeur de retour de getchanhost:


tcl
bind pub - !oust pub:!oust
proc pub:!oust { nick host hand chan arg } {
global chanbans
    set pseudo [lindex $arg 0]
    set duree [lindex $arg 1] 
    if {[isop $nick $chan] || [ishalfop $nick $chan]} {
    set hostmask "[getchanhost $pseudo $chanbans]"
    lassign [split $hostmask "@"] identnick hostnick
    set raison "\00302Tu es banni(e) du salon pour\002\00304 $duree \002\00302minute(s) - \037\002\00304Comportement à revoir.\002\037"
    putquick "kick $chanbans $pseudo $raison"
    putquick "mode #adultes +b ~time:$duree:*!$identnick@*"
 
    } else {
    return 0
  }
}



Avec cette méthode, il doit capturer lui même les informations qu'il veut et définir le mask manuellement lors du ban, tandis qu'avec la fonction maskhost, c'est fait automatiquement.
  Reply
#4
Petit ajout dans le cas où tu veux récupérer *!ident@* : comme dit dans les informations non documentées:
Quote:les chaines ne contenant pas de ! sont interprétées comme s'il n'y avait pas de nick. toto@mon.super.fai est pris comme *!toto@mon.super.fai
On peut donc passer outre l'utilisation de getchanhost et faire directement:

tcl
set hostmask "[maskhost $host 30]"

zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#5
$host correspondra à l'host de l'utilisateur qui tapera la commande, non? On utilise getchanhost pour justement récupérer les informations du pseudo indiqué dans la commande.
  Reply
#6
Au temps pour moi, j'ai lu trop vite.
Mais je laisse l'astuce car elle peut servir dans les cas où on veut créer un masque de l'utilisateur qui déclenche la commande sans avoir à se soucier du nick. Par exemple pour les utilisateurs de certains clients webirc où l'important est le username et le host.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)