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); }
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); }
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); }