예제 #1
0
        public List <UserExtended> GetGroupPostsLickers(long groupId, List <long> blackListedUserIds, DateTime minPostDate)
        {
            var users = new List <UserExtended>();

            try
            {
                using (var api = _apiFactory.CreateVkApi(true))
                {
                    var wallPosts = GetPostsByGroupId(groupId, api, minPostDate)
                                    .Where(x => x.Date >= minPostDate)
                                    .Select(x => x);

                    foreach (var wallPost in wallPosts)
                    {
                        var usersChunk      = new List <UserExtended>();
                        var affectedUserIds = users.Select(x => x.Id).Distinct().ToList();

                        if (!wallPost.OwnerId.HasValue || !wallPost.Id.HasValue)
                        {
                            continue;
                        }

                        Console.WriteLine($"Get information for {wallPost.GetPostUrl()} {wallPost.Date}");

                        var likerIds = _likeService.GetUsersWhoLiked(wallPost.OwnerId.Value, wallPost.Id.Value,
                                                                     LikeObjectType.Post, api);

                        likerIds = likerIds.Where(id => !affectedUserIds.Contains(id) && !blackListedUserIds.Contains(id))
                                   .Select(id => id)
                                   .Distinct()
                                   .ToList();

                        Console.WriteLine($"likerIds count is {likerIds.Count}");
                        var usersToAdd = likerIds.Select(x => new UserExtended(new User {
                            Id = x
                        })).ToList();
                        usersChunk.AddRange(usersToAdd);

                        var ownerId         = -wallPost.OwnerId.Value;
                        var profiles        = new List <User>();
                        var commentsForPost =
                            _commentService.GetComments(0 - ownerId, wallPost.Id.Value, api, ref profiles);

                        Console.WriteLine($"comments count is {commentsForPost.Count}");

                        var totalCommentsLikersCount = 0;
                        foreach (var comment in commentsForPost)
                        {
                            if (comment.FromId.HasValue && comment.FromId.Value > 0)
                            {
                                var commentOwnerAffected = usersChunk.Select(x => x.Id).Contains(comment.FromId.Value) ||
                                                           affectedUserIds.Contains(comment.FromId.Value) ||
                                                           blackListedUserIds.Contains(comment.FromId.Value);

                                if (comment.Thread.Items.Any())
                                {
                                }

                                if (!commentOwnerAffected)
                                {
                                    var profile = profiles.FirstOrDefault(x => x.Id == comment.FromId);
                                    if (profile != null)
                                    {
                                        usersChunk.Add(profile.ToExtendedModel());
                                    }
                                    else
                                    {
                                        usersChunk.Add(new UserExtended(new User {
                                            Id = comment.FromId.Value
                                        }));
                                    }
                                }
                            }

                            var commentLikerIds = _likeService.GetUsersWhoLiked(wallPost.OwnerId.Value, comment.Id,
                                                                                LikeObjectType.Comment, api);

                            totalCommentsLikersCount += commentLikerIds.Count;

                            var usersChunkIds = usersChunk.Select(x => x.Id).Distinct().ToList();
                            commentLikerIds = commentLikerIds
                                              .Where(id => !usersChunkIds.Contains(id) &&
                                                     !affectedUserIds.Contains(id) &&
                                                     !blackListedUserIds.Contains(id))
                                              .Distinct()
                                              .ToList();

                            usersChunk.AddRange(commentLikerIds.Select(x => new UserExtended(new User {
                                Id = x
                            })).ToList());
                        }

                        Console.WriteLine($"totalCommentsLikersCount count is {totalCommentsLikersCount}");

                        var newUsers = usersChunk.Where(u => !blackListedUserIds.Contains(u.Id)).Select(u => u).ToList();

                        var newUsersMessage = string.Join(", ", newUsers.Select(x => x.GetDomainForUser()));
                        Console.WriteLine($"newUsers count is {newUsers.Count}");
                        Console.WriteLine($"newUsers are {newUsersMessage}");
                        Console.WriteLine($"Total new users count is {users.Count}");

                        users.AddRange(usersChunk);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"{e.Message}");
            }

            users = users
                    .Where(u => !blackListedUserIds.Contains(u.Id))
                    .Select(u => u)
                    .ToList();
            return(users);
        }