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


[Script] Gestion de temps de parole
#1
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 :)

tcl
# 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
    }
}

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#2
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 ?
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.
#3
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.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#4
Bonjour,

Donc sur irc ont à signaler un petit souci :

Quote:[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é :

Quote:[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é :


tcl
if {($nick == $::voiced) || ([lsearch -exact $::voiceq $nick] >= 0))} {


Par :


tcl
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 :

tcl
# 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
    }
}

#5
Donc après avoir tester et en oubliant de restart mon eggdrop qui me signaler aucune erreur.

J'ai ceci en erreur en pl :

Quote:[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.
#6
essaie plutôt comme ça :
tcl
set delay [expr $::duration * 60000]

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.
#7
Ah oui, je suis trop contaminé par les autres langages :) Rien ne vaut un bon expr pour un calcul.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#8
ça fonctionne parfaitement merci :)

donc correction :


tcl
# 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
    }
}



Possibly Related Threads…
Thread Author Replies Views Last Post
  Gestion.Bot v3 Beta. aliasangelius 10 7,084 20/08/2013, 21:52
Last Post: aliasangelius

Forum Jump:


Users browsing this thread: 1 Guest(s)