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;