package App::Twirc::Plugin::SecondaryAccount;
$App::Twirc::Plugin::SecondaryAccount::VERSION = '0.20';
use Moose;
use Net::Twitter;
use POE::Component::Server::Twirc;

has net_twitter_options => ( isa => 'HashRef', is => 'ro', default => sub { {} } );
has username => ( isa => 'Str', is => 'ro', required => 1 );
has password => ( isa => 'Str', is => 'ro', required => 1 );
has option   => ( isa => 'Str', is => 'ro' );
has _twitter => ( isa => 'Net::Twitter', is => 'rw' );
has _option_regex => ( isa => 'Maybe[RegexpRef]', is => 'rw', default => undef );
has _useragent_class => ( isa => 'Str', is => 'ro', default => 'LWP::UserAgent::POE' );

sub BUILD {
    my $self = shift;

    $self->_twitter(Net::Twitter->new(
        username  => $self->username,
        password  => $self->password,
        source    => 'twircgw',
        useragent => 'twirc/' . POE::Component::Server::Twirc->VERSION,
        useragent_class => $self->_useragent_class,
        %{$self->net_twitter_options},
    ));

    if ( $self->option ) {
        my $option = quotemeta $self->option;
        $self->_option_regex(qr/^-$option(only)?\s+/);
    }
}

sub cmd_post {
    my ($self, $server, $channel, $nick, $textref) = @_;

    my $only;
    if ( my $option_regex = $self->_option_regex ) {
        $$textref =~ s/$option_regex// || return;
        $only = $1;
    }

    $self->_twitter->update($$textref);
    return $only; # return a true value to stop the processing chain
}

no Moose;

__PACKAGE__->meta->make_immutable;

1;

__END__

=head1 NAME

App::Twirc::Plugin::SecondaryAccount - Cross post updates (DEPRECATED)

=head1 SYNOPSIS

  # in config (.yml in this example)
  plugins:
      - SecondaryAccount
          username: my_other_screen_name
          password: my_other_twitter_password
          option: fb
      - SecondaryAccount
          username: yet_another_screen_name
          password: yet_another_password
          net_twitter_options:
              apiurl: http://identi.ca/api

  # In your IRC client...
  # ...post to your primary account *and* yet_another_screen_name
  post Hello, world!

  # ...post to your primary account and both secondary accounts
  post -fb Hello, universe!

  # ... post to my_other_screen name, only
  post -fbonly Hello, alternate reality.

=head1 DESCRIPTION

This plugin allows cross-posting messages to multiple accounts.  In
configuration, you can provide an C<option> value.  When used as an option to
C<post>, your message will be cross-posted to your primary account and the
secondary account with that C<option> value.  If you do not provide an
C<option> value, all messages are cross-posted to the secondary account.

By appending C<only> to the C<option> value, your status will only be posted to
the the account with that C<option> value.

I use a configuration similar to the one in the synopsis to cross-post my
Twitter status updates to Identi.ca, and optionally to Facebook.  My Twitter
screen name is C<semifor>.  I created an account with screen name C<semifor_fb>
and registered it with Twitter's Facebook application.  In the C<twirc>
configuration file, I assigned C<option> value C<fb> to the account.

I created another secondary account with my Identi.ca screen name.  In C<twirc>
configuration, I used the C<net_twitter_options> to specify Identi.ca's
C<apiurl>.

Now, when I post a normal status update, it is posted to C<semifor> on both
Twitter and Identi.ca.  If I include a C<-fb> option to post, my status update
is posted to Twitter, Identi.ca, and Facebook.  If I add a C<-fbonly> option to
C<post>, my status update is only posted to the Facebook account.

=head1 DEPRCATION NOTICE

This module relies on username/password authentication, which Twitter dropped
ages ago. The author isn't using this plugin, personally, and suspects no one
else is, either. So, if you are using it, file an issue, or better---a pull
request. Otherwise, it will get silently dropped in a future release.

=head1 AUTHOR

Marc Mims <mmims@cpan.org>

=head1 LICENSE

Copyright (c) 2015 Marc Mims

You may distribute this code and/or modify it under the same terms as Perl itself.

=cut