diff options
| author | 2007-06-28 23:48:48 +0000 | |
|---|---|---|
| committer | 2007-06-28 23:48:48 +0000 | |
| commit | 6907da0a5da3d45a91c3ac4893e5b890200b27eb (patch) | |
| tree | 5a61df15a30b6d0aefa6c6e72e7eab2d8f03de1f /modules | |
| parent | 638d9eae9e63755e26f9843985597e6f1c7c5f8e (diff) | |
modularized stuff, fixed alert logic, simplified stuff, updated TODO
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/classes.pl | 3 | ||||
| -rw-r--r-- | modules/command.pl | 10 | ||||
| -rw-r--r-- | modules/event.pl | 58 | ||||
| -rw-r--r-- | modules/inspect.pl | 19 | ||||
| -rw-r--r-- | modules/log.pl | 32 | ||||
| -rw-r--r-- | modules/mysql.pl | 49 | ||||
| -rw-r--r-- | modules/services.pl | 2 | ||||
| -rw-r--r-- | modules/xml.pl | 1 |
8 files changed, 81 insertions, 93 deletions
diff --git a/modules/classes.pl b/modules/classes.pl index c2a414f..8323a06 100644 --- a/modules/classes.pl +++ b/modules/classes.pl @@ -1,10 +1,9 @@ use strict; use warnings; -use Data::Dumper; -#package Classes; sub Classes::dnsbl { our (%aonx, $id, %dct, $event, $chan, $rev); + return unless index($event->{host}, '/') == -1; if (defined $rev) { my $iaddr = hostip( "$rev$aonx{$id}{content}" ); my @dnsbl = unpack( 'C4', $iaddr ) if defined $iaddr; diff --git a/modules/command.pl b/modules/command.pl index 41d65fb..fe299fd 100644 --- a/modules/command.pl +++ b/modules/command.pl @@ -12,11 +12,11 @@ sub do_command foreach my $command ( @{$::commands->{command}} ) { if (defined($command->{flag})) { - next unless defined($::xusers->{$nick}); - next unless defined($::xusers->{$nick}->{flags}); - next unless (grep {$_ eq $command->{flag}} split('', $::xusers->{$nick}->{flags})); - if ($::xusers->{$nick}->{host} ne 'IDENTIFY') { - next unless leq($::xusers->{$nick}->{host}, $event->{host}); + next unless defined($::users->{person}->{$nick}); + next unless defined($::users->{person}->{$nick}->{flags}); + next unless (grep {$_ eq $command->{flag}} split('', $::users->{person}->{$nick}->{flags})); + if ($::users->{person}->{$nick}->{host} ne 'IDENTIFY') { + next unless leq($::users->{person}->{$nick}->{host}, $event->{host}); } else { if ( $cmd =~ /$command->{cmd}/ ){ diff --git a/modules/event.pl b/modules/event.pl index 3754190..42a0114 100644 --- a/modules/event.pl +++ b/modules/event.pl @@ -43,7 +43,7 @@ sub on_join { $conn->sl("whois $nick"); } } - logg( $event ); + $::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]; @@ -66,7 +66,7 @@ sub on_part my ($conn, $event) = @_; inspect( $conn, $event ); my $nick = lc $event->{nick}; - logg( $event ); + $::log->logg( $event ); if (defined($::sn{$nick}) && defined($::sn{$nick}->{mship})) { my @mship = @{$::sn{$nick}->{mship}}; @mship = grep { lc $_ ne lc $event->{to}->[0] } @mship; @@ -96,7 +96,7 @@ sub on_public { my ($conn, $event) = @_; inspect( $conn, $event ); - logg( $event ); + $::log->logg( $event ); do_command( $conn, $event ) } @@ -104,7 +104,7 @@ sub on_notice { my ($conn, $event) = @_; inspect( $conn, $event ); - logg( $event ); + $::log->logg( $event ); doServices($conn, $event); } @@ -126,7 +126,7 @@ sub on_quit $event->{to} = \@channels; delete($::sn{lc $event->{nick}}); inspect( $conn, $event ); - logg ( $event ); + $::log->logg ( $event ); } sub blah @@ -176,7 +176,7 @@ sub irc_topic { { $::sc{lc $event->{to}->[0]}{topic}{text} = $event->{args}->[0]; } - logg($event); + $::log->logg($event); } } @@ -196,7 +196,7 @@ sub on_nick { delete( $::sn{lc $event->{nick}}); $event->{to} = \@channels; inspect($conn, $event); - logg($event) + $::log->logg($event) } sub on_kick { @@ -205,7 +205,7 @@ sub on_kick { $conn->join($event->{args}->[0]); } my $nick = lc $event->{to}->[0]; - logg( $event ); + $::log->logg( $event ); my @mship = @{$::sn{$nick}->{mship}}; @mship = grep { lc $_ ne lc $event->{args}->[0] } @mship; if ( @mship ) { @@ -250,7 +250,7 @@ sub on_mode $::sc{$chan}{users}{lc $ex[1]}{voice}=0; } } - logg($event); + $::log->logg($event); } } @@ -330,49 +330,9 @@ sub on_whoreply $::sc{lc $chan}{users}{lc $nick}{voice} = $voice; } -#<<< :kubrick.freenode.net 311 AntiSpamMeta AfterDeath i=icxcnika atheme/troll/about.linux.afterdeath * :[[User:WHeimbigner]] -#Trying to handle event 'whoisuser'. -#Handler for 'whoisuser' called. -#<<< :kubrick.freenode.net 319 AntiSpamMeta AfterDeath :#nslu2-general @#bash @##asb-testing +#vandalism-en-wp +#thetestwiki #arbchat #wikipedia-social #wikipedia-en #wikimedia-stewards #wikimedia-irc @##krypt77 #wikipedia #freenode #hyperion ##linux #gentoo #debian ##windows #defocus #atheme.org #freenode-dev +##asb-nexus #houseofhack ##linux-ops @#baadf00d #wikimedia-ops #ubuntu ##socialites -#Trying to handle event 'whoischannels'. -#Handler for 'whoischannels' called. -#<<< :kubrick.freenode.net 312 AntiSpamMeta AfterDeath irc.freenode.net :http://freenode.net/ -#Trying to handle event 'whoisserver'. -#Handler for 'whoisserver' called. -#<<< :kubrick.freenode.net 320 AntiSpamMeta AfterDeath :is identified to services -#Trying to handle event 'whoisvworld'. -#Handler for 'whoisvworld' called. -#<<< :kubrick.freenode.net 318 AntiSpamMeta afterdeath :End of /WHOIS list. -#Trying to handle event 'endofwhois'. -#Handler for 'endofwhois' called. - - - sub on_bannedfromchan { my ($conn, $event) = @_; $conn->privmsg('ChanServ', "unban $event->{args}->[1]"); } -sub Event::killsub { - undef &on_connect; - undef &on_join; - undef &on_part; - undef &on_msg; - undef &on_notice; - undef &on_errnickinuse; - undef &on_quit; - undef &on_names; - undef &on_nick; - undef &on_kick; - undef &on_mode; - undef &on_ctcp; - undef &on_bannedfromchan; - undef &blah; - undef &irc_users; - undef &irc_topic; - undef &whois_identified; - undef &whois_end; - undef &on_public; -} - return 1; diff --git a/modules/inspect.pl b/modules/inspect.pl index 666de29..fc66215 100644 --- a/modules/inspect.pl +++ b/modules/inspect.pl @@ -3,8 +3,7 @@ use strict; use List::Util qw(first); -#my @ignored = (); -@::ignored = (); +%::ignored = (); sub inspect { our ($conn, $event) = @_; @@ -23,9 +22,9 @@ sub inspect { $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? - foreach ( @::ignored ) { - return if (lc $event->{nick} eq $_); - } +# foreach ( @::ignored ) { +# return if (lc $event->{nick} eq $_); +# } foreach $chan ( @{$event->{to}} ) { next unless $chan =~ /^#/; %conx = defined($::channels->{channel}->{lc $chan}->{event}) ? %{$::channels->{channel}->{lc $chan}->{event}} : (); @@ -44,7 +43,7 @@ sub inspect { delete $dct{$_} foreach @override; foreach $chan (@{$event->{to}}) { foreach $id ( keys %dct ) { - sql_record($chan, $event->{nick}, $event->{user}, $event->{host}, $::sn{lc $event->{nick}}->{gecos}, $dct{$id}{risk}, $id, $dct{$id}{reason}); + $::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')); @@ -61,9 +60,11 @@ sub inspect { $conn->schedule(int($dct{$id}{time}), sub { print "Timer called!\n"; o_send($lconn,$lunmode); }); } } - $conn->privmsg($_, $txtz) foreach getAlert($chan, $dct{$id}{risk}, 'msgs'); - push(@::ignored, lc $event->{nick}); - $conn->schedule(15, sub { @::ignored = grep { lc $_ ne lc $nick } @::ignored; }); + unless (defined($::ignored{lc $event->{nick}}) && ($::ignored{lc $event->{nick}} >= $::RISKS{$dct{$id}{risk}})) { + $conn->privmsg($_, $txtz) foreach getAlert($chan, $dct{$id}{risk}, 'msgs'); + $::ignored{lc $nick} = $::RISKS{$dct{$id}{risk}}; + $conn->schedule(15, sub { delete($::ignored{lc $nick})}); + } } } } diff --git a/modules/log.pl b/modules/log.pl index 6381110..19b44b3 100644 --- a/modules/log.pl +++ b/modules/log.pl @@ -1,19 +1,35 @@ use warnings; use strict; +package ASM::Log; + use String::Interpolate qw(interpolate); +use IO::All; +use POSIX qw(strftime); +use Data::Dumper; + +sub new +{ + my $module = shift; + my $config = shift; + my $self = {}; + $self->{CONFIG} = $config; + bless($self); + return $self; +} sub logg { + my $self = shift; my ($event) = @_; + my $cfg = $self->{CONFIG}; my @chans = @{$event->{to}}; - my $fh; @chans = ( $event->{args}->[0] ) if ($event->{type} eq 'kick'); - my @time = ($::settings->{log}->{zone} eq 'local') ? localtime : gmtime; - foreach my $chan ( @chans) + my @time = ($cfg->{zone} eq 'local') ? localtime : gmtime; + foreach my $chan ( @chans ) { $chan = lc $chan; - io(interpolate($::settings->{log}->{dir}))->mkpath; + io(interpolate($cfg->{dir}))->mkpath; $_=''; $_ = "<$event->{nick}> $event->{args}->[0]" if $event->{type} eq 'public'; $_ = "*** $event->{nick} has joined $chan" if $event->{type} eq 'join'; @@ -26,13 +42,9 @@ sub logg $_ = "*** $event->{nick} sets mode: ".join(" ",@{$event->{args}}) if $event->{type} eq 'mode'; $_ = "*** $event->{nick} changes topic to \"$event->{args}->[0]\"" if $event->{type} eq 'topic'; print Dumper($event) if ($_ eq ''); - $_ = interpolate(strftime($::settings->{log}->{timefmt}, @time)) . $_ . "\n" unless $_ eq ''; - $_ >> io(interpolate($::settings->{log}->{dir}).'/'.interpolate(strftime($::settings->{log}->{filefmt}, @time))) unless ($_ eq ''); + $_ = interpolate(strftime($cfg->{timefmt}, @time)) . $_ . "\n" unless $_ eq ''; + $_ >> io(interpolate($cfg->{dir}).'/'.interpolate(strftime($cfg->{filefmt}, @time))) unless ($_ eq ''); } } -sub Log::killsub { - undef &logg; -} - return 1; diff --git a/modules/mysql.pl b/modules/mysql.pl index 463dbaf..2f96410 100644 --- a/modules/mysql.pl +++ b/modules/mysql.pl @@ -1,30 +1,47 @@ +package ASM::DB; + use warnings; use strict; use DBI; -sub sql_connect -{ - $::dbh = DBI->connect("DBI:mysql:database=$::mysql->{db};host=$::mysql->{host};port=$::mysql->{port}", - $::mysql->{user}, $::mysql->{pass}); - $::dbh->{mysql_auto_reconnect} = 1; +sub new { + my $module = shift; + my ($db, $host, $port, $user, $pass, $table) = @_; + my $self = {}; + $self->{DBH} = DBI->connect("DBI:mysql:database=$db;host=$host;port=$port", $user, $pass); + $self->{DBH}->{mysql_auto_reconnect} = 1; + $self->{TABLE} = $table; + bless($self); + return $self; } -sub sql_record +#sub sql_connect +#{ +# $::dbh = DBI->connect("DBI:mysql:database=$::mysql->{db};host=$::mysql->{host};port=$::mysql->{port}", +# $::mysql->{user}, $::mysql->{pass}); +# $::dbh->{mysql_auto_reconnect} = 1; +#} + +sub record { + my $self = shift; my ($channel, $nick, $user, $host, $gecos, $level, $id, $reason) = @_; - $::dbh->do("INSERT INTO $::mysql->{table} (channel, nick, user, host, gecos, level, id, reason) VALUES (" . - $::dbh->quote($channel) . ", " . $::dbh->quote($nick) . ", " . $::dbh->quote($user) . - ", " . $::dbh->quote($host) . ", " . $::dbh->quote($gecos) . ", " . $::dbh->quote($level) . ", " . - $::dbh->quote($id) . ", " . $::dbh->quote($reason) . ");"); + my $dbh = $self->{DBH}; + $dbh->do("INSERT INTO $self->{TABLE} (channel, nick, user, host, gecos, level, id, reason) VALUES (" . + $dbh->quote($channel) . ", " . $dbh->quote($nick) . ", " . $dbh->quote($user) . + ", " . $dbh->quote($host) . ", " . $dbh->quote($gecos) . ", " . $dbh->quote($level) . ", " . + $dbh->quote($id) . ", " . $dbh->quote($reason) . ");"); } -sub sql_query +sub query { + my $self = shift; my ($channel, $nick, $user, $host) = @_; - $channel = $::dbh->quote($channel); - $nick = $::dbh->quote($nick); - $user = $::dbh->quote($user); - $host = $::dbh->quote($host); + my $dbh = $self->{DBH}; + $channel = $dbh->quote($channel); + $nick = $dbh->quote($nick); + $user = $dbh->quote($user); + $host = $dbh->quote($host); $nick =~ s/\*/%/g; $nick =~ s/_/\\_/g; @@ -37,7 +54,7 @@ sub sql_query $host =~ s/\*/%/g; $host =~ s/_/\\_/g; $host =~ s/\?/_/g; - my $sth = $::dbh->prepare("SELECT * from $::mysql->{table} WHERE channel = $channel and nick like $nick and user like $user and host like $host;"); + my $sth = $dbh->prepare("SELECT * from $self->{TABLE} WHERE channel = $channel and nick like $nick and user like $user and host like $host;"); $sth->execute; my $i = 0; while (my $ref = $sth->fetchrow_arrayref) { diff --git a/modules/services.pl b/modules/services.pl index d110b60..c70b9ca 100644 --- a/modules/services.pl +++ b/modules/services.pl @@ -8,7 +8,7 @@ sub doServices { print "NickServ: $event->{args}->[0]\n"; if ( $event->{args}->[0] eq 'This nickname is owned by someone else' ) { - $conn->privmsg( 'NickServ', "identify $::pass" ); + $conn->privmsg( 'NickServ', "identify $::settings->{pass}" ); } elsif ( $event->{args}->[0] eq 'Password accepted - you are now recognized' ) { diff --git a/modules/xml.pl b/modules/xml.pl index 10158d0..4a4d702 100644 --- a/modules/xml.pl +++ b/modules/xml.pl @@ -13,7 +13,6 @@ sub readXML { GroupTags => { altnicks => 'altnick', server => 'host', autojoins=> 'autojoin' }); $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => [qw/event debug info low medium high/] ); $::users = $::xs1->XMLin( "$p/users.xml", ForceArray => 'person' ); - $::xusers = $::users->{person}; $::commands = $::xs1->XMLin( "$p/commands.xml", ForceArray => [qw/command/]); $::mysql = $::xs1->XMLin( "$p/mysql.xml", ForceArray => [] ); } |
