Messages : 2,381
Sujets : 208
Inscription : Apr 2004
Bonsoir,
On m'a demandé s'il était possible de faire un script qui donne la parole (un voice) à des utilisateurs en suivant une file d'attente (l'ordre dans lequel les utilisateurs demandent à parler) avec un temps de parole limité pour chaque fois.
J'ai donc produit ceci, je ne l'ai pas testé mais il ne doit pas y avoir trop d'erreurs.
A tester et commenter
tclcopier
# Durée du voice en minutes
set duration 5
# Canal visé
set vchan "#voice"
# Commande à utiliser en privé
bind msg - "!voiceme" voice:adqueue
set voiceq { }
set voiced ""
set voicec 0
# Procédure principale : ajout dans la file d'attente
proc voice:adqueue { nick uhost handle args} {
if { ( $nick == $ ::voiced ) || ( [ lsearch -exact $ ::voiceq $nick ] > = 0 ) ) } {
putserv "PRIVMSG $nick :Tu es déjà dans la file"
return 0
}
lappend ::voiceq $nick
voice:checknext
}
# Procédure très importante : choix du nouveau voicé
proc voice:checknext { } {
if { $ ::voiced == "" && [ llength $ ::voiceq ] > 0 } {
set ::voiced [ lindex $ ::voiceq 0 ]
set delay ( $ ::duration * 60000 )
set ::voicec [ after $delay voice:del]
set ::voiceq [ lrange $ ::voiceq 1 end]
pushmode $ ::vchan +v $ ::voiced
}
}
# Arrêt du voice
proc voice:del { } {
pushmode $ ::vchan -v $ ::voiced
set ::voiced ""
voice:checknext
}
# Gestion de la déconnexion
bind part - $ ::vchan voice:part
bind sign - $ ::vchan voice:part
proc voice:part { nick uhost handle chan msg} {
if { $ ::voiced == $nick } {
after cancel $ ::voicec
set ::voiced ""
voice::checknext
}
}
Messages : 938
Sujets : 93
Inscription : Jul 2007
Je ne l'ai pas testé mais voici quelques idées :
un namespace serait le bienvenu pour prévenir les conflits de variables globales
un moyen de signaler qu'on a fini de parler sans avoir à quitter le chan
vérifier la présence de celui qui fait !voiceme sur le chan au moment où il tape la commande
que se passe-t-il si la personne suivante dans la liste n'est plus sur le chan au moment où c'est à elle de parler ?
que se passe-t-il si une personne figurant dans la liste d'attente change de nick ?
Messages : 2,381
Sujets : 208
Inscription : Apr 2004
Je suis bien d'accord avec toutes tes remarques, ce que j'ai fait n'est que le principe du script et peut être largement amélioré.
Je vais essayer de faire quelque chose de plus propre dans la journée, ce qui m'intéressait ici était surtout de montrer l'utilisation des "after" pour gérer proprement le temps plutôt qu'avec des timers.
Messages : 710
Sujets : 65
Inscription : Apr 2010
06/06/2011, 19:32
(Modification du message : 06/06/2011, 19:58 par aliasangelius .)
Bonjour,
Donc sur irc ont à signaler un petit souci :
Citation : [19:06:55] ( TwyZ ) wrong # args: should be "set varName ?newValue?"
Donc j'ai mis le tcl dans mon eggdrop de test.
J’ai changé args par arg plus d'erreur.
Ensuite autre erreur détecté :
Citation : [19:16:03] <Notifica> [19:16:36] Tcl error [voice:adqueue]: unbalanced close paren
[19:16:03] <Notifica> in expression "...$::voiceq $nick] >= 0))"
En faite ici juste un oubli ou alors une faute de frappe trop vite j'ai remplacé :
tclcopier
if { ( $nick == $ ::voiced ) || ( [ lsearch -exact $ ::voiceq $nick ] > = 0 ) ) } {
Par :
tclcopier
if { ( $nick == $ ::voiced ) || ( [ lsearch -exact $ ::voiceq $nick ] > = 0 ) } {
Une fermeture de parenthèse en trop
Et la aucune erreur n'es signaler dans la pl.
Voici le code :
tclcopier
# Durée du voice en minutes
set duration 5
# Canal visé
set vchan "#voice"
# Commande à utiliser en privé
bind msg - "!voiceme" voice:adqueue
set voiceq { }
set voiced ""
set voicec 0
# Procédure principale : ajout dans la file d'attente
proc voice:adqueue { nick uhost handle arg} {
if { ( $nick == $ ::voiced ) || ( [ lsearch -exact $ ::voiceq $nick ] > = 0 ) } {
putserv "PRIVMSG $nick :Tu es déjà dans la file"
return 0
}
lappend ::voiceq $nick
voice:checknext
}
# Procédure très importante : choix du nouveau voicé
proc voice:checknext { } {
if { $ ::voiced == "" && [ llength $ ::voiceq ] > 0 } {
set ::voiced [ lindex $ ::voiceq 0 ]
set delay ( $ ::duration * 60000 )
set ::voicec [ after $delay voice:del]
set ::voiceq [ lrange $ ::voiceq 1 end]
pushmode $ ::vchan +v $ ::voiced
}
}
# Arrêt du voice
proc voice:del { } {
pushmode $ ::vchan -v $ ::voiced
set ::voiced ""
voice:checknext
}
# Gestion de la déconnexion
bind part - $ ::vchan voice:part
bind sign - $ ::vchan voice:part
proc voice:part { nick uhost handle chan msg} {
if { $ ::voiced == $nick } {
after cancel $ ::voicec
set ::voiced ""
voice::checknext
}
}
Messages : 710
Sujets : 65
Inscription : Apr 2010
Donc après avoir tester et en oubliant de restart mon eggdrop qui me signaler aucune erreur.
J'ai ceci en erreur en pl :
Citation : [19:56:21] ( alias_angelius ) .set errorInfo
[19:56:21] <Notifica> [19:56:54] #alias_angelius# set errorInfo
[19:56:22] <Notifica> Currently: wrong # args: should be "set varName ?newValue?"
[19:56:22] <Notifica> Currently: while executing
[19:56:22] <Notifica> Currently: "set delay ($::duration * 60000)"
[19:56:22] <Notifica> Currently: (procedure "voice:checknext" line 4)
[19:56:22] <Notifica> Currently: invoked from within
[19:56:22] <Notifica> Currently: "voice:checknext"
[19:56:22] <Notifica> Currently: (procedure "voice:adqueue" line 7)
[19:56:22] <Notifica> Currently: invoked from within
[19:56:22] <Notifica> Currently: "voice:adqueue $_msg1 $_msg2 $_msg3 $_msg4"
Erreur detecté par la personne qui me la transmise sur irc mais je ne vois pas trop d'ou cela peut venir donc je suis désolé de pas faire plus.
Messages : 938
Sujets : 93
Inscription : Jul 2007
essaie plutôt comme ça :
tclcopier
set delay [ expr $ ::duration * 60000 ]
Messages : 2,381
Sujets : 208
Inscription : Apr 2004
Ah oui, je suis trop contaminé par les autres langages
Rien ne vaut un bon expr pour un calcul.
Messages : 710
Sujets : 65
Inscription : Apr 2010
ça fonctionne parfaitement merci
donc correction :
tclcopier
# Durée du voice en minutes
set duration 5
# Canal visé
set vchan "#voice"
# Commande à utiliser en privé
bind msg - "!voiceme" voice:adqueue
set voiceq { }
set voiced ""
set voicec 0
# Procédure principale : ajout dans la file d'attente
proc voice:adqueue { nick uhost handle args} {
if { ( $nick == $ ::voiced ) || ( [ lsearch -exact $ ::voiceq $nick ] > = 0 ) } {
putserv "PRIVMSG $nick :Tu es déjà dans la file"
return 0
}
lappend ::voiceq $nick
voice:checknext
}
# Procédure très importante : choix du nouveau voicé
proc voice:checknext { } {
if { $ ::voiced == "" && [ llength $ ::voiceq ] > 0 } {
set ::voiced [ lindex $ ::voiceq 0 ]
set delay [ expr $ ::duration * 60000 ]
set ::voicec [ after $delay voice:del]
set ::voiceq [ lrange $ ::voiceq 1 end]
pushmode $ ::vchan +v $ ::voiced
}
}
# Arrêt du voice
proc voice:del { } {
pushmode $ ::vchan -v $ ::voiced
set ::voiced ""
voice:checknext
}
# Gestion de la déconnexion
bind part - $ ::vchan voice:part
bind sign - $ ::vchan voice:part
proc voice:part { nick uhost handle chan msg} {
if { $ ::voiced == $nick } {
after cancel $ ::voicec
set ::voiced ""
voice::checknext
}
}