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 )