fix(route/twitter): reply URL; threads when excludeReplies=1 (#14330)

Without `legacy.id_str`, reply URLs would be constructed with conversion
IDs, resulting in:
- wrong URLs: pointing to the first tweet in the conversion (thread)
- multiple items with the same guid: each tweet in a conversion (thread)
  had the same URL and thus guid

The bug was caused by the widely used temporary fix (legacy.id_str ||
legacy.conversation_id_str) after Twitter had upgraded their API. Thus,
it is quite easy to fix it:
Refill legacy.id_str using the rest_id that resides in the container of
legacy.

With it fixed, take a step further to include threads when
excludeReplies=1 (simulating the behavior of Twitter Web/App).

Signed-off-by: Rongrong <i@rong.moe>
This commit is contained in:
Rongrong
2024-01-28 00:11:32 +08:00
committed by GitHub
parent 3bab0f62bd
commit fc42bebb47
+6 -1
View File
@@ -151,6 +151,7 @@ function gatherLegacyFromData(entries, filterNested, userId) {
continue;
}
t.legacy.user = t.core?.user_result?.result?.legacy || t.core?.user_results?.result?.legacy;
t.legacy.id_str = t.rest_id; // avoid falling back to conversation_id_str elsewhere
const quote = t.quoted_status_result?.result;
if (quote) {
t.legacy.quoted_status = quote.legacy;
@@ -257,7 +258,11 @@ const getUserTweets = async (cache, id, params = {}) => {
}
const idSet = new Set();
tweets = tweets
.filter((tweet) => !tweet.in_reply_to_screen_name) // exclude replies
.filter(
(tweet) =>
!tweet.in_reply_to_user_id_str || // exclude replies
tweet.in_reply_to_user_id_str === rest_id // but include replies to self (threads)
)
.map((tweet) => {
const id_str = tweet.id_str || tweet.conversation_id_str;
return !idSet.has(id_str) && idSet.add(id_str) && tweet;