package Dakkar::TweetArchive; use v5.36; use Moo; use Net::Twitter; use Types::Standard qw(Str InstanceOf); use namespace::clean; has [qw(consumer_key consumer_secret access_token access_token_secret)] => ( is => 'ro', required => 1, isa => Str, ); has client => ( is => 'lazy', isa => InstanceOf['Net::Twitter'], ); sub _build_client($self) { my $nt = Net::Twitter->new( traits => [ qw/API::RESTv1_1 OAuth RetryOnError/, AutoCursor => { max_calls => 16, force_cursor => 1, array_accessor => 'users', methods => [qw/friends followers/], }, ], consumer_key => $self->consumer_key, consumer_secret => $self->consumer_secret, ); $nt->access_token($self->access_token); $nt->access_token_secret($self->access_token_secret); # HACK! Net::Twitter doesn't know about C, let's teach # it require Net::Twitter::API; my $nt_class = ref($nt); my $meta_class = Moose::Meta::Class->initialize($nt_class); $meta_class->make_mutable; my $original = $meta_class->find_method_by_name('home_timeline'); $nt_class->Net::Twitter::API::twitter_api_method( home_timeline => ( description => 'override home_timeline to add tweet_mode', path => $original->path, method => $original->method, params => [ @{ $original->params }, 'tweet_mode', ], booleans => $original->booleans, required => $original->required, returns => $original->returns, ), ); $meta_class->make_immutable; return $nt; } sub home_timeline($self,$since_id) { return $self->client->home_timeline({ include_entities => 1, trim_user => 0, exclude_replies => 0, ( $since_id ? ( since_id => $since_id ) : () ), count => 200, tweet_mode => 'extended', }); } sub friends($self) { return $self->client->friends({count=>200}); } sub followers($self) { return $self->client->followers({count=>200}); } 1;