示例#1
0
        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();
            }
        }