Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Détecter une langue étrangère dans un channel
#1
Bonjour à tous,

voici un petit script qui vous permet de détecter une langue qui n'est pas autorisée dans votre channel, dans mon script on va prendre l'exemple de la langue arabe.

Mise en situation: Si votre channel est exclusivement francophone et que vous ne voulez pas d'utilisateur qui parle arabe, le script effectuera une sanction, et vous pourrez le rediriger sur les salons adaptés, dans votre motif du kick.

Pour activer le script: .chanset #channel +badlang


tcl
if {[::tcl::info::commands ::cmdstools::uninstall] eq "::cmdstools::uninstall"} { ::cmdstools::uninstall }
if { [package vcompare [regexp -inline {^[[:digit:]\.]+} $::version] 1.6.20] == -1 } {
putloglev o * "\00304\[Commande/Secu - erreur\]\003 La version de votre Eggdrop est\00304 ${::version}\003; Commande/Secu ne fonctionnera correctement que sur les Eggdrops version 1.6.20 ou supérieure." ; return }
if { [::tcl::info::tclversion] < 8.5 } {
putloglev o * "\00304\[Commande/Secu - erreur\]\003 Commande/Secu nécessite que Tcl 8.5 (ou plus) soit installé pour fonctionner. Votre version actuelle de Tcl est\00304 ${::tcl_version}\003." ; return }
package require Tcl 8.5
 
namespace eval ::cmdstools {
 
# Procédure de désinstallation : le script se désinstalle totalement avant
# chaque rehash ou à chaque relecture au moyen de la commande "source" ou
# autre.
 
proc ::cmdstools::uninstall {args} {
putlog "Désallocation des ressources de \002cmds/secu\002..."
# Suppression des binds.
foreach binding [lsearch -inline -all -regexp [binds *[set ns [::tcl::string::range [namespace current] 2 end]]*] " \{?(::)?$ns"] {
unbind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] [lindex $binding 4]
}
 
namespace delete ::cmdstools
}
}
 
# caractere spécifique a l'arabe
variable alphabet_arabe  [list "ج" "ح" "ه" "ع" "غ" "ف" "ق" "ث" "ص" "ض" "ة" "ك" "م" "ن" "ت" "ا" "ل" "ب" "ي" "س" "ش" "ى" "*و*" "ر" "ز" "د" "ذ" "ط" "ظ" "ء" ];
variable motif "Les langues étrangères sont interdites."
 
setudef flag badlang
 
bind pubm - * ::cmdstools::detecte:langue
proc ::cmdstools::detecte:langue {nick uhost hand chan text} {
 
if {![channel get $chan badlang]} {
return
}
 
if {[::cmdstools::find:char $nick $chan $text $::alphabet_arabe]} {
putserv "PRIVMSG ChanServ :ban $chan $nick $::motif"
}
 
}
 
proc ::cmdstools::find:char {nick chan text caractere_list} {
foreach caractere ${caractere_list} {
if { [string match -nocase "*${caractere}*" ${text}] } {
return 1
}
}
return 0;
}
 
bind evnt - prerehash ::cmdstools::uninstall


Vous pouvez adapter la langue de votre choix en l'ajoutant dans une nouvelle liste. Si vous avez besoin d'aide, n'hésitez pas.
  Reply
#2
J'aurais modifié ta commande find:char

tcl
proc ::cmdstools::find:char {nick chan text caractere_list} {
   if { [string match -nocase "*[join $caractere_list "|"]*" ${text}] } {
      return 1
   }
   return 0;
}

Une regexp qui fait une série de "ou" sur les caractères, ça évite une boucle

On peut aussi utiliser "*\[[join $caractere_list {}]\]*"
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#3
C'est plus compliqué avec les langues latines : ne pouvant se fier à l'alphabet utilisé, il va falloir prévoir beaucoup de mots pour être sûr que ça se déclenche assez rapidement.
Toute l'actualité de mes scripts ici     (dernière mise à jour le 22/04/2020)

Tout programme comporte au moins un bug et pourrait être raccourci d'au moins une instruction, de quoi l'on peut déduire que tout programme peut être réduit à une seule instruction qui ne fonctionne pas.
  Reply
#4
C'est clair que déterminer si "hello" ou "hola" est acceptable sur un canal francophone, c'est chaud.

Unrealircd 6.0.7 introduit la gestion de la nouvelle version de PCRE2 dans ses spamfilters, qui permet de gérer les langues (par exemple \p{Arabic} pour les arabophobes), mais ça agit au niveau serveur, pas au niveau canal.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#5
Je viens de modifier mon alternative sur le match : J'avais oublié de mettre le caractère null ({}) pour la jointure, ce qui fait que des espaces étaient présents et donc ça matchait toute phrase ayant au moins un espace (c'est le propre d'une phrase).
Du coup, pour optimiser le script et éviter la boucle sur les caractères:

tcl
proc ::cmdstools::find:char {nick chan text caractere_list} {
   if { [string match -nocase "*\[[join $caractere_list {}]\]*" ${text}] } {
      return 1
   }
   return 0;
}

A cela, j'ajouterai qu'il pourrait être intéressant d'avoir un réglage au niveau du canal pour définir la ou les langue(s) / jeux de caractères interdits.
Ou tout simplement n'avoir que ce réglage et vérifier s'il n'est pas vide.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#6
Merci pour l'optimisation là ça fonctionne :)
  Reply
#7
salut, tous n'utilisent pas le clavier adequat, et du coupn on peux avoir le soucis quand même " barakaAllaoufik" par exemple même si l'idée peux sembler intérressante, je reste persuadé que la modération ne doit pas être automatisée ,

De plus peut-être éventuellement pour ceux qui tiennent à utiliser ce genre de code prevoir par exemple :

1er match : • "un avertissement via notice ou pv type " salut $nick, merci d'utiliser la langue française sur $chan" #( l'errreur est humaine :) )
2sd match • " kick type " $nick tu as déjà été prévenu, merci d'utiliser la langue française"
3 eme match • ban type " tu as été averti par 2 fois, tu est banni du salon "

(eventuellement prevoir un unban aprés 15 mn ou 30 )

Cordialement.
  Reply
#8
oui effectivement après cela va dépendre des cas d'utilisation, si un channel veut être plus souple concernant les langues étrangères, il peut procéder par une étape d'avertissement.
  Reply
#9
Du moment qu'il y a un akick sur *sa\ ?va*, osef qu'ils parlent en étranger :)
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#10
Des fois que cela puisse intéresser des personnes, la regex [\u04c7-\u0591\u05D0-\u05EA\u05F0-\u05F4\u0600-\u06FF] permet de détecter les caractères arabes et hébreux.
Non que j'ai un souci avec eux, mais ce sont a priori les plus répandus en écriture RTL (Right to Left, de droite à gauche), écriture qui pose souvent des soucis sur les clients IRC.

En PCRE2 (version 10.36 et plus), on peut aussi utiliser les scripts \p{Arabic} et \p{Hebrew}, mais TCL n'utilise pas PCRE2 si je me souviens bien.
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#11
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Retourner le max users dans un channel Amand 2 94 13/05/2023, 12:28
Last Post: Amand

Forum Jump:


Users browsing this thread: 1 Guest(s)