diff --git a/ttyverse.pl b/ttyverse.pl index 61118da..7e6b639 100755 --- a/ttyverse.pl +++ b/ttyverse.pl @@ -3199,7 +3199,7 @@ m#^/(un)?f(boost|a|av|ave|avorite|avourite)? ([zZ]?[a-zA-Z]?[0-9]+)$#) { } # we can't or user requested /ert /ort $repost = "boost @" . - &descape($post->{'user'}->{'screen_name'}) . + &descape($post->{'user'}->{'acct'} || $post->{'user'}->{'screen_name'}) . ": " . &descape($post->{'text'}); if ($mode eq 'e') { &add_history($repost); @@ -3397,7 +3397,7 @@ m#^/(un)?f(boost|a|av|ave|avorite|avourite)? ([zZ]?[a-zA-Z]?[0-9]+)$#) { print $stdout "-- no such post (yet?): $code\n"; return 0; } - my $target = &descape($post->{'user'}->{'screen_name'}); + my $target = &descape($post->{'user'}->{'acct'} || $post->{'user'}->{'screen_name'}); my $text = $_; $_ = '@' . $target; unless ($mode eq 'v') { @@ -3411,7 +3411,7 @@ m#^/(un)?f(boost|a|av|ave|avorite|avourite)? ([zZ]?[a-zA-Z]?[0-9]+)$#) { my %did_mentions = map { $_ => 1 } (lc($target)); my $reply_post = &descape($post->{'text'}); - while($reply_post =~ s/\@(\w+)//) { + while($reply_post =~ s/\@(\w+(?:\@[\w.-]+)?)//) { my $name = $1; my $mame = lc($name); # preserve camel case next if ($mame eq $whoami || $did_mentions{$mame}++); @@ -4514,7 +4514,11 @@ sub update_effpause { # direct messages or search, because they pull from different buckets, and # their rate limits are roughly the same. $effpause = 5*$rate_limit_rate; - # this will usually be 75s + # Cap refresh rate for fediverse servers (generous rate limits) + if ($effpause > 120) { + $effpause = 120; # Maximum 2 minutes for fediverse + } + # this will usually be 75s (Twitter) or 120s (fediverse cap) # for lists, however, we have to drain the list bucket faster, so for every # list AFTER THE FIRST ONE we subscribe to, add rate_limit_rate to slow. # for search, it has 180 requests, so we don't care so much. if this @@ -4563,6 +4567,15 @@ sub update_effpause { # } else { # $rate_limit_next-- unless ($anonymous); # } + + # Fediverse fallback: ensure auto-refresh works even if rate limiting fails + if (defined($pause) && $pause eq 'auto' && (!defined($effpause) || $effpause == 0)) { + $effpause = 120; # 2 minutes - consistent with fediverse cap + print $stdout "-- using fallback refresh rate: $effpause seconds\n"; + } + + # Debug: always show current effpause value + print $stdout "-- current effpause: " . (defined($effpause) ? $effpause : 'undefined') . " seconds\n" if ($verbose); } # streaming API support routines @@ -5663,7 +5676,7 @@ sub standardpost { my $ref = shift; my $nocolour = shift; - my $sn = &descape($ref->{'user'}->{'screen_name'}); + my $sn = &descape($ref->{'user'}->{'acct'} || $ref->{'user'}->{'screen_name'}); my $post = &descape($ref->{'text'}); # Debug boost display @@ -5776,8 +5789,8 @@ sub standardevent { # ActivityPub streaming API messages if (length($verb)) { # see below for server-level events - my $tar_sn = '@'.&descape($ref->{'target'}->{'screen_name'}); - my $sou_sn = '@'.&descape($ref->{'source'}->{'screen_name'}); + my $tar_sn = '@'.&descape($ref->{'target'}->{'acct'} || $ref->{'target'}->{'screen_name'}); + my $sou_sn = '@'.&descape($ref->{'source'}->{'acct'} || $ref->{'source'}->{'screen_name'}); my $tar_list_name = ''; my $tar_list_desc = ''; @@ -6123,7 +6136,7 @@ sub defaulthandle { my $post_ref = shift; my $class = shift; my $dclass = ($verbose) ? "{$class,$post_ref->{'id_str'}} " : ''; - my $sn = &descape($post_ref->{'user'}->{'screen_name'}); + my $sn = &descape($post_ref->{'user'}->{'acct'} || $post_ref->{'user'}->{'screen_name'}); my $post = &descape($post_ref->{'text'}); # Debug: Check what data defaulthandle receives for boost posts @@ -6174,7 +6187,7 @@ sub sendnotifies { # this is a default subroutine of a sort, right? my $post_ref = shift; my $class = shift; - my $sn = &descape($post_ref->{'user'}->{'screen_name'}); + my $sn = &descape($post_ref->{'user'}->{'acct'} || $post_ref->{'user'}->{'screen_name'}); my $post = &descape($post_ref->{'text'}); # interactive? first time? @@ -7599,14 +7612,11 @@ sub normalizejson { $i->{'reblog'} = $rt; # Get original author and content - my $original_author = $rt->{'user'}->{'screen_name'} || 'unknown_user'; + my $original_author = $rt->{'user'}->{'acct'} || $rt->{'user'}->{'screen_name'} || 'unknown_user'; my $content = $rt->{'text'} || ''; # Get booster (who shared this) - my $booster = $i->{'user'}->{'screen_name'} || 'unknown_booster'; - if (exists($i->{'user'}->{'acct'})) { - $booster = $i->{'user'}->{'acct'}; - } + my $booster = $i->{'user'}->{'acct'} || $i->{'user'}->{'screen_name'} || 'unknown_booster'; print $stdout "-- DEBUG: Boost - original: '$original_author', booster: '$booster', content: '$content'\n" if ($verbose);