2014-07-29 19:30:12 +02:00
|
|
|
#!/usr/bin/env perl
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
|
2014-07-29 22:07:48 +02:00
|
|
|
use Time::HiRes qw/gettimeofday/;
|
|
|
|
use Time::Duration qw/duration/;
|
2014-07-29 19:30:12 +02:00
|
|
|
|
|
|
|
my $CJEOPARDY_DATA = 'cjeopardy.dat';
|
|
|
|
my $CJEOPARDY_HINT = 'cjeopardy.hint';
|
|
|
|
|
|
|
|
my @hints = (0.90, 0.75, 0.50, 0.25, 0.10);
|
2014-12-30 08:19:32 +01:00
|
|
|
my $timeout = 30;
|
2014-07-29 19:30:12 +02:00
|
|
|
|
|
|
|
my $channel = shift @ARGV;
|
|
|
|
|
|
|
|
sub encode { my $str = shift; $str =~ s/\\(.)/{sprintf "\\%03d", ord($1)}/ge; return $str; }
|
|
|
|
sub decode { my $str = shift; $str =~ s/\\(\d{3})/{"\\" . chr($1)}/ge; return $str }
|
|
|
|
|
|
|
|
if ($channel !~ /^#/) {
|
2014-08-31 22:21:09 +02:00
|
|
|
print "Sorry, C Jeopardy must be played in a channel. Feel free to join #cjeopardy.\n";
|
2014-07-29 19:30:12 +02:00
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
my @data;
|
|
|
|
open my $fh, "<", "$CJEOPARDY_DATA-$channel" or print "There is no open C Jeopardy question. Use `cjeopardy` to get a question.\n" and exit;
|
|
|
|
@data = <$fh>;
|
|
|
|
close $fh;
|
|
|
|
|
2014-08-04 00:20:54 +02:00
|
|
|
my @valid_answers = map { decode $_ } split /\|/, encode $data[1];
|
2014-07-29 19:30:12 +02:00
|
|
|
|
|
|
|
my ($hint, $length) = ('', 0);
|
|
|
|
foreach my $answer (@valid_answers) {
|
|
|
|
chomp $answer;
|
|
|
|
$answer =~ s/\\\|/|/g;
|
2014-08-04 00:20:54 +02:00
|
|
|
|
|
|
|
my $supplemental_text;
|
|
|
|
if ($answer =~ s/\s*{(.*)}\s*$//) {
|
|
|
|
$supplemental_text = $1;
|
|
|
|
}
|
|
|
|
|
2014-07-29 19:30:12 +02:00
|
|
|
if (length $answer > $length) {
|
|
|
|
$length = length $answer;
|
|
|
|
$hint = $answer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-29 22:07:48 +02:00
|
|
|
my ($hint_counter, $last_timeout);
|
2014-07-29 19:30:12 +02:00
|
|
|
my $ret = open $fh, "<", "$CJEOPARDY_HINT-$channel";
|
|
|
|
if (defined $ret) {
|
|
|
|
$hint_counter = <$fh>;
|
2014-07-29 22:07:48 +02:00
|
|
|
$last_timeout = <$fh>;
|
2014-07-29 19:30:12 +02:00
|
|
|
close $fh;
|
|
|
|
}
|
|
|
|
|
2014-08-04 00:20:54 +02:00
|
|
|
$last_timeout = 0 if not defined $last_timeout;
|
|
|
|
|
2014-07-29 22:07:48 +02:00
|
|
|
my $duration = scalar gettimeofday - $last_timeout;
|
|
|
|
if ($duration < $timeout) {
|
|
|
|
$duration = duration($timeout - $duration);
|
2014-08-04 00:20:54 +02:00
|
|
|
unless ($duration eq 'just now') {
|
|
|
|
print "Please wait $duration before requesting another hint.\n";
|
|
|
|
exit;
|
|
|
|
}
|
2014-07-29 22:07:48 +02:00
|
|
|
}
|
|
|
|
|
2014-07-29 19:30:12 +02:00
|
|
|
$hint_counter++;
|
|
|
|
|
|
|
|
open $fh, ">", "$CJEOPARDY_HINT-$channel" or die "Couldn't open $CJEOPARDY_HINT-$channel: $!";
|
|
|
|
print $fh "$hint_counter\n";
|
2014-07-29 22:07:48 +02:00
|
|
|
print $fh scalar gettimeofday, "\n";
|
2014-07-29 19:30:12 +02:00
|
|
|
close $fh;
|
|
|
|
|
|
|
|
my $hidden_character_count = int length ($hint) * $hints[$hint_counter > $#hints ? $#hints : $hint_counter];
|
|
|
|
my $spaces = () = $hint =~ / /g;
|
2014-08-04 00:20:54 +02:00
|
|
|
my $dashes = () = $hint =~ /-/g;
|
|
|
|
my $underscores = () = $hint =~ /_/g;
|
2014-07-29 19:30:12 +02:00
|
|
|
|
|
|
|
my @indices;
|
2014-08-04 00:20:54 +02:00
|
|
|
while (@indices <= $hidden_character_count - $spaces - $dashes - $underscores) {
|
2014-07-29 19:30:12 +02:00
|
|
|
my $index = int rand($length);
|
2014-08-04 00:20:54 +02:00
|
|
|
my $char = substr($hint, $index, 1);
|
|
|
|
next if $char eq ' ';
|
|
|
|
next if $char eq '-';
|
|
|
|
next if $char eq '_';
|
2014-07-29 19:30:12 +02:00
|
|
|
next if grep { $index eq $_ } @indices;
|
|
|
|
push @indices, $index;
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach my $index (@indices) {
|
2014-08-31 22:21:09 +02:00
|
|
|
substr $hint, $index, 1, '.';
|
2014-07-29 19:30:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
print "Hint: $hint\n";
|