Communauté Eggdrop
[Demande] Soucis avec expr - Version imprimable

+- Communauté Eggdrop (https://forum.eggdrop.fr)
+-- Forum : Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum : Scripts TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=4)
+--- Sujet : [Demande] Soucis avec expr (/showthread.php?tid=1646)



Soucis avec expr - aliasangelius - 13/01/2017

Bonjour,

Je viens demander une explication concernant expr.
Dans un code j'aimerais inclure cette fonctionnalité, pour un calcul sur millisecondes.

Donc lorsque je rehash l'eggdrop y'a aucun soucis sa fonctionne bien.
Mais lorsque je tape par exemple !tcl pushmode je n'es aucun retour.

le rehash :
Citation :.[13:49:31] <alias_angelius> .rehash
.[13:49:31] <Talk-Me> [13:50:30] #alias_angelius# rehash
.[13:49:31] <Talk-Me> Rehashing.
.[13:49:31] <Talk-Me> [13:50:30] Rehashing ...
.[13:49:31] <Talk-Me> [13:50:30] Listening at telnet port 3334 (all).
.[13:49:31] <Talk-Me> [13:50:30] TCL public chargé.
.[13:49:31] <Talk-Me> [13:50:30] Userfile loaded, unpacking...

La commande sur le salon :
Citation :.[13:50:12] <@alias_angelius> !tcl pushmode

Aucune erreur en PL à ce moment là.

Je pense que mon soucis provient de expr, je l'ai mal interpréter dans le code.
Je veux pas une solution toute offerte.. Car sa n'aurais aucun sens, juste quelques explication me forçant à réfléchir.

Voici le code :
tcl
#############################
#                           #
# Tcl Eval commande public. #
#                           #
#############################
 
namespace eval ::tcleval {
   
   # Nous vérifions si ya le package requis pour le msgcat. Vous pouvez vérifier en PL avec la commande : .tcl info patchlevel
   package require msgcat
   # Nous mettons la langue de msgcat en français.
   ::msgcat::mclocale fr
   # Commandes chars Exemple "." ou "!" Ce qui donnera par exemple : .tcl/!tcl
   set cmds(char) "!"
    # Les messages msgcat.
    ::msgcat::mcset fr tc1 "\002TCL ->\002"
    ::msgcat::mcset fr tc2 "\002Done.\002"
    
    # Le code TCL.
    set ::tcleva_timeout 5
    
    bind pub - "$::tcleval::cmds(char)tcle" [namespace current]::tcle
    proc tcle {nick host hand chan arg} {
    catch [list uplevel 0 $arg] error
    foreach line [split $error "\n"] {
       if {$line!=""} {
           putserv "PRIVMSG $chan :[::msgcat::mc tc1] $line"
       }
       variable version 1.0
    }
    putserv "PRIVMSG $chan :[::msgcat::mc tc2] [expr $::tcleva_timeout * 1000]"
    }
}
putlog "\0034TCL public chargé.\0034"





RE: Soucis avec expr - CrazyCat - 13/01/2017

C'est peut-être parce que ton bind est sur !tcle et non pas sur !tcl ?


RE: Soucis avec expr - aliasangelius - 13/01/2017

En effet..

Par contre sa me calcul comme ceci

Citation :.[14:09:58] <@alias_angelius[Afk]> !tcl pushmode
.[14:10:01] <@Talk-Me> TCL -> wrong # args: should be "pushmode channel mode ?arg?"
.[14:10:01] <@Talk-Me> Done. 5000 Millisecondes

C'est le temps de réponse entre la commande et sa réponse ?
Que je sois sûre


RE: Soucis avec expr - CrazyCat - 13/01/2017

Les 5000 millisecondes ? C'est le résultat de $::tcleva_timeout * 1000.
J'imagine donc que $::tcleva_timeout est réglé à 5.

expr ne fait qu'évaluer une expression (souvent mathématique).


RE: Soucis avec expr - aliasangelius - 13/01/2017

Oui j'ai modifié avec ton code Crazy

tcl
#############################
#                           #
# Tcl Eval commande public. #
#                           #
#############################
namespace eval ::tcleval {
 
    # Nous vérifions si ya le package requis pour le msgcat. Vous pouvez vérifier en PL avec la commande : .tcl info patchlevel
    package require msgcat
    # Nous mettons la langue de msgcat en français.
    ::msgcat::mclocale fr
    # Commandes chars Exemple "." ou "!" Ce qui donnera par exemple : .tcl/!tcl
    set cmds(char) "!"
     # Les messages msgcat.
     ::msgcat::mcset fr tc1 "\002TCL ->\002"
     ::msgcat::mcset fr tc2 "\002Done.\002"
     
     # Le code TCL.
     proc sleep {time} {
        after $time set end 1
        vwait end
     }
     bind pub - "$::tcleval::cmds(char)tcl" [namespace current]::tcl
     proc tcl {nick host hand chan arg} {
        variable sleep
        catch [list uplevel 0 $arg] error
        foreach line [split $error "\n"] {
            if {$line!=""} {
                putserv "PRIVMSG $chan :[::msgcat::mc tc1] $line"
            }
        variable version 1.0
        }
     putserv "PRIVMSG $chan :[::msgcat::mc tc2] [expr [lindex [$::sleep] 0] millisecondes.]"
     }
}
putlog "\0034TCL public chargé.\0034"



En PL :

Citation :.[15:15:13] <Talk-Me> [15:18:34] Tcl error [::tcleval::tcl]: can't read "::sleep": no such variable



RE: Soucis avec expr - CrazyCat - 13/01/2017

Bien bien bien...

Donc, tu crées une procédure sleep dans le namespace ::tcleval et ensuite tu appelles la variable sleep (d'où sort-elle ?)

Tu ne penses pas que si à la place de:
tcl
variable sleep


tu mettais:
tcl
::tcleval::sleep 500





RE: Soucis avec expr - aliasangelius - 13/01/2017

J'ai modifié ainsi.. en relisant tout correctement..

tcl
set arg [join $arg]
            for {set x 0; set t [clock microseconds]} {$x<$repeat} {incr x} {
                catch [list uplevel 0 $arg] rep
            }
            set t2 [clock microseconds]
            set time [expr ($t2-$t)]
            set interact [expr $time/($repeat/1.0)]
            set time [format %.3f [expr round($time)/1000.0]]
            foreach r [split $rep \n] {



En faisant ainsi j'ai comme réponse :

Citation :.[17:02:49] <+alias_angelius[Afk]> !tcl pushmode
.[17:02:51] <@Talk-Me> TCL -> wrong # args: should be "pushmode channel mode ?arg?"
.[17:02:52] <@Talk-Me> Done. 0.044 Millisecondes (44.0 µs/i)
.[17:03:04] <+alias_angelius[Afk]> !tcl info patchlevel
.[17:03:06] <@Talk-Me> TCL -> 8.5.3
.[17:03:07] <@Talk-Me> Done. 0.024 Millisecondes (24.0 µs/i)

Merci de ta patience Crazy Smile