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.