Réduire ses timers mIRC

Eviter de multiplier ses timers à l’infini, ça évite de ramer et de prendre de la charge CPU pour rien ;-)

C’était à l’occasion d’un code pour tester des spambots.
Mais il suffit d’adapter ! Le principe : on construit une table qui retient les prochains timestamps UNIX où l’action devra être exécutée.
Et chaque seconde, on vérifie cette table. Si nécessaire, on exécute l’action et on met à jour pour le prochain coup.

;alias principal pour lancer le système
;utilisation: /xtest_spambots
alias xtest_spambots .timer 0 1 xtest_test_ceux_qui_doivent

;nombre de secondes entre chaque /msg au spambot suspecté
;utilisation: $xtest_lap
alias xtest_lap return 15

;nombre d'essais avant abandon
;utilisation: $xtest_num
alias xtest_num return 3

;ajout d'un spambot (on stockera deux valeurs : le nombre d'essais restants, et l'heure du prochain /msg : 
;pour que ca fonctionne, on initialise la première fois au ctime + 2secondes)
;utilisation: /add_spambot pseudo
alias add_spambot {
hadd -m spambot_times $1 $xtest_num
hadd -m spambot_next_msg $1 $calc( $ctime +2)
}

;retrait d'un spambot du système
;utilisation: /del_spambot pseudo
alias del_spambot {
hdel -m spambot_times $1
hdel -m spambot_next_msg $1
}

;alias de /msg : tu changeras comme tu veux
;utilisation: /xtest_msg pseudo
alias xtest_msg msg $1 BLAH !
;alias pour tester les spambots qui le doivent
alias xtest_test_ceux_qui_doivent {
;on parcourt toute la hashtable
var %i 1
while ($hget(spambot_next_msg,%i).item) {
  var %nick $ifmatch
  ;on regarde si le CTIME stocké est infèrieur au $ctime actuel : si oui, on doit /msg
  if ($hget(spambot_next_msg,%nick) < = $ctime) {
    ;on /msg (on est là  pour ca)
    xtest_msg %nick
    ;on décrémente le nombre de fois à  tester encore
    hdec -m spambot_times %nick
    ;si ca arrive à  0, on efface le spambot de la table (je mets "<=" par sécurité, pour pas que ca /msg infiniment si ca rate une fois...)
    if ($hget(spambot_times,%nick) <= 0) {
      del_spambot %nick
    }
    ;sinon, on règle le prochain CTIME de test
    else {
      hadd -m spambot_next_msg %nick $calc($ctime + $xtest_lap)
    }
  }
  inc %i
}
}

- the end -