view 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 source

#!/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;