Mercurial > hg > skillbot
diff timers.pl @ 0:d6521d5ea884
Import of Andy Smith's twitfolk bot
author | Dominic Cleal <dominic@computerkb.co.uk> |
---|---|
date | Sat, 06 Dec 2008 13:49:48 +0000 |
parents | |
children | 2f9832b6dede |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/timers.pl Sat Dec 06 13:49:48 2008 +0000 @@ -0,0 +1,106 @@ +#!/usr/bin/perl + +=pod + +Braindead timers thing. + +Copyright ©2000 Andy Smith <andy+timers.pl@strugglers.net> + +Artistic license as perl. + +$Id: timers.pl 776 2008-11-03 18:20:04Z andy $ + +=cut + +use warnings; +use strict; + +my @timers_once; +my @timers_repeat; + +sub add_one_shot_timer { + my ($offset, $coderef) = @_; + + my $one_shot = {}; + + $one_shot->{stamp} = time(); + $one_shot->{offset} = $offset; + $one_shot->{coderef} = $coderef; + + return push(@timers_once, $one_shot) - 1; +} + +sub del_one_shot_timer { + my ($timer_id) = shift; + + splice(@timers_once, $timer_id, 1); +} + + +sub add_repeat_timer { + my ($every, $coderef) = @_; + + my $repeat = {}; + + $repeat->{last} = time(); + $repeat->{every} = $every; + $repeat->{coderef} = $coderef; + + return push(@timers_repeat, $repeat) - 1; +} + +sub del_repeat_timer { + my ($timer_id) = shift; + + splice(@timers_repeat, $timer_id, 1); +} + +sub get_one_shot_timer { + my ($id) = shift; + return $timers_once[$id]; +} + +sub get_repeat_timer { + my ($id) = shift; + + return $timers_repeat[$id]; +} + +sub do_timers_once { + my ($self) = shift; + my ($timer_id, $timer); + + return unless @timers_once; + + my $now = time(); + + for ($timer_id = 0; $timer_id <= $#timers_once; $timer_id++) { + $timer = $timers_once[$timer_id]; + + if ($now >= $timer->{stamp} + $timer->{offset}) { + &{ $timer->{coderef} }($timer_id, $self); + del_one_shot_timer($timer_id); + } + } +} + +sub do_timers_repeat { + my ($self) = shift; + + my ($timer_id, $timer); + + return unless @timers_repeat; + + my $now = time(); + + for ($timer_id = 0; $timer_id <= $#timers_repeat; $timer_id++) { + $timer = $timers_repeat[$timer_id]; + + if ($now >= $timer->{last} + $timer->{every}) { + &{ $timer->{coderef} }($timer_id, $self); + $timer->{last} = $now; + } + } +} + +1;