3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-19 10:29:30 +01:00

Improvements to C Jeopardy rank command

Allow specifying a nick to show overall rankings for each category.
Limit rankings to top 15 or bottom 15.
Use temp variables to handle division-by-zero instead of setting player's data.
This commit is contained in:
Pragmatic Software 2015-02-13 14:39:20 -08:00
parent 2a63cced1d
commit 96c9c38215

View File

@ -40,9 +40,9 @@ sub print_correct {
sub sort_wrong { sub sort_wrong {
if ($rank_direction eq '+') { if ($rank_direction eq '+') {
return $b->{lifetime_wrong_answers} <=> $a->{lifetime_wrong_answers};
} else {
return $a->{lifetime_wrong_answers} <=> $b->{lifetime_wrong_answers}; return $a->{lifetime_wrong_answers} <=> $b->{lifetime_wrong_answers};
} else {
return $b->{lifetime_wrong_answers} <=> $a->{lifetime_wrong_answers};
} }
} }
@ -53,27 +53,28 @@ sub print_wrong {
} }
sub sort_ratio { sub sort_ratio {
$a->{lifetime_wrong_answers} = 1 if $a->{lifetime_wrong_answers} == 0; my $wrong_a = $a->{lifetime_wrong_answers} ? $a->{lifetime_wrong_answers} : 1;
$b->{lifetime_wrong_answers} = 1 if $b->{lifetime_wrong_answers} == 0; my $wrong_b = $b->{lifetime_wrong_answers} ? $b->{lifetime_wrong_answers} : 1;
if ($rank_direction eq '+') { if ($rank_direction eq '+') {
return $b->{lifetime_correct_answers} / $b->{lifetime_wrong_answers} <=> $a->{lifetime_correct_answers} / $a->{lifetime_wrong_answers}; return $b->{lifetime_correct_answers} / $wrong_b <=> $a->{lifetime_correct_answers} / $wrong_a;
} else { } else {
return $a->{lifetime_correct_answers} / $a->{lifetime_wrong_answers} <=> $b->{lifetime_correct_answers} / $b->{lifetime_wrong_answers}; return $a->{lifetime_correct_answers} / $wrong_a <=> $b->{lifetime_correct_answers} / $wrong_b;
} }
} }
sub print_ratio { sub print_ratio {
my $player = shift @_; my $player = shift @_;
my $ratio = $player->{lifetime_correct_answers} / $player->{lifetime_wrong_answers}; my $wrong = $player->{lifetime_wrong_answers} ? $player->{lifetime_wrong_answers} : 1;
my $ratio = $player->{lifetime_correct_answers} / $wrong;
return undef if $ratio == 0; return undef if $ratio == 0;
return sprintf "$player->{nick}: %.2f", $ratio; return sprintf "$player->{nick}: %.2f", $ratio;
} }
sub sort_hints { sub sort_hints {
if ($rank_direction eq '+') { if ($rank_direction eq '+') {
return $b->{lifetime_hints} <=> $a->{lifetime_hints};
} else {
return $a->{lifetime_hints} <=> $b->{lifetime_hints}; return $a->{lifetime_hints} <=> $b->{lifetime_hints};
} else {
return $b->{lifetime_hints} <=> $a->{lifetime_hints};
} }
} }
@ -99,9 +100,9 @@ sub print_correctstreak {
sub sort_wrongstreak { sub sort_wrongstreak {
if ($rank_direction eq '+') { if ($rank_direction eq '+') {
return $b->{lifetime_highest_wrong_streak} <=> $a->{lifetime_highest_wrong_streak};
} else {
return $a->{lifetime_highest_wrong_streak} <=> $b->{lifetime_highest_wrong_streak}; return $a->{lifetime_highest_wrong_streak} <=> $b->{lifetime_highest_wrong_streak};
} else {
return $b->{lifetime_highest_wrong_streak} <=> $a->{lifetime_highest_wrong_streak};
} }
} }
@ -146,10 +147,10 @@ if (lc $command eq 'rank') {
); );
if (not defined $opt) { if (not defined $opt) {
print "Usage: rank [+-]<keyword>; available keywords: "; print "Usage: rank [+-]<keyword> or rank <nick>; available keywords: ";
print join ', ', sort keys %ranks; print join ', ', sort keys %ranks;
print ".\n"; print ".\n";
print "For example, to rank by correct answers in ascending order: rank -correct\n"; print "For example, to rank by quickest answers in descending order: rank -quickest\n";
goto END; goto END;
} }
@ -160,21 +161,48 @@ if (lc $command eq 'rank') {
} }
if (not exists $ranks{$opt}) { if (not exists $ranks{$opt}) {
print "Unknown rank keyword '$opt'; available keywords: "; my $player_id = $scores->get_player_id($opt, $channel, 1);
print join ', ', sort keys %ranks;
print ".\n"; if (not defined $player_id) {
print "I don't know anybody named $opt\n";
goto END;
}
my $players = $scores->get_all_players($channel);
my @rankings;
foreach my $key (sort keys %ranks) {
my $sort_method = $ranks{$key}->{sort};
@$players = sort $sort_method @$players;
my $rank = 0;
foreach my $player (@$players) {
$rank++ if defined $ranks{$key}->{print}->($player);
last if lc $player->{nick} eq $opt;
}
if ($rank == 0) {
push @rankings, "$key: N/A";
} else {
push @rankings, "$key: #$rank";
}
}
print join ', ', @rankings;
print "\n";
goto END; goto END;
} }
my $players = $scores->get_all_players($channel); my $players = $scores->get_all_players($channel);
my $sort_method = $ranks{$opt}->{sort}; my $sort_method = $ranks{$opt}->{sort};
@$players = sort $sort_method @$players; @$players = sort $sort_method @$players;
my @ranking; my @ranking;
foreach my $player (@$players) { foreach my $player (@$players) {
my $entry = $ranks{$opt}->{print}->($player); my $entry = $ranks{$opt}->{print}->($player);
push @ranking, $entry if defined $entry; push @ranking, $entry if defined $entry;
last if scalar @ranking >= 15;
} }
if (not scalar @ranking) { if (not scalar @ranking) {