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
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;