twitterlinq-to-twitter

Empty FullText property with Tweetmode.Extended [update May 30th]


I'm programming a .Net Core (2.1 preview, C# 7.3) Streaming Console App with L2T (5.0.0 beta 2) but even with the strm.TweetMode == TweetMode.Extended the query gives "compat" tweets back, the FullText property is empty.

You can reproduce this with the L2T query below.

I searched online, I've found something similar (with 'search' instead of 'Streaming') but no answers, except to add && strm.TweetMode == TweetMode.Extended, which I did.

Any ideas?

        try
        {
            await
                (from strm in twitterCtx.Streaming
                        .WithCancellation(cancelTokenSrc.Token)
                 where
                    strm.Type == StreamingType.Filter
                    && strm.Track == "twitter"
                    && strm.Language == "nl"
                    && strm.TweetMode == TweetMode.Extended
                 select strm)
                .StartAsync(async strm =>
                {
                    await HandleStreamResponse(strm);
                    if (count++ >= 20)
                        cancelTokenSrc.Cancel();
                });
        }

[Update May 30th]

Found something. It's in the subroutine "HandleStreamResponse" (code below). The Status.TweetMode and Status.ExtendedTweet.TweetMode both return "Compat" for all tweets, but the full text of a tweet is in status.ExtendedTweet.FullText

But even with this check, retweets are truncated to 140 chars max. I do not need retweets for my progam so I filter them out.

I do not know, yet, how to filter retweets from a stream directly (is it possible?), so I check the retweetstatus of the Status from the stream result. It's in the code below.

FYI: In the examples of Linq To Twitter for this subroutine Joe Mayo uses the following line of code, but that doesn't work: Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse, status.Text ?? status.FullText);

Even with && strm.TweetMode == TweetMode.Extended in the L2T query, the status.FullText is empty.

There is more code than neccesary in the example below, but I used it for clarity.

static async Task<int> HandleStreamResponse(StreamContent strm)
    {
        switch (strm.EntityType)
        {
            case StreamEntityType.Status:
                var status = strm.Entity as Status;

                if (status.RetweetedStatus.StatusID == 0)
                {
                    if (status.ExtendedTweet.FullText != null)
                    {
                        Console.WriteLine("Longer than 140 - \"@{0}\": {1} (TweetMode:{2})", 
                            status.User.ScreenNameResponse, status.ExtendedTweet.FullText, status.TweetMode);
                    }
                    else
                    {
                        Console.WriteLine("Shorter than 140 - \"@{0}\": {1} (TweetMode:{2})", 
                            status.User.ScreenNameResponse, status.Text, status.TweetMode);
                    }
                }

                // Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse,  status.Text ?? status.FullText);
                break;
            default:
                Console.WriteLine("Unknown - " + strm.Content + "\n");
                break;
        }
        return await Task.FromResult(0);
    }
}

Solution

  • Here are my observations:

    1. status.ExtentendedTweet.FullText should hold the tweet in normal circumstances.
    2. However, if the tweet is retweeted, then status.RetweetedStatus.ExtendedTweet.FullText should hold the tweet.
    3. If you can't find the FullText in either of those circumstances, use status.Text.

    I'm updating the sample with the following:

        case StreamEntityType.Status:
            var status = strm.Entity as Status;
            string text = null;
            if (status.ExtendedTweet?.FullText != null)
                text = status.ExtendedTweet?.FullText;
            else if (status.RetweetedStatus?.ExtendedTweet?.FullText != null)
                text = status.RetweetedStatus?.ExtendedTweet?.FullText;
            else
                text = status.Text;
    
            Console.WriteLine("Status - @{0}: {1}", status.User.ScreenNameResponse, text);
            break;
    

    Note: Via Twitter documentation (see Standard Streams), TweetMode doesn't apply to streams. Additionally, the docs say the ExtentedTweet should always be there with FullText. As we can see, that isn't the full picture in practice. I'll mark Streaming.TweetMode as obsolete in upcoming releases.