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:
parent
2a63cced1d
commit
96c9c38215
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user