Algorithm-FloodControl
view release on metacpan or search on metacpan
inc/Module/Install/AutoInstall.pm view on Meta::CPAN
Module::AutoInstall->import(
(@config ? (-config => \@config) : ()),
(@core ? (-core => \@core) : ()),
$self->features,
);
$self->makemaker_args( Module::AutoInstall::_make_args() );
my $class = ref($self);
$self->postamble(
"# --- $class section:\n" .
Module::AutoInstall::postamble()
);
}
sub auto_install_now {
my $self = shift;
$self->auto_install(@_);
Module::AutoInstall::do_install();
}
inc/Module/Install/Metadata.pm view on Meta::CPAN
$self->provides( %{ $build->find_dist_packages || {} } );
}
sub feature {
my $self = shift;
my $name = shift;
my $features = ( $self->{values}{features} ||= [] );
my $mods;
if ( @_ == 1 and ref( $_[0] ) ) {
# The user used ->feature like ->features by passing in the second
# argument as a reference. Accomodate for that.
$mods = $_[0];
} else {
$mods = \@_;
}
my $count = 0;
push @$features, (
$name => [
map {
lib/Algorithm/FloodControl.pm view on Meta::CPAN
$FLOOD{$en} ||= []; # make empty flood array for this event name
my $ar = $FLOOD{$en}; # get array ref for event's flood array
my $ec = @{$ar}; # events count in the flood array
if ( $ec >= $fc ) {
# flood array has enough events to do real flood check
my $ot = $ar->[0]; # oldest event timestamp in the flood array
my $tp = time() - $ot; # time period between current and oldest event
# now calculate time in seconds until next allowed event
my $wait = int( ( $ot + ( $ec * $fp / $fc ) ) - time() );
if ( $wait > 0 ) {
# positive number of seconds means flood in progress
# event should be rejected or postponed
# print "WARNING: next event will be allowed in $wait seconds\n";
return $wait;
}
# negative or 0 seconds means that event should be accepted
# oldest event is removed from the flood array
shift @{$ar};
}
# flood array is not full or oldest event is already removed
# so current event has to be added
push @{$ar}, time();
# event is ok
return 0;
lib/Algorithm/FloodControl.pm view on Meta::CPAN
=head1 SYNOPSIS
=head2 Functional interface
use Algorithm::FloodControl;
my $wait = flood_check( 5, 60, 'FLOOD EVENT NAME' );
if( $wait ) {
print "Please wait $wait sec. before requesting this resource again.";
} else {
print "Ok, here you are.";
}
=head2 Object-oriented interface
use Algorithm::FloodControl ();
my $flood_control = Algorithm::FloodControl->new(
storage => $memd,
lib/Algorithm/FloodControl.pm view on Meta::CPAN
=head1 FUNCTIONS
This module exports several functions:
=over 4
=item flood_check( $count, $time, $event_name )
This function is the core of the module. It receives 3 arguments: maximum event
count, maximum time period (in seconds) for this event count and finally the event
name. There is internal storage so flood_check() can track several events by name.
Third argument could be omitted. In this case the event name will be constructed
from the package name, file name and line number from the calling point. However
this is not recommendet unless you need it for very simple program.
The return value is time in seconds that this event must wait to be processed
or 0 if event can be processed immediately.
=item flood_storage( <$ref> )
If you want to save and restore the internal storage (for example for cgi use),
you can get reference to it with flood_storage() function which returns this
reference and it can be stored with other module like FreezeThaw or Storable.
When restoring you must pass the storage reference as single argument to
flood_storage().
lib/Algorithm/FloodControl.pm view on Meta::CPAN
=item forget_attempts( $limit_type, $identifier )
Sets attempt counter to zero
=item get_attempt_count( $limit_type, $identifier )
Returns count of attempts
=item is_user_overrated( $limit_type, $identifier )
If user have reached his limits returns time to unlocking in seconds. Otherwise returns 0
=back
=head1 EXAMPLE
CGI script is very usefull as example because it has all elements of
Algorithm::FloodControl use:
#!/usr/bin/perl
lib/Algorithm/FloodControl.pm view on Meta::CPAN
lock( $flood_file ); # lock the storage
my $FLOOD = retrieve( $flood_file ) if -r $flood_file; # read storage data
flood_storage( $FLOOD ) if $FLOOD; # load storage
my $wait = flood_check( 5, 60, 'FLOOD TEST CGI' ); # check for flood
store( flood_storage(), $flood_file ); # save storage data
unlock( $flood_file ); # unlock the file
print "Content-type: text/plain\n\n";
if( $wait ) {
print "Please wait $wait seconds before requesting this page again.\n";
exit;
}
print "Hello, this is main script here\n";
This example is just one of very large number of cases where flood control can
be useful. I used it in IRC bots, email notifications, web site updates, etc.
=head1 AUTHOR
Vladi Belperchinov-Shabanski "Cade" - up to 1.00
( run in 0.720 second using v1.01-cache-2.11-cpan-39bf76dae61 )