View on GitHub

LinqToTwitter

LINQ Provider for the Twitter API (C# Twitter Library)

Filtered Stream

Return tweets matching given filters.

Type: StreamingType.Filter

Parameters:
Name Purpose Type Required
Expansions Comma-separated list of expansion fields string (ExpansionField) no
MediaFields Comma-separated list of fields to return in the media object string (MediaField) no
PlaceFields Comma-separated list of fields to return in the place object string (PlaceField) no
PollFields Comma-separated list of fields to return in the poll object string (PollField) no
TweetFields Comma-separated list of fields to return in the Tweet object string (TweetField) no
UserFields Comma-separated list of fields to return in the User object string (UserField) no

Return Type: StreamContent.

Important!: You need to use AddStreamingFilterRulesAsync and DeleteStreamingFilterRulesAsync to set/remove stream filters. See Managing Rules section below:

Example:
static async Task DoFilterStreamAsync(TwitterContext twitterCtx)
{
	Console.WriteLine("\nStreamed Content: \n");
	int count = 0;
	var cancelTokenSrc = new CancellationTokenSource();

	try
	{
		await
			(from strm in twitterCtx.Streaming
									.WithCancellation(cancelTokenSrc.Token)
			 where strm.Type == StreamingType.Filter
			 select strm)
			.StartAsync(async strm =>
			{
				await HandleStreamResponse(strm);

				if (count++ >= 5)
					cancelTokenSrc.Cancel();
			});
	}
	catch (IOException ex)
	{
		// Twitter might have closed the stream,
		// which they do sometimes. You should
		// restart the stream, but be sure to
		// read Twitter documentation on stream
		// back-off strategies to prevent your
		// app from being blocked.
		Console.WriteLine(ex.ToString());
	}
	catch (OperationCanceledException)
	{
		Console.WriteLine("Stream cancelled.");
	}
}

static async Task<int> HandleStreamResponse(StreamContent strm)
{
	if (strm.HasError)
	{
		Console.WriteLine($"Error during streaming: {strm.ErrorMessage}");
	}
	else
	{
		Tweet? tweet = strm?.Entity?.Tweet;
		if (tweet != null)
			Console.WriteLine($"\nTweet ID: {tweet.ID}, Tweet Text: {tweet.Text}");
	}

	return await Task.FromResult(0);
}

Managing Rules:

static async Task ValidateRulesAsync(TwitterContext twitterCtx)
{
	var rules = new List<StreamingAddRule>
	{
		new StreamingAddRule { Tag = "memes with media", Value = "meme has:images" },
		new StreamingAddRule { Tag = "cats with media", Value = "cat has:media" }
	};

	Streaming? result = await twitterCtx.AddStreamingFilterRulesAsync(rules, isValidateOnly: true);

	if (result?.Meta?.Summary != null)
	{
		StreamingMeta meta = result.Meta;
		Console.WriteLine($"\nSent: {meta.Sent}");

		StreamingMetaSummary summary = meta.Summary;

		Console.WriteLine($"Created:  {summary.Created}");
		Console.WriteLine($"!Created: {summary.NotCreated}");
	}

	if (result?.Errors != null && result.HasErrors)
		result.Errors.ForEach(error =>
			Console.WriteLine(
				$"\nTitle: {error.Title}" +
				$"\nValue: {error.Value}" +
				$"\nID:    {error.ID}" +
				$"\nType:  {error.Type}"));
}

static async Task AddRulesAsync(TwitterContext twitterCtx)
{
	var rules = new List<StreamingAddRule>
	{
		new StreamingAddRule { Tag = "funny things", Value = "meme" },
		new StreamingAddRule { Tag = "happy cats with media", Value = "cat has:media -grumpy" }
	};

	Streaming? result = await twitterCtx.AddStreamingFilterRulesAsync(rules);

	StreamingMeta? meta = result?.Meta;

	if (meta?.Summary != null)
	{
		Console.WriteLine($"\nSent: {meta.Sent}");

		StreamingMetaSummary summary = meta.Summary;

		Console.WriteLine($"Created:  {summary.Created}");
		Console.WriteLine($"!Created: {summary.NotCreated}");
	}

	if (result?.Errors != null && result.HasErrors)
		result.Errors.ForEach(error => 
			Console.WriteLine(
				$"\nTitle: {error.Title}" +
				$"\nValue: {error.Value}" +
				$"\nID:    {error.ID}" +
				$"\nType:  {error.Type}"));
}

static async Task DeleteRulesAsync(TwitterContext twitterCtx)
{
	var ruleIds = new List<string>
	{
		"1165037377523306498",
		"1165037377523306499"
	};

	Streaming? result = await twitterCtx.DeleteStreamingFilterRulesAsync(ruleIds);

	if (result?.Meta?.Summary != null)
	{
		StreamingMeta meta = result.Meta;
		Console.WriteLine($"\nSent: {meta.Sent}");

		StreamingMetaSummary summary = meta.Summary;

		Console.WriteLine($"Deleted:  {summary.Deleted}");
		Console.WriteLine($"!Deleted: {summary.NotDeleted}");
	}

	if (result?.Errors != null && result.HasErrors)
		result.Errors.ForEach(error =>
			Console.WriteLine(
				$"\nTitle: {error.Title}" +
				$"\nValue: {error.Value}" +
				$"\nID:    {error.ID}" +
				$"\nType:  {error.Type}"));
}

Twitter API: tweets/search/stream