Bonjour voila j'ai un petit code qui est censé detecté un user qui fait de la pub pour son salon ( exemple: venez sur #paris )
Le bot devrais detecter le # <== qui est le prefixe des salons
et ensuite il devrais joindre le salon concerné et retourner la pub en y inscrivant le nom de mon salon.
mais il y a un petit soucis quand quelqu'un ecris venez sur #paris il detecte pas mais si c'est ecris venez sur # paris avec un espace il detecte et ensuite à la detection il me repond
Tcl error [pubm:retourpub]: invalid channel prefix
voici le code
tcl
bind pubm - "*#*" pubm:retourpub
proc pubm:retourpub {nick host handle channel arg}{if{[string match *#*$arg]}{global spamchan spamnick
set spamchan "[lindex $arg 0]"set spamnick "[lindex $arg 1]"
channel add $spamchan
utimer 5 msg
}}proc msg {}{global spamchan spamnick
putserv "PRIVMSG $spamchan :Spam détecté de la part de $spamnick . Retour de spam : Venez sur #pied-davoine2"
utimer 5 quittt
}proc quittt {}{global spamchan spamnick
channel remove $spamchan}
Donc dans un premier temps, utilise les balises "tcl" dans le forum, c'est mieux que les balises "code".
Ton code n'est pas très cohérent, dans le sens ou tu veux détecter un message sur un salon et ton tcl en détecte un en privé.
J'ai codé rapidement ce que tu voulais faire, ayant vu que tu avais essayer quelque chose.
En revanche, je n'ai pas tester ma source, faute de ne pas disposer de shell actuellement.
Voilivoilou :
tcl
bind pub - * pub:spam
proc pub:spam {nick host hand chan arg}{set arg [split$arg] # Je détecte l'éventuelle présence du signe # dans ce que la personne vien d'écrire sur le salonif{[string match *#*$arg]}{
# Dans le cas ou il y a une diese, je récupere le channel pour lequel la personne à fait la pub.set spam_chan [lindex$arg[detect_spam $arg]] # Je join le salon
channel add $spam_chan # Je demande d'arrêter de spammer
utimer 3 avert_spam $nick$chan$spam_chan # Je pars du salon
utimer 5 channel remove $spam_chanreturn0}}
## -> Je suis persuiader qu'il existe l'équivalent de ma proc detect_spam en tcl# Une fonction toute prête, mais ayant la flemme (très franchement) de chercher# Puis ayant voulu m'amuser un petit-peu, j'ai recoder l'éventuelle fonction# Qui existe.#proc detect_spam {arg}{
# On affecte a la variable "nb_char" le nombre de mot qu'il y a dans $argset nb_char [llength$arg] # On crée une variable nommé "nb" qui sera notre point de référence dans la chaine. # A savoir pour récuperer la position du mot par rapport a la chaine.set nb -1 # On lance la boucle qui va donc trier notre chaineforeach a $arg{
# On incrément la variable "nb"incr nb
# Si le premier charactere du mot qui est vérifier est "#" (la dièse), ont considère cela comme du spam # On renvoie la position du mot dans la chaineif{[string index $a0] == "#"}{return$nb;break}}}
## J'aurai pu intégrer cette procédure dans celle qui détecte un méssage# Mais j'ai séparé le tout car si maintenant tu veux détecter en pv,# Tu n'as plus qu'a faire appel à cette fonction.proc avert_spam {pseudo salon salonspam}{
puthelp "PRIVMSG $salonspam :Merci d'éviter de faire de la pub sur $salon ($pseudo)"return0}
Je doute qu'il marche du premier coup, merci de me faire un rapport des éventuels bugs/erreurs.
Sache qu'il est codé de telle façon qu'il ne peut être opérationnel a 100%.
Exemple foireux :
Citation :<Spammeur> Kikoolol venez tous sur #machin ensuite sur #bidule puis sur #chouet
Mon tcl devrait fonctionner, auquel cas il rejoindra uniquement le salon #machin, et aucun autre salon.
Il faudrait apporter quelques modification, bref, il est facilement modifiable, améliorable.
J'ai fais exprès de bien commenter ... pour que si tu veuilles le modifier, tu puisses le faire.