From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#
# This file is part of App-SpreadRevolutionaryDate
#
# This software is Copyright (c) 2019-2025 by Gérald Sédrati.
#
# This is free software, licensed under:
#
# The GNU General Public License, Version 3, June 2007
#
use 5.014;
use utf8;
$App::SpreadRevolutionaryDate::Target::Mastodon::VERSION = '0.43';
# ABSTRACT: Target class for L<App::SpreadRevolutionaryDate> to handle spreading on Mastodon.
use Moose;
=> {worker => 'Mastodon::Client'};
use Encode qw(encode decode is_utf8);
use Locale::TextDomain 'App-SpreadRevolutionaryDate';
has 'instance' => (
is => 'ro',
isa => 'Str',
required => 1,
);
has 'client_id' => (
is => 'ro',
isa => 'Str',
required => 1,
);
has 'client_secret' => (
is => 'ro',
isa => 'Str',
required => 1,
);
has 'access_token' => (
is => 'ro',
isa => 'Str',
required => 1,
);
around BUILDARGS => sub {
my ($orig, $class) = @_;
my $args = $class->$orig(@_);
$args->{obj} = Mastodon::Client->new(
instance => $args->{instance},
client_id => $args->{client_id},
client_secret => $args->{client_secret},
access_token => $args->{access_token},
name => 'RevolutionaryDate');
return $args;
};
sub spread {
my ($self, $msg, $test, $img) = @_;
$test //= 0;
# Multiline message
$msg =~ s/\\n/\n/g;
if ($test) {
$msg = __("Spread on Mastodon: ") . $msg;
if ($img) {
$msg .= " with image path: " . $img->{path} . " , alt: " . $img->{alt};
}
use open qw(:std :encoding(UTF-8));
my $io = IO::Handle->new;
$io->fdopen(fileno(STDOUT), "w");
$msg = encode('UTF-8', $msg) if is_utf8($msg);
$io->say($msg);
} else {
my $params = {};
if ($img) {
$img = {path => $img} unless ref($img) && ref($img) eq 'HASH' && $img->{path};
my $img_alt = $img->{alt} // ucfirst(fileparse($img->{path}, qr/\.[^.]*/));
$img_alt = encode('UTF-8', $img_alt) if is_utf8($img_alt);
my $resp_img = $self->obj->upload_media($img->{path}, {description => $img_alt});
$params->{media_ids} = [$resp_img->{id}] if $resp_img->{id};
}
$self->obj->post_status($msg, $params);
}
}
no Moose;
__PACKAGE__->meta->make_immutable;
# A module must return a true value. Traditionally, a module returns 1.
# But this module is a revolutionary one, so it discards all old traditions.
# Idea borrowed from Jean Forget's DateTime::Calendar::FrenchRevolutionary.
"Quand le gouvernement viole les droits du peuple,
l'insurrection est pour le peuple le plus sacré
et le plus indispensable des devoirs";
__END__
=pod
=encoding UTF-8
=head1 NAME
App::SpreadRevolutionaryDate::Target::Mastodon - Target class for L<App::SpreadRevolutionaryDate> to handle spreading on Mastodon.
=head1 VERSION
version 0.43
=head1 METHODS
=head2 new
Constructor class method. Takes a hash argument with the following mandatory keys: C<instance>, C<client_id>, C<client_secret>, and C<access_token>, with all values being strings. Authentifies to Mastodon and returns an C<App::SpreadRevolutionaryDate::Target::Mastodon> object.
=head2 spread
Spreads a message to Mastodon. Takes one mandatory argument: C<$msg> which should be the message to spread as a characters string; and one optional argument: C<test>, which defaults to C<false>, and if C<true> prints the message on standard output instead of spreading on Mastodon.
=head1 SEE ALSO
=over
=item L<spread-revolutionary-date>
=item L<App::SpreadRevolutionaryDate>
=item L<App::SpreadRevolutionaryDate::Config>
=item L<App::SpreadRevolutionaryDate::BlueskyLite>
=item L<App::SpreadRevolutionaryDate::Target>
=item L<App::SpreadRevolutionaryDate::Target::Bluesky>
=item L<App::SpreadRevolutionaryDate::Target::Twitter>
=item L<App::SpreadRevolutionaryDate::Target::Freenode>
=item L<App::SpreadRevolutionaryDate::Target::Freenode::Bot>
=item L<App::SpreadRevolutionaryDate::Target::Liberachat>
=item L<App::SpreadRevolutionaryDate::Target::Liberachat::Bot>
=item L<App::SpreadRevolutionaryDate::MsgMaker>
=item L<App::SpreadRevolutionaryDate::MsgMaker::RevolutionaryDate>
=item L<App::SpreadRevolutionaryDate::MsgMaker::RevolutionaryDate::Calendar>
=item L<App::SpreadRevolutionaryDate::MsgMaker::RevolutionaryDate::Locale>
=item L<App::SpreadRevolutionaryDate::MsgMaker::RevolutionaryDate::Locale::fr>
=item L<App::SpreadRevolutionaryDate::MsgMaker::RevolutionaryDate::Locale::en>
=item L<App::SpreadRevolutionaryDate::MsgMaker::RevolutionaryDate::Locale::it>
=item L<App::SpreadRevolutionaryDate::MsgMaker::RevolutionaryDate::Locale::es>
=item L<App::SpreadRevolutionaryDate::MsgMaker::PromptUser>
=item L<App::SpreadRevolutionaryDate::MsgMaker::Telechat>
=back
=head1 AUTHOR
Gérald Sédrati <gibus@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is Copyright (c) 2019-2025 by Gérald Sédrati.
This is free software, licensed under:
The GNU General Public License, Version 3, June 2007
=cut