3
0
mirror of https://github.com/pragma-/pbot.git synced 2025-02-13 03:51:01 +01:00

NickList now tracks user modes as metadata

This commit is contained in:
Pragmatic Software 2018-08-03 12:31:45 -07:00
parent f18426be16
commit 772ea03ddf
2 changed files with 110 additions and 28 deletions

View File

@ -196,7 +196,7 @@ sub on_mode {
($nick, $user, $host) = $self->normalize_hostmask($nick, $user, $host); ($nick, $user, $host) = $self->normalize_hostmask($nick, $user, $host);
my ($mode, $modifier); my ($mode, $mode_char, $modifier);
my $i = 0; my $i = 0;
my $target; my $target;
@ -209,6 +209,7 @@ sub on_mode {
} }
$mode = $modifier . $char; $mode = $modifier . $char;
$mode_char = $char;
$target = $event->{event}->{args}[++$i]; $target = $event->{event}->{args}[++$i];
$self->{pbot}->{logger}->log("Got mode: source: $nick!$user\@$host, mode: $mode, target: " . (defined $target ? $target : "(undef)") . ", channel: $channel\n"); $self->{pbot}->{logger}->log("Got mode: source: $nick!$user\@$host, mode: $mode, target: " . (defined $target ? $target : "(undef)") . ", channel: $channel\n");
@ -217,6 +218,14 @@ sub on_mode {
$self->{pbot}->{bantracker}->track_mode("$nick!$user\@$host", $mode, $target, $channel); $self->{pbot}->{bantracker}->track_mode("$nick!$user\@$host", $mode, $target, $channel);
} }
if (defined $target) {
if ($modifier eq '-') {
$self->{pbot}->{nicklist}->delete_meta($channel, $target, "+$mode_char");
} else {
$self->{pbot}->{nicklist}->set_meta($channel, $target, $mode, 1);
}
}
if (defined $target && $target eq $event->{conn}->nick) { # bot targeted if (defined $target && $target eq $event->{conn}->nick) { # bot targeted
if ($mode eq "+o") { if ($mode eq "+o") {
$self->{pbot}->{logger}->log("$nick opped me in $channel\n"); $self->{pbot}->{logger}->log("$nick opped me in $channel\n");
@ -258,7 +267,7 @@ sub on_mode {
} }
} }
elsif ($mode eq "+q") { elsif ($mode eq "+q") {
if($nick ne $event->{conn}->nick) { if ($nick ne $event->{conn}->nick) { # bot muted
if ($self->{pbot}->{chanops}->can_gain_ops($channel)) { if ($self->{pbot}->{chanops}->can_gain_ops($channel)) {
$self->{pbot}->{chanops}->{unmute_timeout}->hash->{$channel}->{$target}{timeout} = gettimeofday + $self->{pbot}->{registry}->get_value('bantracker', 'mute_timeout'); $self->{pbot}->{chanops}->{unmute_timeout}->hash->{$channel}->{$target}{timeout} = gettimeofday + $self->{pbot}->{registry}->get_value('bantracker', 'mute_timeout');
$self->{pbot}->{chanops}->{unmute_timeout}->save; $self->{pbot}->{chanops}->{unmute_timeout}->save;

View File

@ -54,7 +54,20 @@ sub initialize {
sub dumpnicks { sub dumpnicks {
my ($self, $from, $nick, $user, $host, $arguments) = @_; my ($self, $from, $nick, $user, $host, $arguments) = @_;
my $nicklist = Dumper($self->{nicklist}); my $nicklist;
if (not length $arguments) {
$nicklist = Dumper($self->{nicklist});
} else {
my @args = split / /, $arguments;
if (@args == 1) {
$nicklist = Dumper($self->{nicklist}->{$arguments});
} else {
$nicklist = Dumper($self->{nicklist}->{$args[0]}->{$args[1]});
}
}
return $nicklist; return $nicklist;
} }
@ -104,6 +117,51 @@ sub get_channels {
return \@channels; return \@channels;
} }
sub set_meta {
my ($self, $channel, $nick, $key, $value) = @_;
$channel = lc $channel;
$nick = lc $nick;
if (not exists $self->{nicklist}->{$channel} or not exists $self->{nicklist}->{$channel}->{$nick}) {
$self->{pbot}->{logger}->log("Nicklist: Attempt to set invalid meta ($key => $value) for $nick in $channel.\n");
return 0;
}
$self->{nicklist}->{$channel}->{$nick}->{$key} = $value;
return 1;
}
sub delete_meta {
my ($self, $channel, $nick, $key) = @_;
$channel = lc $channel;
$nick = lc $nick;
if (not exists $self->{nicklist}->{$channel}
or not exists $self->{nicklist}->{$channel}->{$nick}
or not exists $self->{nicklist}->{$channel}->{$nick}->{$key}) {
return undef;
}
return delete $self->{nicklist}->{$channel}->{$nick}->{$key};
}
sub get_meta {
my ($self, $channel, $nick, $key) = @_;
$channel = lc $channel;
$nick = lc $nick;
if (not exists $self->{nicklist}->{$channel}
or not exists $self->{nicklist}->{$channel}->{$nick}
or not exists $self->{nicklist}->{$channel}->{$nick}->{$key}) {
return undef;
}
return $self->{nicklist}->{$channel}->{$nick}->{$key};
}
sub is_present_any_channel { sub is_present_any_channel {
my ($self, $nick) = @_; my ($self, $nick) = @_;
@ -191,8 +249,21 @@ sub on_namreply {
my ($channel, $nicks) = ($event->{event}->{args}[2], $event->{event}->{args}[3]); my ($channel, $nicks) = ($event->{event}->{args}[2], $event->{event}->{args}[3]);
foreach my $nick (split ' ', $nicks) { foreach my $nick (split ' ', $nicks) {
$nick =~ s/^[@+%]//; # remove OP/Voice/etc indicator from nick my $stripped_nick = $nick;
$self->add_nick($channel, $nick); $stripped_nick =~ s/^[@+%]//g; # remove OP/Voice/etc indicator from nick
$self->add_nick($channel, $stripped_nick);
if ($nick =~ m/\@/) {
$self->set_meta($channel, $stripped_nick, '+o', 1);
}
if ($nick =~ m/\+/) {
$self->set_meta($channel, $stripped_nick, '+v', 1);
}
if ($nick =~ m/\%/) {
$self->set_meta($channel, $stripped_nick, '+h', 1);
}
} }
return 0; return 0;
@ -245,8 +316,10 @@ sub on_nickchange {
foreach my $channel (keys %{ $self->{nicklist} }) { foreach my $channel (keys %{ $self->{nicklist} }) {
if ($self->is_present($channel, $nick)) { if ($self->is_present($channel, $nick)) {
$self->remove_nick($channel, $nick); my $meta = delete $self->{nicklist}->{$channel}->{lc $nick};
$self->add_nick($channel, $newnick); $meta->{nick} = $newnick;
$meta->{timestamp} = gettimeofday;
$self->{nicklist}->{$channel}->{lc $newnick} = $meta;
} }
} }