Next huge chunk of refactoring completed.

This commit is contained in:
Storm Dragon
2025-07-27 22:53:05 -04:00
parent efe2c13c9d
commit 4379660dfd
+98 -55
View File
@@ -252,7 +252,7 @@ EOF
getuliurl getufliurl dmsenturl reblogurl boostsbyurl dmidurl
statusliurl followliurl leaveliurl followersurl
oauthurl oauthauthurl oauthaccurl oauthbase wtrendurl
atrendurl frupdurl lookupidurl boostsofmeurl
atrendurl lookupidurl
); %opts_secret = map { $_ => 1} qw(
superverbose ttytteristas
); %opts_comma_delimit = map { $_ => 1 } qw(
@@ -278,7 +278,7 @@ EOF
getuliurl getufliurl dmsenturl reblogurl boostsbyurl wtrendurl
statusliurl followliurl leaveliurl dmidurl nostreamreplies
frupdurl filterusers filterats filterrts filterflags
filteratonly nofilter boostsofmeurl
filteratonly nofilter
); %opts_others = map { $_ => 1 } qw(
lynx curl seven silent maxhist noansi hold status
daemon timestamp twarg user anonymous script readline
@@ -1025,19 +1025,20 @@ $idurl ||= "${apibase}/statuses/%I";
$delurl ||= "${apibase}/statuses/%I";
$reblogurl ||= "${apibase}/statuses/%I/reblog";
$boostsbyurl ||= "${apibase}/statuses/reposts/%I.json";
$boostsofmeurl ||= "${apibase}/statuses/reposts_of_me.json";
# Twitter endpoints removed - not available in fediverse
# $boostsbyurl: Use /api/v1/statuses/%I/reblogged_by instead
# $boostsofmeurl: No direct equivalent in fediverse (privacy feature)
$wurl ||= "${apibase}/accounts/%I";
$frurl ||= "${apibase}/friendships/show.json";
# Twitter friendships API removed - use /api/v1/accounts/relationships instead
$followurl ||= "${apibase}/accounts/%I/follow";
$leaveurl ||= "${apibase}/accounts/%I/unfollow";
$blockurl ||= "${apibase}/accounts/%I/block";
$blockdelurl ||= "${apibase}/accounts/%I/unblock";
$friendsurl ||= "${apibase}/accounts/%I/following";
$followersurl ||= "${apibase}/accounts/%I/followers";
$frupdurl ||= "${apibase}/friendships/update.json";
# Twitter friendships/update removed - fediverse uses individual follow/unfollow endpoints
$lookupidurl ||= "${apibase}/accounts/lookup";
$rlurl ||= "${apibase}/instance"; # Mastodon instance info instead of rate limits
@@ -1052,19 +1053,16 @@ $favsurl ||= "${apibase}/favourites";
$favurl ||= "${apibase}/statuses/%I/favourite";
$favdelurl ||= "${apibase}/statuses/%I/unfavourite";
$getlisurl ||= "${apibase}/lists/list.json";
$creliurl ||= "${apibase}/lists/create.json";
$delliurl ||= "${apibase}/lists/destroy.json";
$modifyliurl ||= "${apibase}/lists/update.json";
$deluliurl ||= "${apibase}/lists/members/destroy_all.json";
$adduliurl ||= "${apibase}/lists/members/create_all.json";
$getuliurl ||= "${apibase}/lists/memberships.json";
$getufliurl ||= "${apibase}/lists/subscriptions.json";
$delfliurl ||= "${apibase}/lists/subscribers/destroy.json";
$crefliurl ||= "${apibase}/lists/subscribers/create.json";
$getfliurl ||= "${apibase}/lists/subscribers.json";
$getliurl ||= "${apibase}/lists/members.json";
$statusliurl ||= "${apibase}/lists/statuses.json";
# Fediverse list APIs (simplified compared to Twitter)
$getlisurl ||= "${apibase}/lists"; # GET lists
$creliurl ||= "${apibase}/lists"; # POST create list
$delliurl ||= "${apibase}/lists/%I"; # DELETE list
$modifyliurl ||= "${apibase}/lists/%I"; # PUT update list
$getliurl ||= "${apibase}/lists/%I/accounts"; # GET list members
$adduliurl ||= "${apibase}/lists/%I/accounts"; # POST add members
$deluliurl ||= "${apibase}/lists/%I/accounts"; # DELETE remove members
$statusliurl ||= "${apibase}/lists/%I"; # GET list timeline
# Note: Fediverse doesn't have list subscriptions/followers like Twitter
$streamurl ||= "${http_proto}://${fediverseserver}/api/v1/streaming";
$dostream ||= 0;
@@ -2619,13 +2617,16 @@ print $stdout "*** invalid UTF-8: partial delete of a wide character?\n";
}
$uname ||= $whoami;
# check the list validity
my $my_json_ref = &grabjson(
"${statusliurl}?owner_screen_name=${uname}&slug=${lname}",
0, 0, 0, undef, 1);
if (!$my_json_ref || ref($my_json_ref) ne 'ARRAY') {
print $stdout
"*** list $uname/$lname seems bogus; not added\n";
# In fediverse, can only access your own lists (privacy feature)
if ($uname ne $whoami) {
print $stdout "-- Sorry, fediverse only allows access to your own lists (privacy feature)\n";
return 0;
}
# Look up list ID by title
my $list_id = &lookup_list_id($lname);
if (!$list_id) {
print $stdout "*** list '$lname' not found; use /lists to see available lists\n";
return 0;
}
@@ -3086,12 +3087,30 @@ EOF
$mode = ($mode eq 'frs' || $mode eq 'friends')
? $friendsurl : $followersurl;
} else {
$what = ($mode eq 'frs' || $mode eq 'friends')
? "friends/members" : "followers/subscribers";
$mode = ($mode eq 'frs' || $mode eq 'friends')
? $getliurl : $getfliurl;
$user = "&owner_screen_name=${who}&slug=${lname}";
$who = "list $who/$lname";
# List members/followers - fediverse only supports list members, not subscribers
if ($mode eq 'fos' || $mode eq 'followers') {
print $stdout "-- Sorry, fediverse lists don't have followers/subscribers (privacy feature)\n";
return 0;
}
# Check list ownership (fediverse privacy)
if ($who ne $whoami) {
print $stdout "-- Sorry, fediverse only allows access to your own list members (privacy feature)\n";
return 0;
}
# Look up list ID
my $list_id = &lookup_list_id($lname);
if (!$list_id) {
print $stdout "*** list '$lname' not found; use /lists to see available lists\n";
return 0;
}
$what = "list members";
$mode = $getliurl;
$mode =~ s/%I/$list_id/g;
$user = ""; # No additional parameters needed
$who = "list $lname";
}
$countmaybe =~ s/[^\d]//g if (length($countmaybe));
$countmaybe += 0;
@@ -3533,13 +3552,9 @@ m#^/(un)?f(boost|a|av|ave|avorite|avourite)? ([zZ]?[a-zA-Z]?[0-9]+)$#) {
$countmaybe =~ s/[^\d]//g if (length($countmaybe));
$countmaybe += 0;
my $my_json_ref = &grabjson($boostsofmeurl, 0, 0, $countmaybe);
&dt_tdisplay($my_json_ref, "rtsofme");
if ($mode eq 're') {
$_ = '/re'; # and fall through ...
} else {
return 0;
}
# "Reposts of me" not available in fediverse (privacy feature)
print $stdout "-- Sorry, fediverse doesn't provide 'reposts of me' (privacy feature)\n";
return 0;
}
if (m#^/rts?of\s+([zZ]?[a-zA-Z]?[0-9]+)$# && !$noreblogs) {
my $code = lc($1);
@@ -3946,18 +3961,9 @@ EOF
return 0;
}
my $r = &postjson(
($m ne 'lfollow') ? $delfliurl : $crefliurl,
"owner_screen_name=$uname&slug=$lname");
if ($r) {
my $t = ($m eq 'lfollow') ? "" : "un";
print $stdout &wwrap(
"*** ok, you are now ${t}marked as a follower of $uname/${lname}.\n");
my $c = ($t eq 'un') ? "off" : "on";
$t = ($t eq 'un') ? "remove from" : "add to";
print $stdout &wwrap(
"--- to also $t your timeline, use /list${c}\n");
}
# List subscriptions not available in fediverse (privacy feature)
print $stdout "-- Sorry, fediverse doesn't support list subscriptions (privacy feature)\n";
print $stdout "-- You can only access your own lists, not follow others' lists\n";
return 0;
}
@@ -4099,9 +4105,23 @@ EOF
$countmaybe += 0;
$uname ||= $whoami;
my $my_json_ref = &grabjson(
"${statusliurl}?owner_screen_name=${uname}&slug=${lname}",
0, 0, $countmaybe, undef, 1);
# In fediverse, can only access your own lists (privacy feature)
if ($uname ne $whoami) {
print $stdout "-- Sorry, fediverse only allows access to your own lists (privacy feature)\n";
return 0;
}
# Look up list ID by title
my $list_id = &lookup_list_id($lname);
if (!$list_id) {
print $stdout "*** list '$lname' not found; use /lists to see available lists\n";
return 0;
}
# Get list timeline using proper fediverse endpoint
my $list_timeline_url = $statusliurl;
$list_timeline_url =~ s/%I/$list_id/g;
my $my_json_ref = &grabjson($list_timeline_url, 0, 0, $countmaybe, undef, 1);
&dt_tdisplay($my_json_ref, "again");
return 0;
}
@@ -6186,7 +6206,7 @@ sub updatest {
}
}
my $return = &backticks($baseagent, '/dev/null', undef,
($rt_id) ? "$reblogurl/${rt_id}.json" : $update,
($rt_id) ? ($reblogurl =~ s/%I/$rt_id/gr) : $update,
$i, 0, @wend);
print $stdout "-- return --\n$return\n-- return --\n"
if ($superverbose);
@@ -7244,6 +7264,29 @@ sub lookup_account_id {
return undef;
}
sub lookup_list_id {
my $list_title = shift;
return unless ($list_title);
print $stdout "-- DEBUG: Looking up list ID for title: $list_title\n" if ($verbose);
# Get all lists for current user
my $lists_result = &grabjson($getlisurl, 0, 0, 0, undef, 1);
if ($lists_result && ref($lists_result) eq 'ARRAY') {
for my $list (@{$lists_result}) {
my $title = $list->{'title'} || '';
if (lc($title) eq lc($list_title)) {
print $stdout "-- DEBUG: Found list ID: " . $list->{'id'} . " for $list_title\n" if ($verbose);
return $list->{'id'};
}
}
}
print $stdout "-- DEBUG: Could not find list ID for title: $list_title\n" if ($verbose);
return undef;
}
sub defaulteventhandle {
(&flag_default_call, return) if ($multi_module_context);
my $event_ref = shift;