summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/classes.pl8
-rw-r--r--modules/event.pl37
-rw-r--r--modules/inspect.pl6
-rw-r--r--modules/log.pl3
-rw-r--r--modules/util.pl33
-rw-r--r--modules/xml.pl3
6 files changed, 60 insertions, 30 deletions
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 => []);