public void TweetTask(string text, bool displayMsg = true) { RateLimit.RateLimitTrackerMode = RateLimitTrackerMode.TrackAndAwait; //to avoid ratelimits, let Tweetinvi handle it var embed = new EmbedBuilder(); if (stream == null) { stream = Stream.CreateFilteredStream(); //create a stream for the live feed } foreach (var feed in twitterFeeds) { stream.AddFollow(User.GetUserFromScreenName(feed.twitterUser)); //set the stream to follow said user(s) } stream.MatchingTweetReceived += async(sender, args) => { var tweet = args.Tweet; foreach (var feed in twitterFeeds) { if (tweet.CreatedBy.ScreenName == feed.twitterUser) //if the twitter screen name matches a saved screen name... { embed = new EmbedBuilder(); embed.WithAuthor($"{tweet.CreatedBy.Name} (@{tweet.CreatedBy.ScreenName})", tweet.CreatedBy.ProfileImageUrl, tweet.Url); embed.WithDescription(tweet.Text); embed.WithColor(0, 172, 237); //Twitter blue if (tweet.Media.Count > 0) { embed.WithImageUrl(tweet.Media[0].MediaURL); } foreach (var channel in feed.channels) //post the embedded tweet in every channel { await channel.SendMessageAsync("", false, embed.Build()); } break; } } }; stream.StreamStopped += (sender, args) => { if (args.Exception != null) { Console.WriteLine(args.Exception); } }; var MainThread = new Thread(() => stream.StartStreamMatchingAnyConditionAsync()); MainThread.Start(); MainThread = new Thread(async() => { if (!String.IsNullOrWhiteSpace(text) && displayMsg) { var msg = await ReplyAsync($"`Live feed is now hooked into @{text}.`"); await Task.Delay(2000); await msg.DeleteAsync(); } else if (!displayMsg) { var msg = await ReplyAsync($"`The live feed of @{text} has been removed.`"); await Task.Delay(2000); await msg.DeleteAsync(); } await Context.Client.SetGameAsync($"{twitterFeeds.Count} user's Twitter feed", null, ActivityType.Listening); while (true) { Thread.Sleep(2000); if (!running) { stream.StopStream(); stream.ClearFollows(); await Context.Client.SetGameAsync(null); break; } } }); MainThread.Start(); MainThread.IsBackground = true; }