The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bot::BasicBot::Pluggable::Module::Join;
$Bot::BasicBot::Pluggable::Module::Join::VERSION = '1.00';
use base qw(Bot::BasicBot::Pluggable::Module);
use warnings;
use strict;

sub connected {
    my $self = shift;
    my $channels = $self->get("channels") || [];

    ## If we are not a array reference, we are problably the old
    ## string format ... trying to convert
    if ( not ref($channels) eq 'ARRAY' ) {
        $channels = [ split( /\s+/, $channels ) ];
    }

    for ( @{$channels} ) {
        print "Joining $_.\n";
        $self->bot->join($_);
    }
}

sub help {
    return
"Join and leave channels. Usage: join <channel>, leave/part <channel>, channels. Requires direct addressing.";
}

sub told {
    my ( $self, $mess ) = @_;
    my $body = $mess->{body};
    return unless defined $body;
    return unless $mess->{address};

    my ( $command, $param ) = split( /\s+/, $body, 2 );
    $command = lc($command);
    return unless $command =~ /^(join|leave|part|channels)$/;

    if (!$self->authed($mess->{who})) {
        return "Sorry, you must be authenticated to do that.";
    }

    if ( $command eq "join" ) {
        $self->add_channel($param);
        return "Ok.";

    }
    elsif ( $command eq "leave" or $command eq "part" ) {
        $self->remove_channel( $param || $mess->{channel} );
        return "Ok.";

    }
    elsif ( $command eq "channels" ) {
        my @channels    = $self->bot->channels;
        my $channel_num = scalar @channels;
        if ( $channel_num == 0 ) {
            return "I'm not in any channel.";
        }
        elsif ( $channel_num == 1 ) {
            return "I'm in " . $channels[0] . ".";
        }
        elsif ( $channel_num == 2 ) {
            return "I'm in " . $channels[0] . " and " . $channels[1] . ".";
        }
        else {
            return
                "I'm in "
              . join( ', ', @channels[ 0 .. $#channels - 1 ] )
              . " and $channels[-1].";
        }
    }
}

sub chanjoin {
    my ( $self, $mess ) = @_;
    if ( $mess->{who} eq $self->bot->nick ) {
        $self->set( channels => $self->bot->channels );
    }
}

sub chanpart {
    my ( $self, $mess ) = @_;
    if ( $mess->{who} eq $self->bot->nick ) {
        $self->set( channels => $self->bot->channels );
    }
}

sub add_channel {
    my ( $self, $channel ) = @_;
    $self->bot->join($channel);
}

sub remove_channel {
    my ( $self, $channel ) = @_;
    $self->bot->part($channel);
}

1;

__END__

=head1 NAME

Bot::BasicBot::Pluggable::Module::Join - join and leave channels; remembers state

=head1 VERSION

version 1.00

=head1 IRC USAGE

=over 4

=item join <channel>

=item part <channel>

=item channels

List the channels the bot is in.

=back

=head1 METHODS

=over 4

=item add_channel($channel)

=item remove_channel($channel)

=back

=head1 AUTHOR

Mario Domgoergen <mdom@cpan.org>

This program is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.