jbbarth's

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

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 -

Tags: (none)
Hierarchy: previous, next

Comments

There are 0 comments on this post. Post yours →

Post a comment

Required fields in bold.