Accueil





Choisir des nicks sur un chan, aléatoirement ou selon un index



Permet de substituer les occurrences de %randnick% et %randnick<index>% dans une chaîne de caractères, par des nicks d'utilisateurs choisis aléatoirement sur un chan.

Chaque %randnick% sera remplacé par un nick différent.
Chaque %randnick<index>% sera remplacé par un nick différent selon l'index, c'est à dire que si l'index est le même, le nick choisi sera le même.
Vous pouvez utiliser n'importe quel entier positif comme index.

S'il y a plus de %randnick% et de %randnick<index>% à remplacer qu'il n'y a d'utilisateurs sur le chan, on remplace ceux en trop par "quelqu'un".

Vous aurez besoin de la procédure randomize_list, qui permet de mélanger aléatoirement les éléments d'une liste.


Variable à déclarer
# Nicks ou handles qui ne seront jamais choisis lors de la sélection aléatoire. # Séparez-les par un espace. variable exempted_users {}


Procédure
############################################################################### ### Susbstitution des %randnick% et %randnick<index>%. ### On s'assure qu'un même nick ne sera pas utilisé plus d'une fois. ### Si on a plus de %randnick% à remplacer qu'il n'y a d'users sur le chan, on ### remplace ceux en trop par "quelqu'un". ############################################################################### proc substitute_randnicks {chan text} { variable exempted_users set num_randnick [regexp -all {%randnick%} $text] set num_randnick2 [llength [set randnick_list [lsort -unique [regexp -inline -all {%randnick\d+%} $text]]]] if { ($num_randnick != 0) || ($num_randnick2 != 0) } then { # On récupère la liste des users présents sur le chan, sauf le nick de l'Eggdrop set user_list [lsearch -all -exact -inline -not [chanlist $chan] $::nick] # Exclusion des handles/nicks spécifiés dans $exempted_users foreach user $exempted_users { if { [set handle2nick [hand2nick $user $chan]] ne "" } { set user $handle2nick } set user_list [lsearch -all -exact -inline -not $user_list $user] } set user_list [randomize_list $user_list] # Construction de la liste de remplacement pour les %randnick<index>% foreach randnick $randnick_list { set index [regexp -inline {\d+} $randnick] if { ([::tcl::info::exists randnicks]) && ([::tcl::dict::exists $randnicks $index]) } then { lappend replacement_list [::tcl::dict::get $randnicks $index] } else { if { [set num_remaining_users [llength $user_list]] != 0 } { set chosen_nick [lindex $user_list [set calculated_index [expr $index % $num_remaining_users]]] set user_list [lreplace $user_list $calculated_index $calculated_index] } else { set chosen_nick "quelqu'un" } ::tcl::dict::set randnicks $index $chosen_nick lappend replacement_list $chosen_nick } } # Remplacement des %randnick<index>% for { set counter 1 } { $counter <= $num_randnick2 } { incr counter 1 } { regsub -all [lindex $randnick_list $counter-1] $text [lindex $replacement_list $counter-1] text } # Construction de la liste de remplacement pour les %randnick% set replacement_list {} for { set counter 1 } { $counter <= $num_randnick } { incr counter 1 } { if { [set num_remaining_users [llength $user_list]] != 0 } { set index [rand $num_remaining_users] lappend replacement_list [lindex $user_list $index] set user_list [lreplace $user_list $index $index] } else { lappend replacement_list "quelqu'un" } } # Remplacement des %randnick% for { set counter 1 } { $counter <= $num_randnick } { incr counter 1 } { regsub {%randnick%} $text [lindex $replacement_list $counter-1] text } } return $text }


Exemples
substitute_randnicks #testchan "%randnick1% dit bonjour à %randnick2% et %randnick2% lui répond \"bonjour %randnick1%\". Pendant ce temps, %randnick%, %randnick% et %randnick% tiennent la chandelle." Tcl: Pierrot dit bonjour à Julie et Julie lui répond "bonjour Pierrot". Pendant ce temps, Toto, Gudule et MenzAgitat tiennent la chandelle.
substitute_randnicks #testchan "%randnick1% dit bonjour à %randnick2% et %randnick2% lui répond \"bonjour %randnick1%\". Pendant ce temps, %randnick%, %randnick% et %randnick% tiennent la chandelle." Tcl: Gudule dit bonjour à Pierrot et Pierrot lui répond "bonjour Gudule". Pendant ce temps, MenzAgitat, Toto et Julie tiennent la chandelle.


©2005-2016 Menz Agitat