summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO10
-rw-r--r--config-default/commands.xml20
-rwxr-xr-xmeta.pl66
-rw-r--r--modules/actions.pl41
-rw-r--r--modules/classes.pl195
-rw-r--r--modules/command.pl19
-rw-r--r--modules/event.pl123
-rw-r--r--modules/inspect.pl38
-rw-r--r--modules/services.pl12
-rw-r--r--modules/util.pl58
-rw-r--r--modules/xml.pl7
11 files changed, 320 insertions, 269 deletions
diff --git a/TODO b/TODO
index 0047807..6490cb8 100644
--- a/TODO
+++ b/TODO
@@ -1,9 +1,9 @@
X modularize Mysql.pl - DONE
-- modularize Events.pl
+/ modularize Events.pl
- modularize Actions.pl
-- modularize Classes.pl
-- modularize Command.pl
+/ modularize Classes.pl
+/ modularize Command.pl
- modularize Inspect.pl
X modularize Log.pl - DONE
-- modularize Services.pl
-- modularize Util.pl
+/ modularize Services.pl
+/ modularize Util.pl
diff --git a/config-default/commands.xml b/config-default/commands.xml
index 7eaca57..6b36aa4 100644
--- a/config-default/commands.xml
+++ b/config-default/commands.xml
@@ -13,7 +13,7 @@
my $host = $2;
if ($host eq '') { $host = 'IDENTIFY'; }
$::users->{person}->{$nick} = { 'host' => $host };
- writeUsers();
+ ASM::XML->writeUsers();
$conn->privmsg($event->{to}->[0], "Hiya $nick");
]]>
</command>
@@ -24,7 +24,7 @@
if ($flags eq '') { delete($::users->{person}->{$nick}->{flags}); } else {
$::users->{person}->{$nick}->{flags} = $flags;
}
- writeUsers();
+ ASM::XML->writeUsers();
$conn->privmsg($event->{to}->[0], "Flags for $nick set to $flags");
]]>
</command>
@@ -32,7 +32,7 @@
<![CDATA[
my $nick = lc $1;
delete($::users->{person}->{$nick});
- writeUsers();
+ ASM::XML->writeUsers();
$conn->privmsg($event->{to}->[0], "Byebye $nick");
]]>
</command>
@@ -70,7 +70,7 @@
my @tmphl = @{$::channels->{channel}->{$chan}->{msgs}->{$level}};
push(@tmphl, $nick);
$::channels->{channel}->{$chan}->{msgs}->{$level} = \@tmphl;
- writeChannels();
+ ASM::XML->writeChannels();
$conn->privmsg($event->{to}->[0], "$nick added to $level risk messages for $chan");
]]>
</command>
@@ -84,7 +84,7 @@
@ppl = grep { lc $_ ne lc $nick } @ppl;
$::channels->{channel}->{$chan}->{msgs}->{$risk} = \@ppl;
}
- writeChannels();
+ ASM::XML->writeChannels();
$conn->privmsg($event->{to}->[0], "no moar msgs for $nick");
]]>
</command>
@@ -103,7 +103,7 @@
my @tmphl = @{$::channels->{channel}->{$chan}->{hilights}->{$level}};
push(@tmphl, $nick);
$::channels->{channel}->{$chan}->{hilights}->{$level} = \@tmphl;
- writeChannels();
+ ASM::XML->writeChannels();
$conn->privmsg($event->{to}->[0], "$nick added to $level risk hilights for $chan");
]]>
</command>
@@ -117,7 +117,7 @@
@ppl = grep { lc $_ ne lc $nick } @ppl;
$::channels->{channel}->{$chan}->{hilights}->{$risk} = \@ppl;
}
- writeChannels();
+ ASM::XML->writeChannels();
$conn->privmsg($event->{to}->[0], "kthxbai $nick");
]]>
</command>
@@ -126,13 +126,13 @@
my $chan = $1;
unless (defined($::channels->{channel}->{$chan})) {
$::channels->{channel}->{$chan} = { 'op' => 'no' };
- writeChannels();
+ ASM::XML->writeChannels();
}
$conn->join($chan);
my @autojoins = @{$::settings->{autojoins}};
@autojoins = (@autojoins, $chan);
$::settings->{autojoins} = \@autojoins;
- writeSettings();
+ ASM::XML->writeSettings();
]]>
</command>
<command cmd="^;part (\S+)" flag="a">
@@ -142,7 +142,7 @@
my @autojoins = @{$::settings->{autojoins}};
@autojoins = grep { lc $_ ne lc $chan } @autojoins;
$::settings->{autojoins} = \@autojoins;
- writeSettings();
+ ASM::XML->writeSettings();
]]>
</command>
<command cmd="^;sl (.*)" flag="d">
diff --git a/meta.pl b/meta.pl
index 79f0f90..64236f3 100755
--- a/meta.pl
+++ b/meta.pl
@@ -1,7 +1,6 @@
#!/usr/bin/perl -w
use lib '/home/icxcnika/AntiSpamMeta';
-#use lib '/home/wheimbigner/perl/lib/perl5/site_perl/5.8.8';
use warnings;
use strict;
use Net::IRC;
@@ -12,25 +11,10 @@ use Getopt::Long;
@::eline=();
$::pass = '';
-my @modules = qw/Xml Util Inspect Services Log Command Event Classes Actions Mysql/;
+my @modules = qw/Xml Util Inspect Services Log Command Event Classes Actions Mysql OperQueue/;
require 'modules/' . lc $_ . '.pl' foreach @modules;
-sub rePlug
-{
- my ($conn) = @_;
- foreach (@modules) {
- eval $_ . '::killsub();';
- warn $@ if $@;
- eval 'undef &' . $_ . '::killsub;';
- warn $@ if $@;
- delete $INC{'modules/' . lc $_ . '.pl'};
- require 'modules/' . lc $_ . '.pl';
- }
- registerHandlers($conn); # this is necessary in case event.pl has changed
- # because handlers are registered via pointers
-}
-
sub init {
my ( $conn, $host );
my $debug = 0;
@@ -40,17 +24,13 @@ sub init {
'pass|p:s' => \$::pass,
'config|c:s' => \$::cset
);
- readXML();
+ ASM::XML->readXML();
$::log = ASM::Log->new($::settings->{log});
$::pass = $::settings->{pass} if $::pass eq '';
$host = ${$::settings->{server}}[rand @{$::settings->{server}}];
print "Connecting to $host\n";
$irc->debug($debug);
$::db = ASM::DB->new($::mysql->{db}, $::mysql->{host}, $::mysql->{port}, $::mysql->{user}, $::mysql->{pass}, $::mysql->{table});
-# $::dbh = DBI->connect("DBI:mysql:database=$::mysql->{db};host=$::mysql->{host};port=$::mysql->{port}",
-# $::mysql->{user}, $::mysql->{pass});
-#
-# sql_connect();
$conn = $irc->newconn( Server => $host,
Port => $::settings->{port} || '6667',
Nick => $::settings->{nick},
@@ -59,45 +39,15 @@ sub init {
Password => $::settings->{pass},
Pacing => 1 );
$conn->debug($debug);
- registerHandlers($conn);
+ $::inspector = ASM::Inspect->new();
+ $::services = ASM::Services->new();
+ $::oq = ASM::OperQueue->new();
+ $::commander = ASM::Commander->new();
+ $::event = ASM::Event->new($conn, $::inspector);
+ $::classes = ASM::Classes->new();
@::eline=io('exempt.txt')->getlines;
chomp @::eline;
$irc->start();
}
-sub registerHandlers {
- my ($conn) = @_;
- print "Installing handler routines...\n";
- $conn->add_default_handler(\&blah);
- $conn->add_handler('bannedfromchan', \&on_bannedfromchan);
- $conn->add_handler('mode', \&on_mode);
- $conn->add_handler('join', \&on_join);
- $conn->add_handler('part', \&on_part);
- $conn->add_handler('quit', \&on_quit);
- $conn->add_handler('nick', \&on_nick);
- $conn->add_handler('notice', \&on_notice);
- $conn->add_handler('caction', \&on_public);
- $conn->add_handler('msg', \&on_msg);
- $conn->add_handler('namreply', \&on_names);
- $conn->add_handler('endofnames', \&on_names);
- $conn->add_handler('public', \&on_public);
- $conn->add_handler('376', \&on_connect);
- $conn->add_handler('topic', \&irc_topic);
- $conn->add_handler('topicinfo', \&irc_topic);
- $conn->add_handler('nicknameinuse', \&on_errnickinuse);
- $conn->add_handler('kick', \&on_kick);
- $conn->add_handler('cping', \&on_ctcp);
- $conn->add_handler('cversion', \&on_ctcp);
- $conn->add_handler('csource', \&on_ctcp);
- $conn->add_handler('ctime', \&on_ctcp);
- $conn->add_handler('cdcc', \&on_ctcp);
- $conn->add_handler('cuserinfo', \&on_ctcp);
- $conn->add_handler('cclientinfo', \&on_ctcp);
- $conn->add_handler('cfinger', \&on_ctcp);
- $conn->add_handler('320', \&whois_identified);
- $conn->add_handler('318', \&whois_end);
- $conn->add_handler('311', \&whois_user);
- $conn->add_handler('352', \&on_whoreply);
-}
-
init();
diff --git a/modules/actions.pl b/modules/actions.pl
index 7d6717d..386e51a 100644
--- a/modules/actions.pl
+++ b/modules/actions.pl
@@ -4,45 +4,32 @@ use warnings;
#package Actions;
sub Actions::ban {
- our ($conn, $event, $unmode, $chan, %dct, $id);
- o_send( $conn, "mode $chan +b *!*\@$event->{host}" );
- $unmode="mode $chan -b *!*\@$event->{host}";
+ my ($conn, $event, $chan) = @_;
+ $::oq->o_send( $conn, "mode $chan +b *!*\@$event->{host}" );
+ return "mode $chan -b *!*\@$event->{host}";
}
sub Actions::kban {
- our ($conn, $event, $unmode, $chan, %dct, $id);
- o_send($conn, "mode $chan +b *!*\@$event->{host}");
- o_send($conn, "kick $chan $event->{nick} :$dct{$id}{reason}");
- $unmode = "mode $chan -b *!*\@$event->{host}";
+ my ($conn, $event, $chan) = @_;
+ $::oq->o_send($conn, "mode $chan +b *!*\@$event->{host}");
+ $::oq->o_send($conn, "kick $chan $event->{nick} :Spamming");
+ return "mode $chan -b *!*\@$event->{host}";
}
sub Actions::kick {
- our ($conn, $event, $unmode, $chan, %dct, $id);
- o_send($conn, "kick $chan $event->{nick} :$dct{$id}{reason}");
+ my ($conn, $event, $chan) = @_;
+ $::oq->o_send($conn, "kick $chan $event->{nick} :Spamming");
+ return "";
}
sub Actions::none {
- return;
+ return "";
}
sub Actions::quiet {
- our ($conn, $event, $unmode, $chan, %dct, $id);
- o_send( $conn, "mode $chan +b %*!*\@$event->{host}" );
- $unmode = "mode $chan -b %*!*\@$event->{host}";
-}
-
-sub Actions::fmod_wiki {
- our ($conn, $event, $unmode, $chan, %dct, $id);
- o_send( $conn, "mode $chan -b *!*\@$event->{host}" );
- o_send( $conn, "mode $chan +b *!*\@$event->{host}!#wikimedia-ops" );
-}
-
-sub Actions::killsub {
- undef &Actions::ban;
- undef &Actions::kban;
- undef &Actions::kick;
- undef &Actions::none;
- undef &Actions::quiet;
+ my ($conn, $event, $chan) = @_;
+ $::oq->o_send( $conn, "mode $chan +b %*!*\@$event->{host}" );
+ return "mode $chan -b %*!*\@$event->{host}";
}
return 1;
diff --git a/modules/classes.pl b/modules/classes.pl
index 8323a06..3ccd113 100644
--- a/modules/classes.pl
+++ b/modules/classes.pl
@@ -1,39 +1,74 @@
+package ASM::Classes;
+
use strict;
use warnings;
+my %sf = ();
+
+sub new
+{
+ my $module = shift;
+ my $self = {};
+ my $tbl = {
+ "dnsbl" => \&dnsbl,
+ "floodqueue" => \&floodqueue,
+ "nickspam" => \&nickspam,
+ "splitflood" => \&splitflood,
+ "re" => \&re,
+ "nick" => \&nick,
+ "ident" => \&ident,
+ "host" => \&host,
+ "gecos" => \&gecos,
+ "nuhg" => \&nuhg,
+ };
+ $self->{ftbl} = $tbl;
+ bless($self);
+ return $self;
+}
+
+sub check {
+ my $self = shift;
+ my $item = shift;
+ return $self->{ftbl}->{$item}->(@_);
+}
-sub Classes::dnsbl {
- our (%aonx, $id, %dct, $event, $chan, $rev);
+sub dnsbl {
+ my ($xchk, $id, $event, $chan, $rev) = @_;
+ my %chk = %{$xchk};
return unless index($event->{host}, '/') == -1;
- if (defined $rev) {
- my $iaddr = hostip( "$rev$aonx{$id}{content}" );
- my @dnsbl = unpack( 'C4', $iaddr ) if defined $iaddr;
- $dct{$id} = $aonx{$id} if (@dnsbl);
- }
+ if (defined $rev) {
+ my $iaddr = gethostbyname( "$rev$chk{content}" );
+ my @dnsbl = unpack( 'C4', $iaddr ) if defined $iaddr;
+ return 1 if (@dnsbl);
+ }
+ return 0;
}
-sub Classes::floodqueue {
- our (%aonx, $id, %dct, $event, $chan);
- my @cut=split(/:/, $aonx{$id}{content});
- $dct{$id} = $aonx{$id} if ( flood_add( $chan, $id, $event->{host}, int($cut[1]) ) == int($cut[0]) );
+sub floodqueue {
+ my ($xchk, $id, $event, $chan, $rev) = @_;
+ my %chk = %{$xchk};
+ my @cut = split(/:/, $chk{content});
+ return 1 if ( flood_add( $chan, $id, $event->{host}, int($cut[1]) ) == int($cut[0]) );
+ return 0;
}
-sub Classes::nickspam {
- our (%aonx, $id, %dct, $event, $chan);
- my @cut = split(/:/, $aonx{$id}{content});
- if ( length $event->{args}->[0] >= int($cut[0]) ) {
- %_ = map { $_=>$_ } lc keys %{$::sc{lc $chan}{users}};
- my @uniq = grep( $_{$_}, split( / /, lc $event->{args}->[0]) );
- $dct{$id} = $aonx{$id} if ( $#{ @uniq } >= int($cut[1]) );
- }
+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]) );
+ }
+ return 0;
}
my %cf=();
my %bs=();
-sub Classes::splitflood {
- our (%aonx, $id, %dct, $event, $chan);
+sub splitflood {
+ my ($chk, $id, $event, $chan) = @_;
my $text;
- my @cut = split(/:/, $aonx{$id}{content});
+ my @cut = split(/:/, $chk->{content});
$cf{$id}{timeout}=int($cut[1]);
if ($event->{type} =~ /^(public|notice|part|caction)$/) {
$text=$event->{args}->[0];
@@ -41,8 +76,7 @@ sub Classes::splitflood {
return unless defined($text);
return unless length($text) >= 10;
if (defined($bs{$id}{$text}) && (time <= $bs{$id}{$text} + 600)) {
- $dct{$id}=$aonx{$id};
- return;
+ return 1;
}
push( @{$cf{$id}{$chan}{$text}}, time );
foreach my $nid ( keys %cf ) {
@@ -58,84 +92,89 @@ sub Classes::splitflood {
}
}
if ( $#{ @{$cf{$id}{$chan}{$text}}}+1 == int($cut[0]) ) {
- $dct{$id}=$aonx{$id};
$bs{$id}{$text} = time;
+ return 1;
}
+ return 0;
}
-sub Classes::re {
- our (%aonx, $id, %dct, $event, $chan);
- my $match = $event->{args}->[0];
- $match = $event->{nick} if ($event->{type} eq 'join');
- if ( (defined $aonx{$id}{nocase}) && ($aonx{$id}{nocase}) ) {
- $dct{$id}=$aonx{$id} if ($match =~ /$aonx{$id}{content}/i);
- }
- else {
- $dct{$id}=$aonx{$id} if ($match =~ /$aonx{$id}{content}/);
- }
+sub re {
+ my ($chk, $id, $event, $chan) = @_;
+ my $match = $event->{args}->[0];
+ $match = $event->{nick} if ($event->{type} eq 'join');
+ if ( defined($chk->{nocase}) ) {
+ return 1 if ($match =~ /$chk->{content}/i);
+ } else {
+ return 1 if ($match =~ /$chk->{content}/);
+ }
+ return 0;
}
-sub Classes::nick {
- our (%aonx, $id, %dct, $event, $chan);
- if ( lc $event->{nick} eq lc $aonx{$id}{content} ) {
- $dct{$id} = $aonx{$id};
+sub nick {
+ my ($chk, $id, $event, $chan) = @_;
+ if ( lc $event->{nick} eq lc $chk->{content} ) {
+ return 1;
}
+ return 0;
}
-sub Classes::ident {
- our (%aonx, $id, %dct, $event, $chan);
- if ( lc $event->{user} eq lc $aonx{$id}{content} ) {
- $dct{$id} = $aonx{$id};
+sub ident {
+ my ( $chk, $id, $event, $chan) = @_;
+ if ( lc $event->{user} eq lc $chk->{content} ) {
+ return 1;
}
+ return 0;
}
-sub Classes::host {
- our (%aonx, $id, %dct, $event, $chan);
- if ( lc $event->{host} eq lc $aonx{$id}{content} ) {
- $dct{$id} = $aonx{$id};
+sub host {
+ my ( $chk, $id, $event, $chan) = @_;
+ if ( lc $event->{host} eq lc $chk->{content} ) {
+ return 1;
}
+ return 0;
}
-sub Classes::gecos {
- our (%aonx, $id, %dct, $event, $chan);
- if ( lc $::sn{lc $event->{nick}}->{gecos} eq lc $aonx{$id}{content} ) {
- $dct{$id} = $aonx{$id};
+sub gecos {
+ my ( $chk, $id, $event, $chan) = @_;
+ if ( lc $::sn{lc $event->{nick}}->{gecos} eq lc $chk->{content} ) {
+ return 1;
}
+ return 0;
}
-sub Classes::nuhg {
- our (%aonx, $id, %dct, $event, $chan);
+sub nuhg {
+ my ( $chk, $id, $event, $chan) = @_;
my $match = $event->{from} . '!' . $::sn{lc $event->{nick}}->{gecos};
- if ( (defined $aonx{$id}{nocase}) && ($aonx{$id}{nocase}) ) {
- $dct{$id}=$aonx{$id} if ($match =~ /$aonx{$id}{content}/i);
+ if ( defined($chk->{nocase}) ) {
+ return 1 if ($match =~ /$chk->{content}/i);
} else {
- $dct{$id}=$aonx{$id} if ($match =~ /$aonx{$id}{content}/);
+ return 1 if ($match =~ /$chk->{content}/);
}
+ return 0;
}
-sub Classes::killsub {
- undef &Classes::dnsbl;
- undef &Classes::floodqueue;
- undef &Classes::nickspam;
- undef &Classes::re;
+sub flood_add {
+ my ( $chan, $id, $host, $to ) = @_;
+ push( @{$sf{$id}{$chan}{$host}}, time );
+ while ( time >= $sf{$id}{$chan}{$host}[0] + $to ) {
+ last if ( $#{ $sf{$id}{$chan}{$host} } == 0 );
+ shift( @{$sf{$id}{$chan}{$host}} );
+ }
+ return $#{ @{$sf{$id}{$chan}{$host}}}+1;
}
-#$VAR1 = bless( {
-# 'to' => [
-# '##asb-testing'
-# ],
-# 'format' => 'mode',
-# 'from' => 'ChanServ!ChanServ@services.',
-# 'user' => 'ChanServ',
-# 'args' => [
-# '+o',
-# 'AntiSpamMetaBeta',
-# ''
-# ],
-# 'nick' => 'ChanServ',
-# 'type' => 'mode',
-# 'userhost' => 'ChanServ@services.',
-# 'host' => 'services.'
-# }, 'Net::IRC::Event' );
+sub flood_process {
+ for my $id ( keys %sf ) {
+ for my $chan ( keys %{$sf{$id}} ) {
+ for my $host ( keys %{$sf{$id}{$chan}} ) {
+ next unless defined $sf{$id}{$chan}{$host}[0];
+ while ( time >= $sf{$id}{$chan}{$host}[0] + $sf{$id}{'timeout'} ) {
+ last if ( $#{ $sf{$id}{$chan}{$host} } == 0 );
+ shift ( @{$sf{$id}{$chan}{$host}} );
+ }
+ }
+ }
+ }
+}
return 1;
diff --git a/modules/command.pl b/modules/command.pl
index fe299fd..80cda19 100644
--- a/modules/command.pl
+++ b/modules/command.pl
@@ -1,9 +1,18 @@
+package ASM::Commander;
use warnings;
use strict;
-sub do_command
+sub new
{
- my ($conn, $event) = @_;
+ my $module = shift;
+ my $self = {};
+ bless($self);
+ return $self;
+}
+
+sub command
+{
+ my ($self, $conn, $event) = @_;
my $args = $event->{args}->[0];
my $from = $event->{from};
my $cmd = $args;
@@ -35,8 +44,4 @@ sub do_command
}
}
-sub Command::killsub {
- undef &do_command;
-}
-
-return 1;
+1;
diff --git a/modules/event.pl b/modules/event.pl
index 42a0114..d644b20 100644
--- a/modules/event.pl
+++ b/modules/event.pl
@@ -1,22 +1,81 @@
+package ASM::Event;
use warnings;
use strict;
+use Data::Dumper;
use Text::LevenshteinXS qw(distance);
+#require 'modules/inspect.pl';
+sub cs {
+ my ($chan) = @_;
+ $chan = lc $chan;
+ return $::channels->{channel}->{$chan} if ( defined($::channels->{channel}->{$chan}) );
+ return $::channels->{channel}->{default};
+}
+
+sub maxlen {
+ my ($a, $b) = @_;
+ my ($la, $lb) = (length($a), length($b));
+ return $la if ($la > $lb);
+ return $lb;
+}
+
+sub new
+{
+ my $module = shift;
+ my ($conn, $inspector) = @_;
+ my $self = {};
+ $self->{CONN} = $conn;
+ $self->{INSPECTOR} = $inspector;
+ print "Installing handler routines...\n";
+ $conn->add_default_handler(\&blah);
+ $conn->add_handler('bannedfromchan', \&on_bannedfromchan);
+ $conn->add_handler('mode', \&on_mode);
+ $conn->add_handler('join', sub { on_join( $self, @_ ) } ); #\&on_join);
+ $conn->add_handler('part', \&on_part);
+ $conn->add_handler('quit', \&on_quit);
+ $conn->add_handler('nick', \&on_nick);
+ $conn->add_handler('notice', \&on_notice);
+ $conn->add_handler('caction', \&on_public);
+ $conn->add_handler('msg', \&on_msg);
+ $conn->add_handler('namreply', \&on_names);
+ $conn->add_handler('endofnames', \&on_names);
+ $conn->add_handler('public', \&on_public);
+ $conn->add_handler('376', \&on_connect);
+ $conn->add_handler('topic', \&irc_topic);
+ $conn->add_handler('topicinfo', \&irc_topic);
+ $conn->add_handler('nicknameinuse', \&on_errnickinuse);
+ $conn->add_handler('kick', \&on_kick);
+ $conn->add_handler('cping', \&on_ctcp);
+ $conn->add_handler('cversion', \&on_ctcp);
+ $conn->add_handler('csource', \&on_ctcp);
+ $conn->add_handler('ctime', \&on_ctcp);
+ $conn->add_handler('cdcc', \&on_ctcp);
+ $conn->add_handler('cuserinfo', \&on_ctcp);
+ $conn->add_handler('cclientinfo', \&on_ctcp);
+ $conn->add_handler('cfinger', \&on_ctcp);
+ $conn->add_handler('320', \&whois_identified);
+ $conn->add_handler('318', \&whois_end);
+ $conn->add_handler('311', \&whois_user);
+ $conn->add_handler('352', \&on_whoreply);
+ bless($self);
+ return $self;
+}
+
sub on_connect {
my ($conn, $event) = @_; # need to check for no services
- $conn->privmsg( 'NickServ', "ghost $::settings->{nick} $::pass" ) if lc $event->{args}->[0] ne lc $::settings->{nick};
+ $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 ($self, $conn, $event) = @_;
my %evcopyx = %{$event};
my $evcopy = \%evcopyx;
my $nick = lc $event->{nick};
my $chan = lc $event->{to}->[0];
- if ( leq($conn->{_nick}, $nick) ) {
+ if ( lc $conn->{_nick} eq lc $nick) {
$::sc{$chan} = {};
$conn->sl("who $chan");
$conn->privmsg('ChanServ', "op $chan" ) if (defined cs($chan)->{op}) && (cs($chan)->{op} eq 'yes');
@@ -32,7 +91,7 @@ sub on_join {
}
@mship = (@mship, $chan);
$::sn{$nick}->{mship} = \@mship;
- inspect( $conn, $event );
+ $::inspector->inspect( $conn, $event );
} else {
$::sn{$nick} = {};
$::sn{$nick}->{mship} = [ $chan ];
@@ -64,7 +123,7 @@ sub on_join {
sub on_part
{
my ($conn, $event) = @_;
- inspect( $conn, $event );
+ $::inspector->inspect( $conn, $event );
my $nick = lc $event->{nick};
$::log->logg( $event );
if (defined($::sn{$nick}) && defined($::sn{$nick}->{mship})) {
@@ -76,7 +135,7 @@ sub on_part
delete($::sn{$nick});
}
}
- if ( leq( $conn->{_nick}, $nick ) )
+ if ( lc $conn->{_nick} eq lc $nick )
{
delete( $::sc{lc $event->{to}->[0]} );
}
@@ -89,23 +148,23 @@ sub on_part
sub on_msg
{
my ($conn, $event) = @_;
- do_command ($conn, $event)
+ $::commander->command($conn, $event);
}
sub on_public
{
my ($conn, $event) = @_;
- inspect( $conn, $event );
+ $::inspector->inspect( $conn, $event );
$::log->logg( $event );
- do_command( $conn, $event )
+ $::commander->command( $conn, $event );
}
sub on_notice
{
my ($conn, $event) = @_;
- inspect( $conn, $event );
+ $::inspector->inspect( $conn, $event );
$::log->logg( $event );
- doServices($conn, $event);
+ $::services->doServices($conn, $event);
}
sub on_errnickinuse
@@ -125,14 +184,14 @@ sub on_quit
}
$event->{to} = \@channels;
delete($::sn{lc $event->{nick}});
- inspect( $conn, $event );
- $::log->logg ( $event );
+ $::inspector->inspect( $conn, $event );
+ $::log->logg( $event );
}
sub blah
{
my ($self, $event) = @_;
- inspect($self, $event);
+ $::inspector->inspect($self, $event);
}
sub irc_users
@@ -157,7 +216,7 @@ sub on_names {
sub irc_topic {
my ($conn, $event) = @_;
- inspect($conn, $event) if ($event->{format} ne 'server');
+ $::inspector->inspect($conn, $event) if ($event->{format} ne 'server');
if ($event->{format} eq 'server')
{
if ($event->{type} eq 'topic')
@@ -195,7 +254,7 @@ sub on_nick {
$::sn{lc $event->{args}->[0]} = $::sn{lc $event->{nick}};
delete( $::sn{lc $event->{nick}});
$event->{to} = \@channels;
- inspect($conn, $event);
+ $::inspector->inspect($conn, $event);
$::log->logg($event)
}
@@ -223,6 +282,32 @@ sub on_kick {
}
}
+sub parse_modes
+{
+ my ( $n ) = @_;
+ my @args = @{$n};
+ my @modes = split '', shift @args;
+ my @new_modes=();
+ my $t;
+ foreach my $c ( @modes ) {
+ if (($c eq '-') || ($c eq '+')) {
+ $t=$c;
+ }
+ else {
+ if ( defined( grep( /[abdefhIJkloqv]/,($c) ) ) ) { #modes that take args
+ push (@new_modes, [$t.$c, shift @args]);
+ }
+ elsif ( defined( grep( /[cgijLmnpPQrRstz]/, ($c) ) ) ) {
+ push (@new_modes, [$t.$c]);
+ }
+ else {
+ die "Unknown mode $c !\n";
+ }
+ }
+ }
+ return \@new_modes;
+}
+
sub on_mode
{
my ($conn, $event) = @_;
@@ -234,7 +319,7 @@ sub on_mode
if ( $ex[0] eq '+o' ) {
$::sc{$chan}{users}{lc $ex[1]}{op}=1;
if (lc $ex[1] eq lc $::settings->{nick}) {
- doQueue($conn, $chan);
+ $::oq->doQueue($conn, $chan);
if ( $::channels->{channel}->{$chan}->{op} eq "when" ) {
$conn->schedule(600, sub { print "Deop timer called!\n"; $conn->privmsg('ChanServ', "op $chan -". $::settings->{nick})});
}
@@ -257,7 +342,7 @@ sub on_mode
sub on_ctcp
{
my ($conn, $event) = @_;
- inspect($conn, $event);
+ $::inspector->inspect($conn, $event);
}
sub whois_identified {
@@ -293,7 +378,7 @@ sub whois_user {
$::sn{$lnick}->{host} = $event2->{args}->[3];
if (defined( $::needgeco{$lnick} )) {
foreach my $event (@{$::needgeco{$lnick}}) {
- inspect($conn, $event);
+ $::inspector->inspect($conn, $event);
}
delete $::needgeco{$lnick};
}
diff --git a/modules/inspect.pl b/modules/inspect.pl
index fc66215..9b03ca1 100644
--- a/modules/inspect.pl
+++ b/modules/inspect.pl
@@ -1,14 +1,23 @@
+package ASM::Inspect;
use warnings;
use strict;
use List::Util qw(first);
+use Data::Dumper;
%::ignored = ();
+sub new
+{
+ my $module = shift;
+ my $self = {};
+ bless($self);
+ return $self;
+}
sub inspect {
- our ($conn, $event) = @_;
+ our ($self, $conn, $event) = @_;
my (%conx, %monx);
- our (%aonx, %dct, $rev, $chan, $id);
+ my (%aonx, %dct, $rev, $chan, $id);
%aonx=(); %dct=(); $chan=""; $id="";
my (@dnsbl, @unpakt, @uniq, @cut);
my ($match, $txtz, $iaddr);
@@ -18,7 +27,7 @@ sub inspect {
return if (defined(first { ( lc $event->{nick} eq lc $_ ) } @::eline));
return if (defined(first { ( lc $event->{user} eq lc $_ ) } @::eline));
return if (defined(first { ( lc $event->{host} eq lc $_ ) } @::eline));
- $iaddr = hostip($event->{host});
+ $iaddr = gethostbyname($event->{host});
$rev = join('.', reverse(unpack('C4', $iaddr))).'.' if (defined $iaddr);
%monx = defined($::channels->{channel}->{master}->{event}) ? %{$::channels->{channel}->{master}->{event}} : ();
## NB: isn't there a better way to do this with grep, somehow?
@@ -33,8 +42,10 @@ sub inspect {
next unless ( defined(first { lc $_ eq $event->{type} } split(/[,:; ]+/, $aonx{$id}{type}) ) )
|| ( lc $event->{type} eq lc $aonx{$id}{type} );
# next unless ( defined($::classes->{class}->{$aonx{$id}{class}}));
- eval "Classes::" . $aonx{$id}{class} . "();";
- warn $@ if $@;
+ $dct{$id} = $aonx{$id} if $::classes->check($aonx{$id}{class}, $aonx{$id}, $id, $event, $chan, $rev);
+# my ($chk, $id, $event, $chan) = @_;
+# eval "Classes::" . $aonx{$id}{class} . "();";
+# warn $@ if $@;
}
}
foreach ( keys %dct ) {
@@ -46,14 +57,14 @@ sub inspect {
$::db->record($chan, $event->{nick}, $event->{user}, $event->{host}, $::sn{lc $event->{nick}}->{gecos}, $dct{$id}{risk}, $id, $dct{$id}{reason});
$txtz = "$dct{$id}{risk} risk threat: ".
"Detected $event->{nick} $dct{$id}{reason} in $chan ";
- $txtz = $txtz . commaAndify(getAlert(lc $chan, $dct{$id}{risk}, 'hilights')) if (getAlert(lc $chan, $dct{$id}{risk}, 'hilights'));
- if (cs(lc $chan)->{op} ne 'no') {
+ $txtz = $txtz . ASM::Util->commaAndify(ASM::Util->getAlert(lc $chan, $dct{$id}{risk}, 'hilights')) if (ASM::Util->getAlert(lc $chan, $dct{$id}{risk}, 'hilights'));
+ if (ASM::Util->cs(lc $chan)->{op} ne 'no') {
if ($event->{type} eq 'topic') { #restore old topic
my $oldtopic = $::sc{lc $event->{to}->[0]}{topic}{text};
o_send( $conn, "topic $chan :$oldtopic");
o_send( $conn, "mode $chan +t");
}
- eval "Actions::" . $dct{$id}{action} . "();";
+ eval '$unmode = Actions::' . $dct{$id}{action} . '($conn, $event, $chan);';
warn $@ if $@;
my $lconn=$conn; my $lunmode = $unmode;
if ((int($dct{$id}{time}) ne 0) && ($unmode ne '')) {
@@ -61,7 +72,12 @@ sub inspect {
}
}
unless (defined($::ignored{lc $event->{nick}}) && ($::ignored{lc $event->{nick}} >= $::RISKS{$dct{$id}{risk}})) {
- $conn->privmsg($_, $txtz) foreach getAlert($chan, $dct{$id}{risk}, 'msgs');
+ print "alerting!\n";
+ my @tgts = ASM::Util->getAlert($chan, $dct{$id}{risk}, 'msgs');
+ print Dumper(\@tgts);
+ foreach my $tgt (@tgts) {
+ $conn->privmsg($tgt, $txtz);
+ }
$::ignored{lc $nick} = $::RISKS{$dct{$id}{risk}};
$conn->schedule(15, sub { delete($::ignored{lc $nick})});
}
@@ -69,8 +85,4 @@ sub inspect {
}
}
-sub Inspect::killsub {
- undef &inspect;
-}
-
return 1;
diff --git a/modules/services.pl b/modules/services.pl
index c70b9ca..e80923a 100644
--- a/modules/services.pl
+++ b/modules/services.pl
@@ -1,8 +1,16 @@
+package ASM::Services;
use warnings;
use strict;
+sub new
+{
+ my $self = {};
+ bless($self);
+ return $self;
+}
+
sub doServices {
- my ($conn, $event) = @_;
+ my ($self, $conn, $event) = @_;
if ($event->{from} eq 'NickServ!NickServ@services.')
{
print "NickServ: $event->{args}->[0]\n";
@@ -28,7 +36,7 @@ sub doServices {
print "ChanServ: $event->{args}->[0] \n";
if ($event->{args}->[0] =~ /You are already opped on \[.(.*).\]/)
{
- doQueue($conn, $1);
+ $::oq->doQueue($conn, $1);
}
elsif ( $event->{args}->[0] =~ /^All.*bans matching.*have been cleared on(.*)/)
{
diff --git a/modules/util.pl b/modules/util.pl
index fb10356..f13c854 100644
--- a/modules/util.pl
+++ b/modules/util.pl
@@ -1,5 +1,4 @@
-#warning: if you add a function, put it into killsub!
-
+package ASM::Util;
use warnings;
use strict;
@@ -15,6 +14,14 @@ my %oq;
'high' => 50,
'opalert'=> 9001 #OVER NINE THOUSAND!!!
);
+sub new
+{
+ my $module = shift;
+ my $self = {};
+ bless ($self);
+ return $self;
+}
+
#leaves room for more levels if for some reason we end up needing more
#theoretically, you should be able to change those numbers without any damage
@@ -27,7 +34,7 @@ sub maxlen {
#cs: returns the xml settings for the specified chan, or default if there aren't any settings for that chan
sub cs {
- my ($chan) = @_;
+ my ($module, $chan) = @_;
$chan = lc $chan;
return $::channels->{channel}->{$chan} if ( defined($::channels->{channel}->{$chan}) );
return $::channels->{channel}->{default};
@@ -88,19 +95,20 @@ sub flood_process {
}
sub getAlert {
- my ($c, $risk, $t) = @_;
+ my ($module, $c, $risk, $t) = @_;
@_ = ();
$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($c)->{$t}->{$prisk}} ) if defined cs($c)->{$t}->{$prisk};
+ push( @_, @{cs($module, $c)->{$t}->{$prisk}} ) if defined cs($module, $c)->{$t}->{$prisk};
}
}
return @_;
}
sub commaAndify {
+ my $module = shift;
my @seq = @_;
my $len = ($#seq);
my $last = $seq[$len];
@@ -110,32 +118,6 @@ sub commaAndify {
return join( ', ', splice(@seq,0,$len) ) . ', and ' . $last;
}
-sub parse_modes
-{
- my ( $n ) = @_;
- my @args = @{$n};
- my @modes = split '', shift @args;
- my @new_modes=();
- my $t;
- foreach my $c ( @modes ) {
- if (($c eq '-') || ($c eq '+')) {
- $t=$c;
- }
- else {
- if ( defined( grep( /[abdefhIJkloqv]/,($c) ) ) ) { #modes that take args
- push (@new_modes, [$t.$c, shift @args]);
- }
- elsif ( defined( grep( /[cgijLmnpPQrRstz]/, ($c) ) ) ) {
- push (@new_modes, [$t.$c]);
- }
- else {
- die "Unknown mode $c !\n";
- }
- }
- }
- return \@new_modes;
-}
-
sub leq {
my ($s1, $s2) = @_;
return (lc $s1 eq lc $s2);
@@ -148,18 +130,4 @@ sub seq {
return ($n1 eq $n2);
}
-sub Util::killsub {
- undef &cs;
- undef &hostip;
- undef &o_send;
- undef &doQueue;
- undef &flood_add;
- undef &flood_process;
- undef &getAlert;
- undef &commaAndify;
- undef &parse_modes;
- undef &leq;
- undef &seq;
-}
-
return 1;
diff --git a/modules/xml.pl b/modules/xml.pl
index 4a4d702..c497ffc 100644
--- a/modules/xml.pl
+++ b/modules/xml.pl
@@ -1,7 +1,9 @@
+package ASM::XML;
use warnings;
use strict;
use XML::Simple qw(:strict);
+use IO::All;
$::xs1 = XML::Simple->new( KeyAttr => ['id'], Cache => [ qw/storable memcopy/ ]);
@@ -52,9 +54,4 @@ sub writeSettings {
$::xs1->XMLout($::settings, RootName => 'settings', GroupTags => { altnicks => 'altnick', server => 'host', autojoins => 'autojoin' }, NoAttr => 1) > io("$p/settings.xml");
}
-sub Xml::killsub {
- undef &readXML;
- undef &writeXML;
-}
-
return 1;