#!/usr/bin/perl -w # # chanlimit # # Sets the channelmode +l to limit the ammount of people that are allowed # to join to a reasonable (configurable!) value. It then checks every # $configurable_interval seconds if it needs to change the limit. # # Settings: # # limit_debug bool set to ON to see what the script decides. # # limit_channels str set to a comma separated list of channelnames # including the # or ! chars, but NO SPACES # # limit_time int set to the interval the script should check # the channellimits. Value is in seconds. # Changing this value isn't immediate. When the # next check is done, this value is updated. # # limit_offset int This number of people are allowed to join on # top of the already joined people. # # limit_grace int This number of people need to join or part # to have the limit updated. Setting this to '1' # will cause the limit to be updated after every # join or part. # use Irssi; use Irssi::Irc; $VERSION = "1.0"; %IRSSI = ( authors => 'Sander Smeenk', contact => 'scripts@freshdot.net', name => 'chanlimit', description => 'Automatically sets user limits on channels to prevent joinfloods.', license => 'GNU GPLv2 or later', url => 'http://www.freshdot.net/irssi.shtml', ); # This must be here first, or irssi will not recognise limit_time below Irssi::settings_add_bool("chanlimit", "limit_debug", '0'); Irssi::settings_add_str("chanlimit", "limit_channels", '%s'); Irssi::settings_add_int("chanlimit", "limit_time", '90'); Irssi::settings_add_int("chanlimit", "limit_offset", '15'); Irssi::settings_add_int("chanlimit", "limit_grace", '10'); # First time installation of the timeout handler. my $time = Irssi::settings_get_int("limit_time") || 90; my $timeout_tag = Irssi::timeout_add($time * 1000, 'chanlimit', ''); sub chanlimit { my $offset = Irssi::settings_get_int("limit_offset"); my $grace = Irssi::settings_get_int("limit_grace"); my $debug = Irssi::settings_get_bool("limit_debug"); # Reset the timeout to user configured values. $time = Irssi::settings_get_int("limit_time") || 90; Irssi::timeout_remove($timeout_tag); $timeout_tag = Irssi::timeout_add($time * 1000, 'chanlimit', ''); foreach my $channel (split /,/, Irssi::settings_get_str("limit_channels")) { my $c = Irssi::channel_find($channel); return unless ref $c; return unless $c->{chanop}; my $numusers = scalar @{[$c->nicks]}; Irssi::print("[limit] users: $numusers offset: $offset grace: $grace") if $debug; my $newlimit = $numusers + $offset; my $curlimit = ($c->{limit} || 0); Irssi::print("[limit] curlimit: $curlimit newlimit: $newlimit timeout: $time sec") if $debug; return if $newlimit == $curlimit; my $diff = 0; if ($newlimit > $curlimit) { $diff = $newlimit - $curlimit; } elsif ($curlimit > $newlimit) { $diff = $curlimit - $newlimit; } if (($diff >= $grace) || ($curlimit == 0)) { Irssi::print("[limit] diff: $diff -> update limit on $channel to ".($numusers+$offset)) if $debug; $c->{server}->send_raw("MODE $channel +l " . ($numusers+$offset)); } else { Irssi::print("[limit] diff: $diff -> not updating limit (diff:$diff < grace:$grace)") if $debug; } } }