Esempio n. 1
0
        private async Task SyncSubscribers(long idGroup)
        {
            await Start(idGroup, SyncType.Subscribers);

            var vkApi = await _vkPoolService.GetGroupVkApi(idGroup);

            long offset = 0, count = 1000;

            do
            {
                var vkMembers = await vkApi.Groups.GetMembersAsync(new VkNet.Model.RequestParams.GroupsGetMembersParams()
                {
                    GroupId = idGroup.ToString(),
                    Count   = count,
                    Offset  = offset,
                    Fields  = UsersFields.BirthDate | UsersFields.City | UsersFields.Country | UsersFields.Domain | UsersFields.Photo50 | UsersFields.Photo400Orig | UsersFields.Sex | UsersFields.Sex,
                });

                await Progress(idGroup, SyncType.Subscribers, vkMembers.TotalCount, (ulong)offset);

                foreach (var vkMember in vkMembers)
                {
                    using (var transaction = await _context.Database.BeginTransactionAsync())
                    {
                        try
                        {
                            var vkUser = await _context.VkUsers.FirstOrDefaultAsync(x => x.IdVk == vkMember.Id);

                            if (vkUser == null)
                            {
                                vkUser = VkUsers.FromUser(vkMember);
                                await _context.VkUsers.AddAsync(vkUser);

                                await _context.SaveChangesAsync();
                            }
                            else
                            {
                                vkUser.Update(vkMember);
                            }

                            var subscriber = await _context.Subscribers
                                             .Where(x => x.IdGroup == idGroup)
                                             .FirstOrDefaultAsync(x => x.IdVkUser == vkMember.Id);

                            if (subscriber == null)
                            {
                                subscriber = new Subscribers()
                                {
                                    IdGroup   = idGroup,
                                    IdVkUser  = vkMember.Id,
                                    IsBlocked = vkMember.Blacklisted,
                                    DtAdd     = DateTime.UtcNow
                                };
                                await _context.Subscribers.AddAsync(subscriber);
                            }
                            subscriber.IsSubscribedToGroup = true;

                            await _context.SaveChangesAsync();

                            transaction.Commit();
                        }
                        catch
                        {
                            transaction.Rollback();
                        }
                    }
                }

                offset += count;
                if (offset >= vkMembers.Count)
                {
                    break;
                }

                await Progress(idGroup, SyncType.Subscribers, vkMembers.TotalCount, (ulong)offset);
            } while (true);
            await Finish(idGroup, SyncType.Subscribers);
        }
