comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:d6521d5ea884
1 #!/usr/bin/perl
2
3 =pod
4
5 Braindead timers thing.
6
7 Copyright ©2000 Andy Smith <andy+timers.pl@strugglers.net>
8
9 Artistic license as perl.
10
11 $Id: timers.pl 776 2008-11-03 18:20:04Z andy $
12
13 =cut
14
15 use warnings;
16 use strict;
17
18 my @timers_once;
19 my @timers_repeat;
20
21 sub add_one_shot_timer {
22 my ($offset, $coderef) = @_;
23
24 my $one_shot = {};
25
26 $one_shot->{stamp} = time();
27 $one_shot->{offset} = $offset;
28 $one_shot->{coderef} = $coderef;
29
30 return push(@timers_once, $one_shot) - 1;
31 }
32
33 sub del_one_shot_timer {
34 my ($timer_id) = shift;
35
36 splice(@timers_once, $timer_id, 1);
37 }
38
39
40 sub add_repeat_timer {
41 my ($every, $coderef) = @_;
42
43 my $repeat = {};
44
45 $repeat->{last} = time();
46 $repeat->{every} = $every;
47 $repeat->{coderef} = $coderef;
48
49 return push(@timers_repeat, $repeat) - 1;
50 }
51
52 sub del_repeat_timer {
53 my ($timer_id) = shift;
54
55 splice(@timers_repeat, $timer_id, 1);
56 }
57
58 sub get_one_shot_timer {
59 my ($id) = shift;
60 return $timers_once[$id];
61 }
62
63 sub get_repeat_timer {
64 my ($id) = shift;
65
66 return $timers_repeat[$id];
67 }
68
69 sub do_timers_once {
70 my ($self) = shift;
71 my ($timer_id, $timer);
72
73 return unless @timers_once;
74
75 my $now = time();
76
77 for ($timer_id = 0; $timer_id <= $#timers_once; $timer_id++) {
78 $timer = $timers_once[$timer_id];
79
80 if ($now >= $timer->{stamp} + $timer->{offset}) {
81 &{ $timer->{coderef} }($timer_id, $self);
82 del_one_shot_timer($timer_id);
83 }
84 }
85 }
86
87 sub do_timers_repeat {
88 my ($self) = shift;
89
90 my ($timer_id, $timer);
91
92 return unless @timers_repeat;
93
94 my $now = time();
95
96 for ($timer_id = 0; $timer_id <= $#timers_repeat; $timer_id++) {
97 $timer = $timers_repeat[$timer_id];
98
99 if ($now >= $timer->{last} + $timer->{every}) {
100 &{ $timer->{coderef} }($timer_id, $self);
101 $timer->{last} = $now;
102 }
103 }
104 }
105
106 1;