Timers Utimers

From Base de connaissances eggdrops & TCL
Jump to: navigation, search

Les fonctions Timer et Utimer permettent de faire une action dans les prochaines minutes/secondes que vous aurez définit.

Déclenchement de timer

Syntaxes

  • timer <minutes> <proc_a_lancer> <nombre>
  • utimer <secondes> <proc_a_lancer> <nombre>

Utilisation

proc exemple_timer {
   puthelp "PRIVMSG #salon :Voici le message qui sera envoyé toutes les X minutes"
   [[Timer|timer]]3 exemple_timer 0
}

proc exemple_utimer
   puthelp "PRIVMSG #salon :Voici le message qui sera envoyé toutes les X secondes"
   [[Timer|timer]]180 exemple_utimer 0
}

Le premier exemple renvoie "ok !!" immédiatement, tandis que le second renvoie "ok !!" 3 secondes plus tard :

  • [[Utimer|utimer]] 3 [putlog "ok !!"] 0
    
  • [[Utimer|utimer]] 3 [list putlog "ok !!"] 0
    

Gestion des timers

Un des problèmes des timers, c'est que l'on a parfois besoin de les supprimer. Pour cela, il faut connaitre son nom ou son id, il y a plusieurs méthodes pour cela.

Listage des timers

Il est possible de lister les Timers en cours avec utimers et timers.

Ces deux fonctions retournent une liste des Timers sous la forme:

{time_left procedure timer_id}

avec:

  • time_left : le temps restant pour le timer
  • procedure : la procédure appelée par le timer
  • timer_id : L'id unique du timer

Le temps restant sera soit en minutes soit en secondes, selon que vous utilisiez timers ou utimers

Tuer un timer

Il existe killtimer et killutimer pour tuer un (u)timer. Elles prennent comme argument l'ID unique du timer concerné. La difficulté est donc de retrouver cet ID.

Solution basique

On peut faire une boucle sur la liste des timers et chercher celui (ou ceux) qui déclenchent la procédure cible (que l'on connait).

proc killMyTimer { ttype myproc } {
   # ttype : type de timer (utimer ou timer)
   # myproc : nom de la procédure appelée
   if { $ttype == "utimer" } {
      foreach ctimer [utimers] {
         if { [lindex $ctimer 1] == $myproc } {
            killutimer [lindex $ctimer 2]
         }
      }
   } else {
      foreach ctimer [timers] {
         if { [lindex $ctimer 1] == $myproc } {
            killtimer [lindex $ctimer 2]
         }
      }
   }
}

Cette procédure tuera tous les (u)timers qui appellent myproc

Solution élaborée

Cette solution est plus élaborée car elle agit aussi sur l'appel des timers. En effet, en utilisant list pour lancer un timer, vous pouvez récupérer son ID. Ce qui donne donc:

proc exemple_utimer
   global mytimer
   puthelp "PRIVMSG #salon :Voici le message qui sera envoyé toutes les X secondes"
   set mytimer [list [timer 180 exemple_utimer]]
}

bind dcc - "tuetimer" tueTimer
proc tueTimer {} {
   global mytimer
   killtimer $mytimer
}

Voir aussi

After pour descendre sous la seconde.