[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 Smile
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
    }
}


Répondre
#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 ?
Répondre Avertir
#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.
Répondre
#4
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é :

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 Smile
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
    }
}


Répondre Avertir
#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 :

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


Répondre Avertir
#7
Ah oui, je suis trop contaminé par les autres langages Smile Rien ne vaut un bon expr pour un calcul.
Répondre
#8
ça fonctionne parfaitement merci Smile

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


Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté