Mercurial > hg > skillbot
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 | 2f9832b6dede |
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; |