summaryrefslogtreecommitdiffstats
path: root/modules/event.pl
diff options
context:
space:
mode:
Diffstat (limited to 'modules/event.pl')
-rw-r--r--modules/event.pl145
1 files changed, 130 insertions, 15 deletions
diff --git a/modules/event.pl b/modules/event.pl
index f9888e5..a0b3385 100644
--- a/modules/event.pl
+++ b/modules/event.pl
@@ -70,6 +70,8 @@ sub new
$conn->add_handler('banlist', \&on_banlist);
$conn->add_handler('dcc_open', \&dcc_open);
$conn->add_handler('chat', \&on_dchat);
+ $conn->add_handler('channelmodeis', \&on_channelmodeis);
+ $conn->add_handler('quietlist', \&on_quietlist);
$conn->add_handler('pong', \&on_pong);
bless($self);
return $self;
@@ -132,8 +134,9 @@ sub on_connect {
my ($conn, $event) = @_; # need to check for no services
$conn->sl('MODE AntiSpamMeta +Q');
if (lc $event->{args}->[0] ne lc $::settings->{nick}) {
- $conn->privmsg( 'NickServ', "ghost $::settings->{nick} $::settings->{pass}" );
- $conn->privmsg( 'NickServ', "release $::settings->{nick} $::settings->{pass}" );
+ $conn->privmsg( 'NickServ', "regain $::settings->{nick} $::settings->{pass}" );
+# $conn->privmsg( 'NickServ', "ghost $::settings->{nick} $::settings->{pass}" );
+# $conn->privmsg( 'NickServ', "release $::settings->{nick} $::settings->{pass}" );
}
$conn->sl('CAP REQ :extended-join multi-prefix account-notify'); #god help you if you try to use this bot off freenode
}
@@ -150,6 +153,8 @@ sub on_join {
$::synced{$chan} = 0;
unless ( @::syncqueue ) {
$conn->sl('who ' . $chan . ' %tcnuhra,314');
+ $conn->sl('mode ' . $chan);
+ $conn->sl('mode ' . $chan . ' bq');
}
push @::syncqueue, $chan;
}
@@ -211,7 +216,9 @@ sub on_msg
my ($conn, $event) = @_;
$::commander->command($conn, $event);
print strftime("%F %T ", gmtime) . "(msg) " . $event->{from} . " - " . $event->{args}->[0] . "\n";
- $conn->privmsg('#antispammeta', $event->{from} . ' told me: ' . $event->{args}->[0]);
+ if (ASM::Util->notRestricted($event->{nick}, "nomsgs")) {
+ $conn->privmsg('#antispammeta', $event->{from} . ' told me: ' . $event->{args}->[0]);
+ }
}
sub on_public
@@ -259,7 +266,7 @@ sub on_quit
}
$event->{to} = \@channels;
$::db->logg( $event );
- if (($::netsplit == 0) && ($event->{args}->[0] eq "*.net *.split")) { #special, netsplit situation
+ if (($::netsplit == 0) && ($event->{args}->[0] eq "*.net *.split") && (lc $event->{nick} ne 'chanserv')) { #special, netsplit situation
$conn->privmsg("#antispammeta", "Entering netsplit mode - JOIN and QUIT inspection will be disabled for 60 minutes");
$::netsplit = 1;
$conn->schedule(60*60, sub { $::netsplit = 0; $conn->privmsg('#antispammeta', 'Returning to regular operation'); });
@@ -301,21 +308,25 @@ sub irc_topic {
$::inspector->inspect($conn, $event) if ($event->{format} ne 'server');
if ($event->{format} eq 'server')
{
+ my $chan = lc $event->{args}->[1];
if ($event->{type} eq 'topic')
{
- $::sc{lc $event->{args}->[1]}{topic}{text} = $event->{args}->[2];
+ $::sc{$chan}{topic}{text} = $event->{args}->[2];
}
elsif ($event->{type} eq 'topicinfo')
{
- $::sc{lc $event->{args}->[1]}{topic}{time} = $event->{args}->[3];
- $::sc{lc $event->{args}->[1]}{topic}{by} = $event->{args}->[2];
+ $::sc{$chan}{topic}{time} = $event->{args}->[3];
+ $::sc{$chan}{topic}{by} = $event->{args}->[2];
}
}
else
{
if ($event->{type} eq 'topic')
{
- $::sc{lc $event->{to}->[0]}{topic}{text} = $event->{args}->[0];
+ my $chan = lc $event->{args}->[1];
+ $::sc{$chan}{topic}{text} = $event->{args}->[0];
+ $::sc{$chan}{topic}{time} = time;
+ $::sc{$chan}{topic}{by} = $event->{from};
}
$::log->logg($event);
$::db->logg( $event );
@@ -381,11 +392,11 @@ sub parse_modes
if (($c eq '-') || ($c eq '+')) {
$t=$c;
}
- else {
- if ( defined( grep( /[abdefhIJkloqv]/,($c) ) ) ) { #modes that take args
+ else { #eIbq,k,flj,CFLMPQcgimnprstz
+ if ( grep( /[eIbqkfljov]/,($c) ) ) { #modes that take args
push (@new_modes, [$t.$c, shift @args]);
}
- elsif ( defined( grep( /[cgijLmnpPQrRstz]/, ($c) ) ) ) {
+ elsif ( grep( /[CFLMPQcgimnprstz]/, ($c) ) ) {
push (@new_modes, [$t.$c]);
}
else {
@@ -396,6 +407,29 @@ sub parse_modes
return \@new_modes;
}
+sub on_channelmodeis
+{
+ my ($conn, $event) = @_;
+ my $chan = lc $event->{args}->[1];
+ my @temp = @{$event->{args}};
+ shift @temp; shift @temp;
+ my @modes = @{parse_modes(\@temp)};
+ foreach my $line ( @modes ) {
+ my @ex = @{$line};
+ my ($what, $mode) = split (//, $ex[0]);
+ if ($what eq '+') {
+ if (defined($ex[1])) {
+ push @{$::sc{$chan}{modes}}, $mode . ' ' . $ex[1];
+ } else {
+ push @{$::sc{$chan}{modes}}, $mode;
+ }
+ } else {
+ my @modes = grep {!/^$mode/} @{$::sc{$chan}{modes}};
+ $::sc{$chan}{modes} = \@modes;
+ }
+ }
+}
+
sub on_mode
{
my ($conn, $event) = @_;
@@ -416,11 +450,79 @@ sub on_mode
elsif ( $ex[0] eq '-v' ) {
$::sc{$chan}{users}{lc $ex[1]}{voice}=0;
}
+ elsif ( $ex[0] eq '+b') {
+ $::sc{$chan}{bans}{$ex[1]} = { bannedBy => $event->{from}, bannedOn => time };
+ }
+ elsif ( $ex[0] eq '-b') {
+ delete $::sc{$chan}{bans}{$ex[1]};
+ }
+ elsif ( $ex[0] eq '+q') {
+ $::sc{$chan}{quiets}{$ex[1]} = { bannedBy => $event->{from}, bannedOn => time };
+ }
+ elsif ( $ex[0] eq '-q') {
+ delete $::sc{$chan}{quiets}{$ex[1]};
+ }
+ else {
+ my ($what, $mode) = split (//, $ex[0]);
+ if ($what eq '+') {
+ push @{$::sc{$chan}{modes}}, $mode . ' ' . $ex[1];
+ } else {
+ my @modes = grep {!/^$mode/} @{$::sc{$chan}{modes}};
+ $::sc{$chan}{modes} = \@modes;
+ }
+ if ( ($ex[0] eq '+r') && (! defined($::watchRegged{$chan})) ) {
+ $::watchRegged{$chan} = 1;
+ $conn->schedule(60*45, sub { checkRegged($conn, $chan); });
+ }
+ }
}
$::log->logg($event);
}
}
+sub checkRegged
+{
+ my ($conn, $chan) = @_;
+ if (grep {/r/} @{$::sc{$chan}{modes}}) {
+ my $tgt = $chan;
+ my $risk = "debug";
+ my $hilite=ASM::Util->commaAndify(ASM::Util->getAlert($tgt, $risk, 'hilights'));
+ my $txtz ="\x03" . $::RCOLOR{$::RISKS{$risk}} . "\u$risk\x03 risk threat [\x02$chan\x02] - channel appears to still be +r after 45 minutes; $hilite";
+ my @tgts = ASM::Util->getAlert($tgt, $risk, 'msgs');
+ ASM::Util->sendLongMsg($conn, \@tgts, $txtz)
+ }
+ delete $::watchRegged{$chan};
+}
+
+sub on_banlist
+{
+ my ($conn, $event) = @_;
+# 'args' => [
+# 'AntiSpamMetaBeta',
+# '#antispammeta',
+# 'test!*@*',
+# 'fn-troll!icxcnika@freenode/weird-exception/network-troll/afterdeath',
+# '1344235684'
+# ],
+ my ($me, $chan, $ban, $banner, $bantime) = @{$event->{args}};
+ $::sc{lc $chan}{bans}{$ban} = { bannedBy => $banner, bannedOn => $bantime };
+}
+
+sub on_quietlist
+{
+ my ($conn, $event) = @_;
+# 'args' => [
+# 'AntiSpamMetaBeta',
+# '#antispammeta',
+# 'q',
+# 'loltest!*@*',
+# 'fn-troll!icxcnika@freenode/weird-exception/network-troll/afterdeath',
+# '1344755722'
+# ],
+ my ($me, $chan, $mode, $ban, $banner, $bantime) = @{$event->{args}};
+ $::sc{lc $chan}{quiets}{$ban} = { bannedBy => $banner, bannedOn => $bantime };
+}
+
sub on_ctcp
{
my ($conn, $event) = @_;
@@ -481,6 +583,23 @@ sub on_whoxover
$::synced{$event->{args}->[1]} = 1;
if (defined($chan) ){
$conn->sl('who ' . $chan . ' %tcnuhra,314');
+ $conn->sl('mode ' . $chan);
+ $conn->sl('mode ' . $chan . ' bq');
+ } else {
+ my $size = `ps -p $$ h -o size`;
+ my $cputime = `ps -p $$ h -o time`;
+ chomp $size; chomp $cputime;
+ $conn->privmsg("#antispammeta", "Finished syncing after " . (time - $::starttime) . " seconds. " .
+ "I'm tracking " . (scalar (keys %::sn)) . " nicks" .
+ " across " . (scalar (keys %::sc)) . " tracked channels." .
+ " I'm using " . $size . "KB of RAM" .
+ " and have used " . $cputime . " of CPU time.");
+ my %x = ();
+ foreach my $c (@{$::settings->{autojoins}}) { $x{$c} = 1; }
+ foreach my $cx (keys %::sc) { delete $x{$cx}; }
+ if (scalar (keys %x)) {
+ $conn->privmsg("#antispammeta", "Syncing appears to have failed for " . ASM::Util->commaAndify(keys %x));
+ }
}
}
@@ -491,10 +610,6 @@ sub on_whofuckedup
print "on_whofuckedup called!\n";
}
}
-sub on_banlist
-{
- my ($conn, $event) = @_;
-}
sub on_bannedfromchan {
my ($conn, $event) = @_;