Bot-Applebot
view release on metacpan or search on metacpan
lib/Bot/Applebot.pm view on Meta::CPAN
},
default => sub { [ grep { /\S/ } shuffle(
io(dist_file('Bot-Applebot', 'adjectives.txt'))->chomp->slurp,
eval { io(conf->{aux}{adjectives})->chomp->slurp },
)]},
lazy => 1,
);
has adjective_card => (
is => 'rw',
isa => 'Str',
default => sub { shift->draw_adjective_card },
lazy => 1,
clearer => 'clear_adjective_card',
);
has streak_winner => (
is => 'rw',
isa => 'Str',
clearer => 'clear_streak_winner',
);
has streak_score => (
is => 'rw',
isa => 'Int',
default => 0,
clearer => 'reset_streak_score',
);
sub channel { (shift->channels)[0] }
sub color {
my ($string, $color) = @_;
Carp::cluck("Too many arguments") if @_ > 2;
return $string if forbid("color");
return eval { String::IRC->new($string)->$color } || $string;
}
sub adj { color($_[0], 'light_green') }
around draw_adjective_card => sub {
my $orig = shift;
my $self = shift;
my $forbid_special = shift;
unless ($forbid_special) {
if (!forbid('secret_adjectives') && rand(50) < 1) {
return '(a secret)';
}
if (!forbid('blank_adjectives') && rand(50) < 1) {
return 'BLANK';
}
}
$self->reshuffle_adjective_cards unless $self->has_adjective_cards;
my $adjective = $orig->($self, @_);
if ($adjective eq 'Bold') {
$adjective = color($adjective, 'bold');
}
$adjective =~ s{<player>}{(shuffle $self->player_names)[0]}eg;
$adjective =~ s{<judge>}{$self->judge}eg;
return "$adjective";
};
around draw_noun_card => sub {
my $orig = shift;
my $self = shift;
my $forbid_special = shift;
unless ($forbid_special) {
if (!forbid('blank_nouns') && rand(100) < 1) {
return 'BLANK';
}
}
$self->reshuffle_noun_cards unless $self->has_noun_cards;
return $orig->($self, @_);
};
sub said {
my $self = shift;
my $args = shift;
my $nick = $args->{who};
my $text = $args->{body};
my $chan = $args->{channel};
if ($nick eq conf->{owner} && $text =~ /^!eval (.+)/) {
my $ret = eval $1;
return $@ if $@;
return $ret;
}
if ($self->game_state eq 'initializing') {
return $self->init_said($nick, $text, $chan);
}
else {
return $self->play_said($nick, $text, $chan);
}
}
sub init_said {
my $self = shift;
my $nick = shift;
my $text = shift;
my $chan = shift;
if ($text =~ /^!(j(oin)?|play)\b/i) {
return "$nick is already playing." if $self->has_player($nick);
my $player = $self->add_player($nick => Bot::Applebot::Player->new(name => $nick));
$self->give_cards($player);
$self->announce("$nick is now playing! Current players: " . join(', ', $self->player_names) . ". Type !join to play." . ($self->players > 2 ? " Type !begin [score] to start." : ""));
}
if ($text =~ /^!players?\b/i) {
( run in 0.886 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )