App-Maisha
view release on metacpan or search on metacpan
lib/App/Maisha/Plugin/Twitter.pm view on Meta::CPAN
bless $self, $class;
return $self;
}
sub login {
my ($self,$config) = @_;
my $api;
unless($config->{username}) { warn "No username supplied\n"; return }
eval {
$api = Net::Twitter->new(
traits => [qw/API::Search API::REST OAuth/],
consumer_key => $self->{consumer_key},
consumer_secret => $self->{consumer_secret},
ssl => 1
);
};
unless($api) {
warn "Unable to establish connection to Twitter API\n";
return 0;
}
# for testing purposes we don't want to login
if(!$config->{test}) {
eval {
my $datafile = $config->{home} . '/.maisha/twitter.dat';
my $access_tokens = eval { retrieve($datafile) } || {};
if ( $access_tokens && $access_tokens->{$config->{username}}) {
$api->access_token($access_tokens->{$config->{username}}->[0]);
$api->access_token_secret($access_tokens->{$config->{username}}->[1]);
} else {
my $auth_url = $api->get_authorization_url;
print " Authorize this application at: $auth_url\nThen, enter the PIN# provided to continue: ";
my $pin = <STDIN>; # wait for input
chomp $pin;
unless($pin) {
warn "No PIN provided, Maisha will not be able to access Twitter account until authorized to do so\n";
return 0;
}
# request_access_token stores the tokens in $nt AND returns them
my $access_tokens = {};
my @access_tokens;
eval { @access_tokens = $api->request_access_token(verifier => $pin) };
unless(@access_tokens) {
warn "Invalid PIN provided, Maisha will not be able to access your Twitter account until authorized to do so\n";
return 0;
}
$access_tokens->{$config->{username}} = \@access_tokens;
mkpath( $config->{home} . '/.maisha' );
# save the access tokens
store $access_tokens, $datafile;
chmod 0640, $datafile; # make sure it has reasonable permissions
}
};
if($@) {
warn "Unable to login to Twitter\n";
return 0;
}
}
$self->api($api);
$self->config($config);
if(!$config->{test}) {
print "...building user cache for Twitter\n";
$self->_build_users();
}
return 1;
}
sub _build_users {
my $self = shift;
my %users;
eval {
my $f = $self->api->friends();
if($f && @$f) { for(@$f) { next unless($_); $users{$_->{screen_name}} = 1 } }
$f = $self->api->followers();
if($f && @$f) { for(@$f) { next unless($_); $users{$_->{screen_name}} = 1 } }
};
if($@) {
warn "Error retrieving friends/followers from Twitter: $@\n";
return;
}
$self->users(\%users);
}
sub api_reauthorize {
my $self = shift;
my $config = $self->config;
my $api = $self->api;
# for testing purposes we don't want to login
if(!$config->{test}) {
eval {
my $datafile = $config->{home} . '/.maisha/twitter.dat';
my $auth_url = $api->get_authorization_url;
print "Please re-authorize this application at: $auth_url\nThen, enter the PIN# provided to continue: ";
my $pin = <STDIN>; # wait for input
chomp $pin;
unless($pin) {
warn "No PIN provided, Maisha will not be able to access direct messages until reauthorization is completed\n";
return 0;
}
# request_access_token stores the tokens in $nt AND returns them
my $access_tokens = {};
my @access_tokens;
eval { @access_tokens = $api->request_access_token(verifier => $pin) };
unless(@access_tokens) {
warn "Invalid PIN provided, Maisha will not be able to access direct messages until reauthorization is completed\n";
return 0;
}
$access_tokens->{$config->{username}} = \@access_tokens;
unlink $datafile;
mkpath( $config->{home} . '/.maisha' );
# save the access tokens
store $access_tokens, $datafile;
chmod 0640, $datafile; # make sure it has reasonable permissions
};
if($@) {
warn "Unable to login to Twitter\n";
return 0;
}
}
return 1;
}
sub api_follow {
my $self = shift;
$self->api->create_friend(@_);
}
sub api_unfollow {
my $self = shift;
$self->api->destroy_friend(@_);
}
sub api_user {
my $self = shift;
$self->api->show_user(@_);
}
sub api_user_timeline {
my $self = shift;
$self->api->user_timeline(@_);
}
sub api_friends {
my $self = shift;
$self->api->following(@_);
}
sub api_friends_timeline {
my $self = shift;
$self->api->following_timeline(@_);
}
sub api_public_timeline {
my $self = shift;
$self->api->public_timeline(@_);
}
sub api_followers {
my $self = shift;
$self->api->followers(@_);
# below is meant to be the same as the above, but it isn't :(
#$self->api->lookup_users( { user_id => $self->api->followers_ids() } );
}
sub api_update {
my $self = shift;
$self->api->update(@_);
}
sub api_replies {
( run in 0.638 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )