async Task ITimedService.Callback() { using (var db = new TwitterContext(dbOptions)) { foreach (var user in db.TwitterBindings.Include(b => b.ChannelBindings)) { var response = await twitterSession.GetUserTimeline(user.TwitterUsername); var newestCreationTime = response.FirstOrDefault()?.Time.DateTime ?? DateTime.UtcNow; var postStack = new Stack <Embed>(); foreach (var tweet in response) { if (tweet.Time.DateTime <= user.LatestPost) { break; } var embed = new EmbedBuilder() .WithUrl($"https://twitter.com/{tweet.User.ScreenName}/status/{tweet.Id}") .WithDescription(tweet.Text) .WithThumbnailUrl(tweet.User.Avatar) .WithColor(ModuleColor); embed.Title = tweet.IsARetweet() ? $"{tweet.RetweetedStatus.User.Name} (retweeted by @{tweet.User.ScreenName})" : $"{tweet.User.Name} (@{tweet.User.ScreenName})"; postStack.Push(embed.Build()); } if (newestCreationTime > user.LatestPost) { user.LatestPost = newestCreationTime; } foreach (var embed in postStack) { foreach (var channelBinding in user.ChannelBindings) { if (client.GetChannel(channelBinding.ChannelId) is IMessageChannel channel) { await channel.SendEmbedAsync(embed); } } } db.TwitterBindings.Update(user); } await db.SaveChangesAsync(); } }