mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-26 22:09:26 +01:00
NickList: nicklist
command now can accept options for sorting and display
This commit is contained in:
parent
40a2728737
commit
5bb026f33e
123
PBot/NickList.pm
123
PBot/NickList.pm
@ -23,6 +23,8 @@ $Data::Dumper::Sortkeys = 1;
|
|||||||
use Time::HiRes qw/gettimeofday/;
|
use Time::HiRes qw/gettimeofday/;
|
||||||
use Time::Duration qw/concise ago/;
|
use Time::Duration qw/concise ago/;
|
||||||
|
|
||||||
|
use Getopt::Long qw/GetOptionsFromArray/;
|
||||||
|
|
||||||
sub initialize {
|
sub initialize {
|
||||||
my ($self, %conf) = @_;
|
my ($self, %conf) = @_;
|
||||||
$self->{nicklist} = {};
|
$self->{nicklist} = {};
|
||||||
@ -46,39 +48,123 @@ sub initialize {
|
|||||||
|
|
||||||
sub cmd_nicklist {
|
sub cmd_nicklist {
|
||||||
my ($self, $context) = @_;
|
my ($self, $context) = @_;
|
||||||
return "Usage: nicklist <channel> [nick]" if not length $context->{arguments};
|
|
||||||
|
|
||||||
my $nicklist;
|
my $nicklist;
|
||||||
my @args = split / /, $context->{arguments};
|
my $usage = "Usage: nicklist (<channel [nick]> | <nick>) [-sort=nick|host|spoken|join] [-hostmask] [-join]";
|
||||||
|
|
||||||
|
my $getopt_error;
|
||||||
|
local $SIG{__WARN__} = sub {
|
||||||
|
$getopt_error = shift;
|
||||||
|
chomp $getopt_error;
|
||||||
|
};
|
||||||
|
|
||||||
|
Getopt::Long::Configure("bundling_override");
|
||||||
|
|
||||||
|
my $sort_method = 'nick';
|
||||||
|
my $full_hostmask = 0;
|
||||||
|
my $include_join = 0;
|
||||||
|
|
||||||
|
my @args = $self->{pbot}->{interpreter}->split_line($context->{arguments}, strip_quotes => 1);
|
||||||
|
GetOptionsFromArray(
|
||||||
|
\@args,
|
||||||
|
'sort|s=s' => \$sort_method,
|
||||||
|
'hostmask|hm' => \$full_hostmask,
|
||||||
|
'join|j' => \$include_join,
|
||||||
|
);
|
||||||
|
return "$getopt_error; $usage" if defined $getopt_error;
|
||||||
|
|
||||||
|
return $usage if not length $args[0];
|
||||||
|
|
||||||
|
my %sort = (
|
||||||
|
'spoken' => sub {
|
||||||
|
if ($_[1] eq '+') {
|
||||||
|
return $_[0]->{$b}->{timestamp} <=> $_[0]->{$a}->{timestamp};
|
||||||
|
} else {
|
||||||
|
return $_[0]->{$a}->{timestamp} <=> $_[0]->{$b}->{timestamp};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
'join' => sub {
|
||||||
|
if ($_[1] eq '+') {
|
||||||
|
return $_[0]->{$b}->{join} <=> $_[0]->{$a}->{join};
|
||||||
|
} else {
|
||||||
|
return $_[0]->{$a}->{join} <=> $_[0]->{$b}->{join};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
'host' => sub {
|
||||||
|
if ($_[1] eq '+') {
|
||||||
|
return lc $_[0]->{$a}->{host} cmp lc $_[0]->{$b}->{host};
|
||||||
|
} else {
|
||||||
|
return lc $_[0]->{$b}->{host} cmp lc $_[0]->{$a}->{host};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
'nick' => sub {
|
||||||
|
if ($_[1] eq '+') {
|
||||||
|
return lc $_[0]->{$a}->{nick} cmp lc $_[0]->{$b}->{nick};
|
||||||
|
} else {
|
||||||
|
return lc $_[0]->{$b}->{nick} cmp lc $_[0]->{$a}->{nick};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
my $sort_direction = '+';
|
||||||
|
if ($sort_method =~ s/^(\+|\-)//) {
|
||||||
|
$sort_direction = $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (not exists $sort{$sort_method}) {
|
||||||
|
return "Invalid sort method '$sort_method'; valid methods are: " . join(', ', sort keys %sort);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($args[0] !~ /^#/) {
|
||||||
|
unshift @args, $context->{from};
|
||||||
|
}
|
||||||
|
|
||||||
if (@args == 1) {
|
if (@args == 1) {
|
||||||
if (not exists $self->{nicklist}->{lc $context->{arguments}}) {
|
if (not exists $self->{nicklist}->{lc $args[0]}) {
|
||||||
return "No nicklist for $context->{arguments}.";
|
return "No nicklist for channel $args[0].";
|
||||||
}
|
}
|
||||||
|
|
||||||
my $count = keys %{$self->{nicklist}->{lc $context->{arguments}}};
|
my $count = keys %{$self->{nicklist}->{lc $args[0]}};
|
||||||
$nicklist = "$count nick" . ($count == 1 ? '' : 's') . " in $context->{arguments}:\n";
|
$nicklist = "$count nick" . ($count == 1 ? '' : 's') . " in $args[0]:\n";
|
||||||
|
|
||||||
|
foreach my $entry (sort { $sort{$sort_method}->($self->{nicklist}->{lc $args[0]}, $sort_direction) } keys %{$self->{nicklist}->{lc $args[0]}}) {
|
||||||
|
if ($full_hostmask) {
|
||||||
|
$nicklist .= " $self->{nicklist}->{lc $args[0]}->{$entry}->{hostmask}";
|
||||||
|
} else {
|
||||||
|
$nicklist .= " $self->{nicklist}->{lc $args[0]}->{$entry}->{nick}";
|
||||||
|
}
|
||||||
|
|
||||||
foreach my $entry (sort keys %{$self->{nicklist}->{lc $context->{arguments}}}) {
|
|
||||||
$nicklist .= " $self->{nicklist}->{lc $context->{arguments}}->{$entry}->{hostmask}";
|
|
||||||
my $sep = ': ';
|
my $sep = ': ';
|
||||||
|
|
||||||
if ($self->{nicklist}->{lc $context->{arguments}}->{$entry}->{timestamp} > 0) {
|
if ($self->{nicklist}->{lc $args[0]}->{$entry}->{timestamp} > 0) {
|
||||||
my $duration = concise ago (gettimeofday - $self->{nicklist}->{lc $context->{arguments}}->{$entry}->{timestamp});
|
my $duration = concise ago (gettimeofday - $self->{nicklist}->{lc $args[0]}->{$entry}->{timestamp});
|
||||||
$nicklist .= "${sep}last spoken $duration";
|
$nicklist .= "${sep}last spoken $duration";
|
||||||
$sep = ', ';
|
$sep = ', ';
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach my $key (sort keys %{$self->{nicklist}->{lc $context->{arguments}}->{$entry}}) {
|
if ($include_join and $self->{nicklist}->{lc $args[0]}->{$entry}->{join} > 0) {
|
||||||
next if grep { $key eq $_ } qw/nick user host timestamp hostmask/;
|
my $duration = concise ago (gettimeofday - $self->{nicklist}->{lc $args[0]}->{$entry}->{join});
|
||||||
$nicklist .= "$sep$key => $self->{nicklist}->{lc $context->{arguments}}->{$entry}->{$key}";
|
$nicklist .= "${sep}joined $duration";
|
||||||
|
$sep = ', ';
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $key (sort keys %{$self->{nicklist}->{lc $args[0]}->{$entry}}) {
|
||||||
|
next if grep { $key eq $_ } qw/nick user host join timestamp hostmask/;
|
||||||
|
if ($self->{nicklist}->{lc $args[0]}->{$entry}->{$key} == 1) {
|
||||||
|
$nicklist .= "$sep$key";
|
||||||
|
} else {
|
||||||
|
$nicklist .= "$sep$key => $self->{nicklist}->{lc $args[0]}->{$entry}->{$key}";
|
||||||
|
}
|
||||||
$sep = ', ';
|
$sep = ', ';
|
||||||
}
|
}
|
||||||
$nicklist .= "\n";
|
$nicklist .= "\n";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (not exists $self->{nicklist}->{lc $args[0]}) {
|
if (not exists $self->{nicklist}->{lc $args[0]}) {
|
||||||
return "No nicklist for $args[0].";
|
return "No nicklist for channel $args[0].";
|
||||||
} elsif (not exists $self->{nicklist}->{lc $args[0]}->{lc $args[1]}) {
|
} elsif (not exists $self->{nicklist}->{lc $args[0]}->{lc $args[1]}) {
|
||||||
return "No such nick $args[1] in channel $args[0].";
|
return "No such nick $args[1] in channel $args[0].";
|
||||||
}
|
}
|
||||||
@ -92,8 +178,14 @@ sub cmd_nicklist {
|
|||||||
$sep = ', ';
|
$sep = ', ';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($self->{nicklist}->{lc $args[0]}->{lc $args[1]}->{join} > 0) {
|
||||||
|
my $duration = concise ago (gettimeofday - $self->{nicklist}->{lc $args[0]}->{lc $args[1]}->{join});
|
||||||
|
$nicklist .= "${sep}joined $duration";
|
||||||
|
$sep = ', ';
|
||||||
|
}
|
||||||
|
|
||||||
foreach my $key (sort keys %{$self->{nicklist}->{lc $args[0]}->{lc $args[1]}}) {
|
foreach my $key (sort keys %{$self->{nicklist}->{lc $args[0]}->{lc $args[1]}}) {
|
||||||
next if grep { $key eq $_ } qw/nick user host timestamp hostmask/;
|
next if grep { $key eq $_ } qw/nick user host join timestamp hostmask/;
|
||||||
$nicklist .= "$sep$key => $self->{nicklist}->{lc $args[0]}->{lc $args[1]}->{$key}";
|
$nicklist .= "$sep$key => $self->{nicklist}->{lc $args[0]}->{lc $args[1]}->{$key}";
|
||||||
$sep = ', ';
|
$sep = ', ';
|
||||||
}
|
}
|
||||||
@ -318,6 +410,7 @@ sub on_join {
|
|||||||
$self->set_meta($channel, $nick, 'hostmask', "$nick!$user\@$host");
|
$self->set_meta($channel, $nick, 'hostmask', "$nick!$user\@$host");
|
||||||
$self->set_meta($channel, $nick, 'user', $user);
|
$self->set_meta($channel, $nick, 'user', $user);
|
||||||
$self->set_meta($channel, $nick, 'host', $host);
|
$self->set_meta($channel, $nick, 'host', $host);
|
||||||
|
$self->set_meta($channel, $nick, 'join', gettimeofday);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user