Esempio n. 2
0
        private async Task SyncChats(long idGroup)
        {
            await Start(idGroup, SyncType.Chats);

            var vkApi = await _vkPoolService.GetGroupVkApi(idGroup);

            ulong offset = 0, count = 100;

            do
            {
                var conversationsInfo = await vkApi.Messages.GetConversationsAsync(new VkNet.Model.RequestParams.GetConversationsParams()
                {
                    Count    = count,
                    Offset   = offset,
                    Extended = true,
                    Fields   = new string[] { "bdate", "city", "country", "domain", "photo_50", "sex", "blacklisted" }
                });// VkConnector.Methods.Messages.GetConversations(groupAccessToken, idGroup, "bdate,city,country,domain,photo_50,sex,blacklisted", offset, count);

                if (conversationsInfo == null)
                {
                    System.Threading.Thread.Sleep(1000);
                    continue;
                }

                await Progress(idGroup, SyncType.Chats, (ulong)conversationsInfo.Count, offset);

                foreach (var vkMember in conversationsInfo.Profiles)
                {
                    using (var transaction = await _context.Database.BeginTransactionAsync())
                    {
                        try
                        {
                            var vkUser = await _context.VkUsers.FirstOrDefaultAsync(x => x.IdVk == vkMember.Id);

                            if (vkUser == null)
                            {
                                vkUser = VkUsers.FromUser(vkMember);
                                await _context.AddAsync(vkUser);
                            }
                            else
                            {
                                vkUser.Update(vkMember);
                            }
                            await _context.SaveChangesAsync();

                            var subscriber = await _context.Subscribers
                                             .Where(x => x.IdGroup == idGroup)
                                             .FirstOrDefaultAsync(x => x.IdVkUser == vkMember.Id);

                            if (subscriber == null)
                            {
                                subscriber = new Subscribers()
                                {
                                    IdGroup   = idGroup,
                                    IdVkUser  = vkMember.Id,
                                    IsBlocked = vkMember.Blacklisted,
                                    DtAdd     = DateTime.UtcNow
                                };
                                await _context.AddAsync(subscriber);
                            }
                            subscriber.IsChatAllowed = conversationsInfo.Items
                                                       .Where(x => x.Conversation != null && x.Conversation.Peer != null && x.Conversation.Peer.Id == vkMember.Id)
                                                       .Select(x => x.Conversation?.CanWrite?.Allowed)
                                                       .FirstOrDefault();

                            await _context.SaveChangesAsync();

                            transaction.Commit();
                        }
                        catch
                        {
                            transaction.Rollback();
                        }
                    }
                }

                offset += count;
                if (offset >= (ulong)conversationsInfo.Count)
                {
                    break;
                }

                await Progress(idGroup, SyncType.Chats, (ulong)conversationsInfo.Count, offset);
            } while (true);
            await Finish(idGroup, SyncType.Chats);
        }
Esempio n. 3
0
        public static async Task <Subscribers> CreateSubscriber(DatabaseContext _context, VkPoolService _vkPoolService, long idGroup, long?idVkUser)
        {
            if (!idVkUser.HasValue || idVkUser.Value <= 0)
            {
                return(null);
            }
            var subscriber = await _context.Subscribers.FirstOrDefaultAsync(x => x.IdGroup == idGroup && x.IdVkUser == idVkUser.Value);

            if (subscriber != null)
            {
                return(subscriber);
            }

            var vkUser = await _context.VkUsers.FirstOrDefaultAsync(x => x.IdVk == idVkUser.Value);

            if (vkUser == null)
            {
                try
                {
                    var vkApi = await _vkPoolService.GetGroupVkApi(idGroup);

                    if (vkApi == null)
                    {
                        return(null);
                    }

                    var users = await vkApi.Users.GetAsync(new long[] { idVkUser.Value }, VkNet.Enums.Filters.ProfileFields.BirthDate |
                                                           VkNet.Enums.Filters.ProfileFields.City |
                                                           VkNet.Enums.Filters.ProfileFields.Country |
                                                           VkNet.Enums.Filters.ProfileFields.FirstName |
                                                           VkNet.Enums.Filters.ProfileFields.LastName |
                                                           VkNet.Enums.Filters.ProfileFields.Nickname |
                                                           VkNet.Enums.Filters.ProfileFields.Domain |
                                                           VkNet.Enums.Filters.ProfileFields.Photo50 |
                                                           VkNet.Enums.Filters.ProfileFields.Photo400Orig |
                                                           VkNet.Enums.Filters.ProfileFields.Sex |
                                                           VkNet.Enums.Filters.ProfileFields.Blacklisted);

                    if (users == null || !users.Any())
                    {
                        return(null);
                    }

                    vkUser = VkUsers.FromUser(users.FirstOrDefault());
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Ошибка при запросе users.get с id={idVkUser}{Environment.NewLine}{ex.Message}{Environment.NewLine}{ex.StackTrace}");
                    return(null);
                }

                _context.VkUsers.Update(vkUser);
            }

            subscriber = new Subscribers()
            {
                IdVkUser = vkUser.IdVk,
                IdGroup  = idGroup,
                DtAdd    = DateTime.UtcNow
            };
            await _context.Subscribers.AddAsync(subscriber);

            await _context.SaveChangesAsync();

            return(subscriber);
        }