diff options
author | Gianni Ceccarelli <gianni.ceccarelli@broadbean.com> | 2023-02-22 11:56:10 +0000 |
---|---|---|
committer | Gianni Ceccarelli <gianni.ceccarelli@broadbean.com> | 2023-02-22 11:56:10 +0000 |
commit | 8a66c4ef785ba4e72f320f4023718148854e6ac1 (patch) | |
tree | bfa5d8f4bbe67a27999908814a6828befd950011 /lib/Dakkar/Misskey.pm | |
parent | update to 5.36 (diff) | |
download | tweet-archive-misskey.tar.gz tweet-archive-misskey.tar.bz2 tweet-archive-misskey.zip |
misskey clientmisskey
Diffstat (limited to 'lib/Dakkar/Misskey.pm')
-rw-r--r-- | lib/Dakkar/Misskey.pm | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/Dakkar/Misskey.pm b/lib/Dakkar/Misskey.pm new file mode 100644 index 0000000..8d6dd5e --- /dev/null +++ b/lib/Dakkar/Misskey.pm @@ -0,0 +1,86 @@ +package Dakkar::Misskey; +use v5.36; +use Moo; +use JSON::MaybeXS; +use LWP::UserAgent; +use Types::Standard qw(Str); +use Types::URI qw(Uri); +use List::Util qw(minstr); +use URI; +use namespace::clean; + +has _json => ( is => 'lazy', builder => sub { JSON::MaybeXS->new(utf8=>1,relaxed=>1, pretty=>0) } ); +has _ua => ( is => 'lazy', builder => sub { LWP::UserAgent->new(agent=>'Dakkar::Misskey') } ); + +has token => ( is => 'ro', required => 1 ); +has base_url => ( is => 'ro', required => 1, isa => Uri, coerce => 1 ); + +sub _request($self, $endpoint, $payload) { + my $payload_json = $self->_json->encode({ + $payload->%*, + i => $self->token, + }); + + my $uri = URI->new($endpoint)->abs($self->base_url); + + my $response = $self->_ua->post( + $uri, + 'Content-type' => 'application/json', + Content => $payload_json, + ); + + if ($response->is_success) { + return( + $self->_json->decode( + $response->decoded_content(charset=>'none') + ), + undef, + ); + } + + return( undef, $response->status_line ); +} + +sub _paged_request($self, $endpoint, $payload) { + my @all_results; + + my $page_payload = { + limit => 100, + $payload->%*, + }; + + while (1) { + my ($result, $error) = $self->_request($endpoint, $page_payload); + return (\@all_results, $error) if $error; + + last unless $result->@*; + + push @all_results, $result->@*; + $page_payload->{untilId} = minstr(map { $_->{id} } $result->@* ); + } + + return (\@all_results, undef); +} + +sub timeline($self,$options) { + return $self->_paged_request( + 'api/notes/timeline', + $options, + ); +} + +sub followers($self,$user_id) { + return $self->_paged_request( + 'api/users/followers', + { userId => $user_id }, + ); +} + +sub following($self,$user_id) { + return $self->_paged_request( + 'api/users/following', + { userId => $user_id }, + ); +} + +1; |