From 917638dfdf31e26ae9115dabb5c2fe528866c549 Mon Sep 17 00:00:00 2001 From: William Heimbigner Date: Mon, 8 Oct 2007 13:28:23 +0000 Subject: added a db command, improved the user set flags command, added linked channels, added a showhilights command, eliminated flooding of alerts, fixed nickspam check, added something to watch chancounts. --- modules/classes.pl | 8 +++++--- modules/event.pl | 37 ++++++++++++++++++++----------------- modules/inspect.pl | 6 +++--- modules/log.pl | 3 +++ modules/util.pl | 33 +++++++++++++++++++++++++++------ modules/xml.pl | 3 ++- 6 files changed, 60 insertions(+), 30 deletions(-) (limited to 'modules') diff --git a/modules/classes.pl b/modules/classes.pl index 4233d88..36a8031 100644 --- a/modules/classes.pl +++ b/modules/classes.pl @@ -3,6 +3,7 @@ package ASM::Classes; use strict; use warnings; use Text::LevenshteinXS qw(distance); +use Data::Dumper; my %sf = (); @@ -93,9 +94,10 @@ sub nickspam { my ($chk, $id, $event, $chan) = @_; my @cut = split(/:/, $chk->{content}); if ( length $event->{args}->[0] >= int($cut[0]) ) { - %_ = map { $_=>$_ } lc keys %{$::sc{lc $chan}{users}}; - my @uniq = grep( $_{$_}, split( / / , lc $event->{args}->[0]) ); - return 1 if ( $#{ @uniq } >= int($cut[1]) ); + my %users = %{$::sc{lc $chan}->{users}}; + my %x = map { $_=>$_ } keys %users; + my @uniq = grep( $x{$_}, split( /[ ,]+/ , lc $event->{args}->[0]) ); + return 1 if ( @uniq >= int($cut[1]) ); } return 0; } diff --git a/modules/event.pl b/modules/event.pl index e7b3a66..c77fda1 100644 --- a/modules/event.pl +++ b/modules/event.pl @@ -67,8 +67,6 @@ sub on_connect { $conn->privmsg( 'NickServ', "ghost $::settings->{nick} $::settings->{pass}" ) if lc $event->{args}->[0] ne lc $::settings->{nick}; } -#my @leven = (); - sub on_join { my ($conn, $event) = @_; my %evcopyx = %{$event}; @@ -80,6 +78,11 @@ sub on_join { mkdir($::settings->{log}->{dir} . $chan); $conn->sl("who $chan"); $conn->privmsg('ChanServ', "op $chan" ) if (defined cs($chan)->{op}) && (cs($chan)->{op} eq 'yes'); + #TODO: make it settable via config. Hardcoded channames ftl. + if ($chan eq '##linux') { + $conn->schedule(300, \&do_chancount, $chan, 300); + #TODO: mark this as a channel we're watching so we don't schedule this multiple times + } } $::sc{$chan}{users}{$nick} = {}; $::sc{$chan}{users}{$nick}{hostmask} = $event->{userhost}; @@ -104,21 +107,6 @@ sub on_join { } } $::log->logg( $event ); -# if ( $#leven ne -1 ) { -# my $ld = ( ( maxlen($nick, $leven[0]) - distance($nick, $leven[0]) ) / maxlen($nick, $leven[0]) ); -# my $mx = $leven[0]; -# foreach my $item ( @leven ) { -# next if $nick eq $item; # avoid dups -# my $tld = ( ( maxlen($nick, $item) - distance($nick, $item) ) / maxlen($nick, $item) ); -# if ($tld > $ld) { -# $ld = $tld; -# $mx = $item; -# } -# } -# print "Best match for $nick was $mx with $ld\n" -# } -# push(@leven, $nick); -# shift @leven if $#leven > 5; } sub on_part @@ -139,6 +127,7 @@ sub on_part if ( lc $conn->{_nick} eq lc $nick ) { delete( $::sc{lc $event->{to}->[0]} ); + on_byechan(lc $event->{to}->[0]); } else { @@ -278,6 +267,7 @@ sub on_kick { if ( lc $conn->{_nick} eq lc $nick ) { delete( $::sc{lc $event->{args}->[0]} ); + on_byechan(lc $event->{to}->[0]); } else { @@ -431,4 +421,17 @@ sub on_bannedfromchan { $conn->privmsg('ChanServ', "unban $event->{args}->[1]"); } +sub on_byechan { + my ($chan) = @_; + #TODO do del event stuff +} + +sub do_chancount { + my ($conn, $chan, $repeat) = @_; + my @users = keys(%{$::sc{$chan}{users}}); + my $count = @users; + system('/home/icxcnika/AntiSpamMeta/chancount.pl ' . $chan . sprintf(' %d', $count)); + $conn->schedule($repeat, \&do_chancount, $chan, $repeat); +} + return 1; diff --git a/modules/inspect.pl b/modules/inspect.pl index a995202..faa4dd7 100644 --- a/modules/inspect.pl +++ b/modules/inspect.pl @@ -64,13 +64,13 @@ sub inspect { $conn->schedule(int($dct{$id}{time}), sub { $::oq->o_send($lconn,$lunmode); }); } } - unless (defined($::ignored{$event->{host}}) && ($::ignored{$event->{host}} >= $::RISKS{$dct{$id}{risk}})) { + unless (defined($::ignored{$chan}) && ($::ignored{$chan} >= $::RISKS{$dct{$id}{risk}})) { my @tgts = ASM::Util->getAlert($chan, $dct{$id}{risk}, 'msgs'); foreach my $tgt (@tgts) { $conn->privmsg($tgt, $txtz); } - $::ignored{$event->{host}} = $::RISKS{$dct{$id}{risk}}; - $conn->schedule(60, sub { delete($::ignored{$event->{host}})}); + $::ignored{$chan} = $::RISKS{$dct{$id}{risk}}; + $conn->schedule(45, sub { delete($::ignored{$chan})}); } } } diff --git a/modules/log.pl b/modules/log.pl index e8a178a..6f25c48 100644 --- a/modules/log.pl +++ b/modules/log.pl @@ -27,6 +27,9 @@ sub logg foreach my $chan ( @chans ) { $chan = lc $chan; + if (substr($chan, 0, 1) eq '@') { + $chan = substr($chan, 1); + } my $path = ">>$cfg->{dir}${chan}/${chan}" . strftime($cfg->{filefmt}, @time); $_ = ''; $_ = "<$event->{nick}> $event->{args}->[0]" if $event->{type} eq 'public'; diff --git a/modules/util.pl b/modules/util.pl index a385790..4fe63ee 100644 --- a/modules/util.pl +++ b/modules/util.pl @@ -1,4 +1,5 @@ package ASM::Util; +use Array::Utils qw(:all); use warnings; use strict; @@ -7,6 +8,7 @@ my %oq; %::RISKS = ( + 'disable'=> -1, #this isn't really an alert 'debug' => 10, 'info' => 20, 'low' => 30, @@ -66,8 +68,22 @@ sub maxlen { sub cs { my ($module, $chan) = @_; $chan = lc $chan; - return $::channels->{channel}->{$chan} if ( defined($::channels->{channel}->{$chan}) ); - return $::channels->{channel}->{default}; + return $::channels->{channel}->{default} unless defined($::channels->{channel}->{$chan}); + if ( defined($::channels->{channel}->{$chan}->{link}) ) { + return $::channels->{channel}->{ $::channels->{channel}->{$chan}->{link} }; + } + return $::channels->{channel}->{$chan}; +} + +sub getLink +{ + my ($module, $chan) = @_; + $chan = lc $chan; + my $link = $::channels->{channel}->{$chan}->{link}; + if ( defined($link) ) { + return $link; + } + return $chan; } #this item is a stub, dur @@ -126,15 +142,20 @@ sub flood_process { sub getAlert { my ($module, $c, $risk, $t) = @_; - @_ = (); + my @disable = (); + my @x = (); $c = lc $c; foreach my $prisk ( keys %::RISKS) { if ( $::RISKS{$risk} >= $::RISKS{$prisk} ) { - push( @_, @{$::channels->{channel}->{master}->{$t}->{$prisk}} ) if defined $::channels->{channel}->{master}->{$t}->{$prisk}; - push( @_, @{cs($module, $c)->{$t}->{$prisk}} ) if defined cs($module, $c)->{$t}->{$prisk}; + push( @x, @{$::channels->{channel}->{master}->{$t}->{$prisk}} ) if defined $::channels->{channel}->{master}->{$t}->{$prisk}; + push( @x, @{cs($module, $c)->{$t}->{$prisk}} ) if defined cs($module, $c)->{$t}->{$prisk}; } } - return @_; + push( @disable, @{$::channels->{channel}->{master}->{$t}->{disable}} ) if defined $::channels->{channel}->{master}->{$t}->{disable}; + push( @disable, @{cs($module, $c)->{$t}->{disable}} ) if defined cs($module, $c)->{$t}->{disable}; + @x = unique(@x); + @x = array_diff(@x, @disable); + return @x; } sub commaAndify { diff --git a/modules/xml.pl b/modules/xml.pl index c3da924..1978af9 100644 --- a/modules/xml.pl +++ b/modules/xml.pl @@ -11,8 +11,9 @@ sub readXML { my ( $p ) = $::cset; #@_; $p = 'default' if $p eq ''; $p = "config-$p"; + my @fchan = ( 'event', keys %::RISKS ); $::settings = $::xs1->XMLin( "$p/settings.xml", ForceArray => ['host'], 'GroupTags' => { altnicks => 'altnick', server => 'host', autojoins => 'autojoin' }); - $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => [qw/event debug info low medium high/]); + $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => \@fchan ); $::users = $::xs1->XMLin( "$p/users.xml", ForceArray => 'person'); $::commands = $::xs1->XMLin( "$p/commands.xml", ForceArray => [qw/command/]); $::mysql = $::xs1->XMLin( "$p/mysql.xml", ForceArray => []); -- cgit v1.2.3