Spinach: Do not attempt to choose categories that do not contain questions that meet game configuration (min_difficulty, seen_expiry, etc); slightly speed up some delays

This commit is contained in:
Pragmatic Software 2019-05-06 21:08:09 -07:00
parent 6dc911c100
commit 7f8272c0f3
1 changed files with 26 additions and 7 deletions

View File

@ -1582,17 +1582,31 @@ sub choosecategory {
my $no_infinite_loops = 0;
while (1) {
last if ++$no_infinite_loops > 200;
last if ++$no_infinite_loops > 10000;
my $cat = $categories[rand @categories];
my $count = keys %{$self->{categories}{$cat}};
$self->{pbot}->{logger}->log("random cat: [$cat] $count questions\n");
my @questions = keys %{$self->{categories}{$cat}};
if (not $count) {
$self->{pbot}->{logger}->log("no count for random cat!\n");
if (not @questions) {
$self->{pbot}->{logger}->log("No questions for category $cat\n");
next;
}
if (exists $self->{metadata}->{hash}->{settings}->{min_difficulty}) {
@questions = grep { $self->{categories}{$cat}{$_}->{value} >= $self->{metadata}->{hash}->{settings}->{min_difficulty} } @questions;
}
if (exists $self->{metadata}->{hash}->{settings}->{max_difficulty}) {
@questions = grep { $self->{categories}{$cat}{$_}->{value} <= $self->{metadata}->{hash}->{settings}->{max_difficulty} } @questions;
}
if (exists $self->{metadata}->{hash}->{settings}->{seen_expiry}) {
my $now = time;
@questions = grep { $now - $self->{categories}{$cat}{$_}->{seen_timestamp} >= $self->{metadata}->{hash}->{settings}->{seen_expiry} } @questions;
}
next if not @questions;
if (not grep { $_ eq $cat } @choices) {
push @choices, $cat;
}
@ -1600,6 +1614,11 @@ sub choosecategory {
last if @choices == $self->{metadata}->{hash}->{settings}->{category_choices} or @categories < $self->{metadata}->{hash}->{settings}->{category_choices};;
}
if (not @choices) {
$self->{pbot}->{logger}->log("Out of questions with current settings!\n");
# XXX: do something useful here
}
push @choices, 'RANDOM CATEGORY';
push @choices, 'REROLL CATEGORIES';
@ -2084,7 +2103,7 @@ sub showlies {
sub showtruth {
my ($self, $state) = @_;
if ($state->{ticks} % 4 == 0) {
if ($state->{ticks} % 3 == 0) {
my $player_id;
my $player_data;
my $players;
@ -2247,7 +2266,7 @@ sub showfinalscore {
if ($state->{first_tock}) {
$tock = 2;
} else {
$tock = 5;
$tock = 3;
}
if ($state->{ticks} % $tock == 0) {