diff options
| author | 2007-06-29 02:21:38 +0000 | |
|---|---|---|
| committer | 2007-06-29 02:21:38 +0000 | |
| commit | f52c9bd6e6e018ff0c45f1dea4ded2aeb4ae1427 (patch) | |
| tree | 395c0133072d89da4a936e0a180e836997c1cb56 | |
| parent | 6907da0a5da3d45a91c3ac4893e5b890200b27eb (diff) | |
lots of modularization done, needs testing and is unstable
| -rw-r--r-- | TODO | 10 | ||||
| -rw-r--r-- | config-default/commands.xml | 20 | ||||
| -rwxr-xr-x | meta.pl | 66 | ||||
| -rw-r--r-- | modules/actions.pl | 41 | ||||
| -rw-r--r-- | modules/classes.pl | 195 | ||||
| -rw-r--r-- | modules/command.pl | 19 | ||||
| -rw-r--r-- | modules/event.pl | 123 | ||||
| -rw-r--r-- | modules/inspect.pl | 38 | ||||
| -rw-r--r-- | modules/services.pl | 12 | ||||
| -rw-r--r-- | modules/util.pl | 58 | ||||
| -rw-r--r-- | modules/xml.pl | 7 |
11 files changed, 320 insertions, 269 deletions
@@ -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"> @@ -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 ≤ - 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; |
