#137 Добавление в метод Users.Search функционала

This commit is contained in:
Inyutin Maxim 2015-10-20 13:30:35 +03:00
parent ca84d2e30b
commit ffdc73e0fe
7 changed files with 619 additions and 288 deletions

View file

@ -1,4 +1,6 @@
namespace VkNet.Tests.Categories
using VkNet.Model.RequestParams.Users;
namespace VkNet.Tests.Categories
{
using System;
using System.Collections.ObjectModel;
@ -356,7 +358,7 @@
{
var vk = new VkApi();
int count;
This.Action(() => vk.Users.Search(Query, out count)).Throws<AccessTokenInvalidException>();
This.Action(() => vk.Users.Search(out count, new UserSearchParams { Query = Query })).Throws<AccessTokenInvalidException>();
}
[Test]
@ -364,16 +366,16 @@
{
int count;
var vk = new VkApi { AccessToken = "token" };
This.Action(() => vk.Users.Search("", out count)).Throws<ArgumentException>()
This.Action(() => vk.Users.Search(out count, new UserSearchParams { Query = "" })).Throws<ArgumentException>()
.Message.ShouldEqual("Query can not be null or empty.");
}
[Test]
public void Search_BadQuery_EmptyList()
{
const string url = "https://api.vk.com/method/users.search?q=fa'sosjvsoidf&count=20&access_token=token";
const string url = "https://api.vk.com/method/users.search?q=fa'sosjvsoidf&sort=0&offset=0&count=20&sex=0&status=0&online=0&has_photo=0&access_token=token";
const string json =
const string json =
@"{
'response': [
0
@ -382,7 +384,7 @@
int count;
var users = GetMockedUsersCategory(url, json);
var lst = users.Search("fa'sosjvsoidf", out count).ToList();
var lst = users.Search(out count, new UserSearchParams { Query = "fa'sosjvsoidf" }).ToList();
Assert.That(count, Is.EqualTo(0));
Assert.That(lst, Is.Not.Null);
@ -392,9 +394,9 @@
[Test]
public void Search_EducationField_ListofProfileObjects()
{
const string url = "https://api.vk.com/method/users.search?q=Masha Ivanova&fields=education&count=3&offset=123&access_token=token";
const string url = "https://api.vk.com/method/users.search?q=Masha Ivanova&sort=0&offset=123&count=3&fields=education&sex=0&status=0&online=0&has_photo=0&access_token=token";
const string json =
const string json =
@"{
'response': [
26953,
@ -433,7 +435,7 @@
int count;
var users = GetMockedUsersCategory(url, json);
var lst = users.Search(Query, out count, ProfileFields.Education, 3, 123).ToList();
var lst = users.Search(out count, new UserSearchParams { Query = Query, Fields = ProfileFields.Education,Count = 3, Offset = 123}).ToList();
Assert.That(count, Is.EqualTo(26953));
Assert.That(lst.Count, Is.EqualTo(3));
@ -459,9 +461,8 @@
[Test]
public void Search_DefaultFields_ListOfProfileObjects()
{
const string url = "https://api.vk.com/method/users.search?q=Masha Ivanova&count=20&access_token=token";
const string json =
const string url = "https://api.vk.com/method/users.search?q=Masha Ivanova&sort=0&offset=0&count=20&sex=0&status=0&online=0&has_photo=0&access_token=token";
const string json =
@"{
'response': [
26953,
@ -485,7 +486,7 @@
int count;
var users = GetMockedUsersCategory(url, json);
var lst = users.Search(Query, out count).ToList();
var lst = users.Search(out count, new UserSearchParams { Query = Query }).ToList();
Assert.That(count, Is.EqualTo(26953));
Assert.That(lst.Count, Is.EqualTo(3));

View file

@ -1,320 +1,352 @@
namespace VkNet.Categories
using VkNet.Model.RequestParams.Users;
namespace VkNet.Categories
{
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using JetBrains.Annotations;
using Enums.Filters;
using Enums.SafetyEnums;
using Model;
using Utils;
using Enums.Filters;
using Enums.SafetyEnums;
using Model;
using Utils;
/// <summary>
/// Методы для работы с информацией о пользователях.
/// </summary>
public class UsersCategory
{
private readonly VkApi _vk;
/// <summary>
/// Методы для работы с информацией о пользователях.
/// </summary>
public class UsersCategory
{
private readonly VkApi _vk;
internal UsersCategory(VkApi vk)
{
_vk = vk;
}
internal UsersCategory(VkApi vk)
{
_vk = vk;
}
/// <summary>
/// Возвращает список пользователей в соответствии с заданным критерием поиска.
/// </summary>
/// <param name="query">Строка поискового запроса. Например, Вася Бабич.</param>
/// <param name="itemsCount">Общее количество пользователей, удовлетворяющих условиям запроса.</param>
/// <param name="fields">Список дополнительных полей, которые необходимо вернуть.</param>
/// <param name="count">Количество возвращаемых пользователей.
/// Обратите внимание — даже при использовании параметра offset для получения информации доступны только первые 1000 результатов.
/// </param>
/// <param name="offset">Смещение относительно первого найденного пользователя для выборки определенного подмножества.</param>
/// <returns>
/// После успешного выполнения возвращает список объектов пользователей, найденных в соответствии с заданными критериями.
/// </returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.search"/>.
/// </remarks>
[Pure]
public ReadOnlyCollection<User> Search([NotNull] string query, out int itemsCount, ProfileFields fields = null, int count = 20, int offset = 0)
{
if (string.IsNullOrEmpty(query))
throw new ArgumentException("Query can not be null or empty.");
/// <summary>
/// Возвращает список пользователей в соответствии с заданным критерием поиска.
/// </summary>
/// <param name="itemsCount">Общее количество пользователей, удовлетворяющих условиям запроса.</param>
/// <param name="params">Параметры запроса.</param>
/// <returns>
/// После успешного выполнения возвращает список объектов пользователей, найденных в соответствии с заданными критериями.
/// </returns>
/// <exception cref="ArgumentException">Query can not be <c>null</c> or empty.</exception>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.search" />.
/// </remarks>
[Pure]
public ReadOnlyCollection<User> Search(out int itemsCount, UserSearchParams @params)
{
if (string.IsNullOrWhiteSpace(@params.Query))
{
throw new ArgumentException("Query can not be null or empty.");
}
var parameters = new VkParameters
{
{ "q", @params.Query },
{ "sort", @params.Sort },
{ "offset", @params.Offset },
{ "count", @params.Count },
{ "fields", @params.Fields },
{ "city", @params.City },
{ "country", @params.Country },
{ "hometown", @params.Hometown },
{ "university_country", @params.UniversityCountry },
{ "university", @params.University },
{ "university_year", @params.UniversityYear },
{ "university_faculty", @params.UniversityFaculty },
{ "university_chair", @params.UniversityChair },
{ "sex", @params.Sex },
{ "status", @params.Status },
{ "age_from", @params.AgeFrom },
{ "age_to", @params.AgeTo },
{ "birth_day", @params.BirthDay },
{ "birth_month", @params.BirthMonth },
{ "birth_year", @params.BirthYear },
{ "online", @params.Online },
{ "has_photo", @params.HasPhoto },
{ "school_country", @params.SchoolCountry },
{ "school_city", @params.SchoolCity },
{ "school_class", @params.SchoolClass },
{ "school", @params.School },
{ "school_year", @params.SchoolYear },
{ "religion", @params.Religion },
{ "interests", @params.Interests },
{ "company", @params.Company },
{ "position", @params.Position },
{ "group_id", @params.GroupId },
{ "from_list", @params.FromList }
var parameters = new VkParameters { { "q", query }, { "fields", fields }, { "count", count } };
if (offset > 0)
parameters.Add("offset", offset);
};
VkResponseArray response = _vk.Call("users.search", parameters);
VkResponseArray response = _vk.Call("users.search", parameters);
itemsCount = response[0];
itemsCount = response[0];
return response.Skip(1).ToReadOnlyCollectionOf<User>(r => r);
}
return response.Skip(1).ToReadOnlyCollectionOf<User>(r => r);
}
/// <summary>
/// Получает настройки текущего пользователя в данном приложении. .
/// </summary>
/// <param name="uid">идентификатор пользователя, информацию о настройках которого необходимо получить.</param>
/// <returns>После успешного выполнения возвращает битовую маску настроек текущего пользователя в данном приложении.
///
/// Пример:
/// Если Вы хотите получить права на Доступ к друзьям и Доступ к статусам пользователя, то Ваша битовая маска будет
/// равна: 2 + 1024 = 1026.
/// Если, имея битовую маску 1026, Вы хотите проверить, имеет ли она доступ к друзьям — Вы можете сделать 1026 &amp; 2.
/// </returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/getUserSettings"/>.
/// </remarks>
[Pure]
public int GetUserSettings(long uid)
{
var parameters = new VkParameters { { "uid", uid } };
/// <summary>
/// Получает настройки текущего пользователя в данном приложении. .
/// </summary>
/// <param name="uid">идентификатор пользователя, информацию о настройках которого необходимо получить.</param>
/// <returns>После успешного выполнения возвращает битовую маску настроек текущего пользователя в данном приложении.
///
/// Пример:
/// Если Вы хотите получить права на Доступ к друзьям и Доступ к статусам пользователя, то Ваша битовая маска будет
/// равна: 2 + 1024 = 1026.
/// Если, имея битовую маску 1026, Вы хотите проверить, имеет ли она доступ к друзьям — Вы можете сделать 1026 &amp; 2.
/// </returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/getUserSettings"/>.
/// </remarks>
[Pure]
public int GetUserSettings(long uid)
{
var parameters = new VkParameters { { "uid", uid } };
return _vk.Call("getUserSettings", parameters);
}
return _vk.Call("getUserSettings", parameters);
}
/// <summary>
/// Возвращает информацию о том, установил ли пользователь приложение.
/// </summary>
/// <param name="userId">Идентификатор пользователя.</param>
/// <returns>После успешного выполнения возвращает true в случае, если пользователь установил у себя данное приложение,
/// иначе false.
/// </returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/isAppUser"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public bool IsAppUser(long userId)
{
var parameters = new VkParameters { { "user_id", userId } };
/// <summary>
/// Возвращает информацию о том, установил ли пользователь приложение.
/// </summary>
/// <param name="userId">Идентификатор пользователя.</param>
/// <returns>После успешного выполнения возвращает true в случае, если пользователь установил у себя данное приложение,
/// иначе false.
/// </returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/isAppUser"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public bool IsAppUser(long userId)
{
var parameters = new VkParameters { { "user_id", userId } };
VkResponse response = _vk.Call("users.isAppUser", parameters);
VkResponse response = _vk.Call("users.isAppUser", parameters);
return 1 == Convert.ToInt32(response.ToString());
}
return 1 == Convert.ToInt32(response.ToString());
}
/// <summary>
/// Возвращает расширенную информацию о пользователе.
/// </summary>
/// <param name="userId">Идентификатор пользователя.</param>
/// <param name="fields">Поля профиля, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Объект, содержащий запрошенную информацию о пользователе.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/getProfiles"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public User Get(long userId, ProfileFields fields = null,
NameCase nameCase = null)
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
/// <summary>
/// Возвращает расширенную информацию о пользователе.
/// </summary>
/// <param name="userId">Идентификатор пользователя.</param>
/// <param name="fields">Поля профиля, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Объект, содержащий запрошенную информацию о пользователе.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/getProfiles"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public User Get(long userId, ProfileFields fields = null,
NameCase nameCase = null)
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
var parameters = new VkParameters { { "fields", fields }, { "name_case", nameCase }, { "user_ids", userId } };
var parameters = new VkParameters { { "fields", fields }, { "name_case", nameCase }, { "user_ids", userId } };
VkResponseArray response = _vk.Call("users.get", parameters, true);
VkResponseArray response = _vk.Call("users.get", parameters, true);
return response[0];
}
return response[0];
}
/// <summary>
/// Возвращает расширенную информацию о пользователях. Метод не требует авторизацию
/// </summary>
/// <param name="userIds">Идентификаторы пользователей, о которых необходимо получить информацию.</param>
/// <param name="fields">Поля профилей, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Список объектов с запрошенной информацией о пользователях.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.get"/>.
/// </remarks>
[Pure]
[ApiVersion("5.21")]
public ReadOnlyCollection<User> Get([NotNull] IEnumerable<long> userIds, ProfileFields fields = null, NameCase nameCase = null)
{
if (userIds == null)
throw new ArgumentNullException("userIds");
/// <summary>
/// Возвращает расширенную информацию о пользователях. Метод не требует авторизацию
/// </summary>
/// <param name="userIds">Идентификаторы пользователей, о которых необходимо получить информацию.</param>
/// <param name="fields">Поля профилей, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Список объектов с запрошенной информацией о пользователях.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.get"/>.
/// </remarks>
[Pure]
[ApiVersion("5.21")]
public ReadOnlyCollection<User> Get([NotNull] IEnumerable<long> userIds, ProfileFields fields = null, NameCase nameCase = null)
{
if (userIds == null)
throw new ArgumentNullException("userIds");
var parameters = new VkParameters { { "fields", fields }, { "name_case", nameCase } };
parameters.Add("user_ids", userIds);
var parameters = new VkParameters { { "fields", fields }, { "name_case", nameCase } };
parameters.Add("user_ids", userIds);
VkResponseArray response = _vk.Call("users.get", parameters);
VkResponseArray response = _vk.Call("users.get", parameters);
return response.ToReadOnlyCollectionOf<User>(x => x);
}
return response.ToReadOnlyCollectionOf<User>(x => x);
}
/// <summary>
/// Возвращает расширенную информацию о пользователях.
/// </summary>
/// <param name="screenNames">Короткие имена пользователей, о которых необходимо получить информацию.</param>
/// <param name="fields">Поля профилей, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Список объектов с запрошенной информацией о пользователях.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.get"/>.
/// </remarks>
[Pure, NotNull, ContractAnnotation("screenNames:null => halt")]
[ApiVersion("5.9")]
public ReadOnlyCollection<User> Get([NotNull] IEnumerable<string> screenNames, ProfileFields fields = null, NameCase nameCase = null)
{
if (screenNames == null)
throw new ArgumentNullException("screenNames");
/// <summary>
/// Возвращает расширенную информацию о пользователях.
/// </summary>
/// <param name="screenNames">Короткие имена пользователей, о которых необходимо получить информацию.</param>
/// <param name="fields">Поля профилей, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Список объектов с запрошенной информацией о пользователях.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.get"/>.
/// </remarks>
[Pure, NotNull, ContractAnnotation("screenNames:null => halt")]
[ApiVersion("5.9")]
public ReadOnlyCollection<User> Get([NotNull] IEnumerable<string> screenNames, ProfileFields fields = null, NameCase nameCase = null)
{
if (screenNames == null)
throw new ArgumentNullException("screenNames");
var parameters = new VkParameters
{
{ "user_ids", screenNames },
{ "fields", fields },
{ "name_case", nameCase }
};
var parameters = new VkParameters
{
{ "user_ids", screenNames },
{ "fields", fields },
{ "name_case", nameCase }
};
VkResponseArray response = _vk.Call("users.get", parameters);
return response.ToReadOnlyCollectionOf<User>(x => x);
}
VkResponseArray response = _vk.Call("users.get", parameters);
return response.ToReadOnlyCollectionOf<User>(x => x);
}
#if false
// todo start shit
[Pure, NotNull, ContractAnnotation("screenNames:null => halt")]
[ApiVersion("5.9")]
public async Task<ReadOnlyCollection<User>> GetAsync([NotNull] IEnumerable<string> screenNames, ProfileFields fields = null, NameCase nameCase = null)
{
if (screenNames == null)
throw new ArgumentNullException("screenNames");
// todo start shit
[Pure, NotNull, ContractAnnotation("screenNames:null => halt")]
[ApiVersion("5.9")]
public async Task<ReadOnlyCollection<User>> GetAsync([NotNull] IEnumerable<string> screenNames, ProfileFields fields = null, NameCase nameCase = null)
{
if (screenNames == null)
throw new ArgumentNullException("screenNames");
var parameters = new VkParameters
{
{ "user_ids", screenNames },
{ "fields", fields },
{ "name_case", nameCase }
};
var parameters = new VkParameters
{
{ "user_ids", screenNames },
{ "fields", fields },
{ "name_case", nameCase }
};
VkResponseArray response = await _vk.CallAsync("users.get", parameters);
return response.ToReadOnlyCollectionOf<User>(x => x);
}
VkResponseArray response = await _vk.CallAsync("users.get", parameters);
return response.ToReadOnlyCollectionOf<User>(x => x);
}
#endif
// todo end shit
// todo end shit
/// <summary>
/// Возвращает расширенную информацию о пользователе.
/// </summary>
/// <param name="screenName">Короткое имя пользователя</param>
/// <param name="fields">Поля профилей, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Объект <see cref="User"/> с запрошенной информацией о пользователе.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.get"/>.
/// </remarks>
[Pure, CanBeNull, ContractAnnotation("screenName:null => halt")]
public User Get([NotNull] string screenName, ProfileFields fields = null, NameCase nameCase = null)
{
VkErrors.ThrowIfNullOrEmpty(() => screenName);
/// <summary>
/// Возвращает расширенную информацию о пользователе.
/// </summary>
/// <param name="screenName">Короткое имя пользователя</param>
/// <param name="fields">Поля профилей, которые необходимо возвратить.</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Объект <see cref="User"/> с запрошенной информацией о пользователе.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.get"/>.
/// </remarks>
[Pure, CanBeNull, ContractAnnotation("screenName:null => halt")]
public User Get([NotNull] string screenName, ProfileFields fields = null, NameCase nameCase = null)
{
VkErrors.ThrowIfNullOrEmpty(() => screenName);
ReadOnlyCollection<User> users = Get(new[] {screenName}, fields, nameCase);
return users.Count > 0 ? users[0] : null;
}
ReadOnlyCollection<User> users = Get(new[] {screenName}, fields, nameCase);
return users.Count > 0 ? users[0] : null;
}
// todo add tests for subscriptions for users
/// <summary>
/// Возвращает список идентификаторов пользователей и групп, которые входят в список подписок пользователя.
/// </summary>
/// <param name="userId">Идентификатор пользователя, подписки которого необходимо получить</param>
/// <param name="count">Количество подписок, которые необходимо вернуть</param>
/// <param name="offset">Смещение необходимое для выборки определенного подмножества подписок</param>
/// <returns>Пока возвращается только список групп.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.getSubscriptions"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public ReadOnlyCollection<Group> GetSubscriptions(long? userId = null, int? count = null, int? offset = null)
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
VkErrors.ThrowIfNumberIsNegative(() => count);
VkErrors.ThrowIfNumberIsNegative(() => offset);
// todo add tests for subscriptions for users
/// <summary>
/// Возвращает список идентификаторов пользователей и групп, которые входят в список подписок пользователя.
/// </summary>
/// <param name="userId">Идентификатор пользователя, подписки которого необходимо получить</param>
/// <param name="count">Количество подписок, которые необходимо вернуть</param>
/// <param name="offset">Смещение необходимое для выборки определенного подмножества подписок</param>
/// <returns>Пока возвращается только список групп.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.getSubscriptions"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public ReadOnlyCollection<Group> GetSubscriptions(long? userId = null, int? count = null, int? offset = null)
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
VkErrors.ThrowIfNumberIsNegative(() => count);
VkErrors.ThrowIfNumberIsNegative(() => offset);
var parameters = new VkParameters
{
{"user_id", userId},
{"extended", true},
{"offset", offset},
{"count", count}
};
var parameters = new VkParameters
{
{"user_id", userId},
{"extended", true},
{"offset", offset},
{"count", count}
};
VkResponseArray response = _vk.Call("users.getSubscriptions", parameters);
return response.ToReadOnlyCollectionOf<Group>(x => x);
}
VkResponseArray response = _vk.Call("users.getSubscriptions", parameters);
return response.ToReadOnlyCollectionOf<Group>(x => x);
}
/// <summary>
/// Возвращает список идентификаторов пользователей, которые являются подписчиками пользователя.
/// </summary>
/// <param name="userId">Идентификатор пользователя</param>
/// <param name="count">Количество подписчиков, информацию о которых нужно получить</param>
/// <param name="offset">Смещение, необходимое для выборки определенного подмножества подписчиков</param>
/// <param name="fields">Список дополнительных полей, которые необходимо вернуть</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Список подписчиков</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.getFollowers"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public ReadOnlyCollection<User> GetFollowers(long? userId = null, int? count = null, int? offset = null, ProfileFields fields = null, NameCase nameCase = null)
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
VkErrors.ThrowIfNumberIsNegative(() => count);
VkErrors.ThrowIfNumberIsNegative(() => offset);
/// <summary>
/// Возвращает список идентификаторов пользователей, которые являются подписчиками пользователя.
/// </summary>
/// <param name="userId">Идентификатор пользователя</param>
/// <param name="count">Количество подписчиков, информацию о которых нужно получить</param>
/// <param name="offset">Смещение, необходимое для выборки определенного подмножества подписчиков</param>
/// <param name="fields">Список дополнительных полей, которые необходимо вернуть</param>
/// <param name="nameCase">Падеж для склонения имени и фамилии пользователя</param>
/// <returns>Список подписчиков</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.getFollowers"/>.
/// </remarks>
[Pure]
[ApiVersion("5.9")]
public ReadOnlyCollection<User> GetFollowers(long? userId = null, int? count = null, int? offset = null, ProfileFields fields = null, NameCase nameCase = null)
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
VkErrors.ThrowIfNumberIsNegative(() => count);
VkErrors.ThrowIfNumberIsNegative(() => offset);
var parameters = new VkParameters
{
{"user_id", userId},
{"offset", offset},
{"count", count},
{"fields", fields},
{"name_case", nameCase}
};
var parameters = new VkParameters
{
{"user_id", userId},
{"offset", offset},
{"count", count},
{"fields", fields},
{"name_case", nameCase}
};
VkResponseArray response = _vk.Call("users.getFollowers", parameters);
VkResponseArray response = _vk.Call("users.getFollowers", parameters);
// проверка: возвращается массив объектов или только идентификаторы пользователей
if (response.Count > 0 && response[0].ContainsKey("id"))
{
return response.ToReadOnlyCollectionOf<User>(x => x);
}
// проверка: возвращается массив объектов или только идентификаторы пользователей
if (response.Count > 0 && response[0].ContainsKey("id"))
{
return response.ToReadOnlyCollectionOf<User>(x => x);
}
return response.ToReadOnlyCollectionOf(x => new User{Id = x});
}
return response.ToReadOnlyCollectionOf(x => new User{Id = x});
}
/// <summary>
/// Позволяет пожаловаться на пользователя.
/// </summary>
/// <param name="userId">Идентификатор пользователя, на которого осуществляется жалоба</param>
/// <param name="type">Тип жалобы</param>
/// <param name="comment">Комментарий к жалобе на пользователя</param>
/// <returns>В случае успешной жалобы метод вернет true.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.report"/>.
/// </remarks>
[ApiVersion("5.9")]
public bool Report(long userId, ReportType type, string comment = "")
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
/// <summary>
/// Позволяет пожаловаться на пользователя.
/// </summary>
/// <param name="userId">Идентификатор пользователя, на которого осуществляется жалоба</param>
/// <param name="type">Тип жалобы</param>
/// <param name="comment">Комментарий к жалобе на пользователя</param>
/// <returns>В случае успешной жалобы метод вернет true.</returns>
/// <remarks>
/// Страница документации ВКонтакте <see href="http://vk.com/dev/users.report"/>.
/// </remarks>
[ApiVersion("5.9")]
public bool Report(long userId, ReportType type, string comment = "")
{
VkErrors.ThrowIfNumberIsNegative(() => userId);
var parameters = new VkParameters
{
{"user_id", userId},
{"type", type},
{"comment", comment}
};
var parameters = new VkParameters
{
{"user_id", userId},
{"type", type},
{"comment", comment}
};
return _vk.Call("users.report", parameters);
}
}
return _vk.Call("users.report", parameters);
}
}
}

View file

@ -0,0 +1,37 @@
namespace VkNet.Enums
{
/// <summary>
/// Семейное положение: 1 — Не женат, 2 — Встречается, 3 — Помолвлен, 4 — Женат, 7 — Влюблён, 5 — Всё сложно, 6 — В активном поиске. положительное число.
/// </summary>
public enum MaritalStatus
{
/// <summary>
/// Не женат
/// </summary>
Single = 1,
/// <summary>
/// Встречается
/// </summary>
Meets,
/// <summary>
/// Помолвлен
/// </summary>
Engaged,
/// <summary>
/// Женат
/// </summary>
Married,
/// <summary>
/// Всё сложно
/// </summary>
ItsComplicated,
/// <summary>
/// В активном поиске
/// </summary>
TheActiveSearch,
/// <summary>
/// Влюблён
/// </summary>
InLove
}
}

View file

@ -0,0 +1,18 @@
namespace VkNet.Enums.SafetyEnums
{
/// <summary>
/// Разделы среди которых нужно осуществить поиск, перечисленные через запятую: friends искать среди друзей subscriptions искать среди друзей и подписок пользователя список строк, разделенных через запятую.
/// </summary>
public sealed class UserSection : SafetyEnum<UserSection>
{
/// <summary>
/// Искать среди друзей.
/// </summary>
public static readonly UserSection Friends = RegisterPossibleValue("friends");
/// <summary>
/// Искать среди друзей и подписок пользователя список строк, разделенных через запятую.
/// </summary>
public static readonly UserSection Subscriptions = RegisterPossibleValue("subscriptions");
}
}

17
VkNet/Enums/UserSort.cs Normal file
View file

@ -0,0 +1,17 @@
namespace VkNet.Enums
{
/// <summary>
/// Сортировка результатов: 1 - по дате регистрации, 0 - по популярности целое число.
/// </summary>
public enum UserSort
{
/// <summary>
/// По популярности
/// </summary>
ByPopularity = 0,
/// <summary>
/// По дате регистрации
/// </summary>
ByRegDate
}
}

View file

@ -0,0 +1,222 @@
using VkNet.Enums;
using VkNet.Enums.Filters;
using VkNet.Enums.SafetyEnums;
namespace VkNet.Model.RequestParams.Users
{
/// <summary>
/// Параметры метода users.search
/// </summary>
public class UserSearchParams
{
/// <summary>
/// Параметры метода users.search.
/// </summary>
public UserSearchParams()
{
Sort = UserSort.ByPopularity;
Offset = 0;
Count = 20;
Sex = Sex.Unknown;
}
/// <summary>
/// Строка поискового запроса. Например, Вася Бабич. строка.
/// </summary>
public string Query
{ get; set; }
/// <summary>
/// Сортировка результатов.
/// </summary>
public UserSort Sort
{ get; set; }
/// <summary>
/// Смещение относительно первого найденного пользователя для выборки определенного подмножества. положительное число.
/// </summary>
public uint Offset
{ get; set; }
/// <summary>
/// Количество возвращаемых пользователей. Обратите внимание — даже при использовании параметра offset для получения информации доступны только первые 1000 результатов. положительное число, по умолчанию 20, максимальное значение 1000.
/// </summary>
public uint Count
{ get; set; }
/// <summary>
/// Список дополнительных полей, которые необходимо вернуть. список строк, разделенных через запятую.
/// </summary>
public ProfileFields Fields
{ get; set; }
/// <summary>
/// Идентификатор города. положительное число.
/// </summary>
public int? City
{ get; set; }
/// <summary>
/// Идентификатор страны. положительное число.
/// </summary>
public int? Country
{ get; set; }
/// <summary>
/// Название города строкой. строка.
/// </summary>
public string Hometown
{ get; set; }
/// <summary>
/// Идентификатор страны, в которой пользователи закончили ВУЗ. положительное число.
/// </summary>
public int? UniversityCountry
{ get; set; }
/// <summary>
/// Идентификатор ВУЗа. положительное число.
/// </summary>
public int? University
{ get; set; }
/// <summary>
/// Год окончания ВУЗа. положительное число.
/// </summary>
public uint? UniversityYear
{ get; set; }
/// <summary>
/// Идентификатор факультета. положительное число.
/// </summary>
public int? UniversityFaculty
{ get; set; }
/// <summary>
/// Идентификатор кафедры. положительное число.
/// </summary>
public int? UniversityChair
{ get; set; }
/// <summary>
/// Пол.
/// </summary>
public Sex Sex
{ get; set; }
/// <summary>
/// Семейное положение.
/// </summary>
public MaritalStatus Status
{ get; set; }
/// <summary>
/// Начиная с какого возраста. положительное число.
/// </summary>
public ushort? AgeFrom
{ get; set; }
/// <summary>
/// До какого возраста. положительное число.
/// </summary>
public ushort? AgeTo
{ get; set; }
/// <summary>
/// День рождения. положительное число.
/// </summary>
public ushort? BirthDay
{ get; set; }
/// <summary>
/// Месяц рождения. положительное число.
/// </summary>
public ushort? BirthMonth
{ get; set; }
/// <summary>
/// Год рождения. положительное число.
/// </summary>
public uint? BirthYear
{ get; set; }
/// <summary>
/// 1 — только в сети, 0 — все пользователи. флаг.
/// </summary>
public bool Online
{ get; set; }
/// <summary>
/// 1 — только с фотографией, 0 — все пользователи. флаг.
/// </summary>
public bool HasPhoto
{ get; set; }
/// <summary>
/// Идентификатор страны, в которой пользователи закончили школу. положительное число.
/// </summary>
public int? SchoolCountry
{ get; set; }
/// <summary>
/// Идентификатор города, в котором пользователи закончили школу. положительное число.
/// </summary>
public int? SchoolCity
{ get; set; }
/// <summary>
/// Класс в школе. положительное число.
/// </summary>
public int? SchoolClass
{ get; set; }
/// <summary>
/// Идентификатор школы, которую закончили пользователи. положительное число.
/// </summary>
public int? School
{ get; set; }
/// <summary>
/// Год окончания школы. положительное число.
/// </summary>
public uint? SchoolYear
{ get; set; }
/// <summary>
/// Религиозные взгляды. строка.
/// </summary>
public string Religion
{ get; set; }
/// <summary>
/// Интересы. строка.
/// </summary>
public string Interests
{ get; set; }
/// <summary>
/// Название компании, в которой работают пользователи. строка.
/// </summary>
public string Company
{ get; set; }
/// <summary>
/// Название должности. строка.
/// </summary>
public string Position
{ get; set; }
/// <summary>
/// Идентификатор группы, среди пользователей которой необходимо проводить поиск. положительное число.
/// </summary>
public ulong? GroupId
{ get; set; }
/// <summary>
/// Разделы среди которых нужно осуществить поиск. список строк, разделенных через запятую.
/// </summary>
public UserSection FromList
{ get; set; }
}
}

View file

@ -65,6 +65,7 @@
</Compile>
<Compile Include="Enums\AccessPages.cs" />
<Compile Include="Enums\Filters\AppFilter.cs" />
<Compile Include="Enums\MaritalStatus.cs" />
<Compile Include="Enums\SafetyEnums\AppPlatforms.cs" />
<Compile Include="Enums\SafetyEnums\AppRequestType.cs" />
<Compile Include="Enums\SafetyEnums\AppRatingType.cs" />
@ -104,10 +105,12 @@
<Compile Include="Enums\PeopleMain.cs" />
<Compile Include="Enums\PoliticalPreferences.cs" />
<Compile Include="Enums\RelationType.cs" />
<Compile Include="Enums\SafetyEnums\UserSection.cs" />
<Compile Include="Enums\SafetyEnums\LikeObjectType.cs" />
<Compile Include="Enums\SafetyEnums\PhotoAlbumType.cs" />
<Compile Include="Enums\SafetyEnums\PhotoFeedType.cs" />
<Compile Include="Enums\Sex.cs" />
<Compile Include="Enums\UserSort.cs" />
<Compile Include="Enums\VideoReportType.cs" />
<Compile Include="Enums\VideoSort.cs" />
<Compile Include="Enums\VideoWidth.cs" />
@ -183,6 +186,7 @@
<Compile Include="Model\Tags.cs" />
<Compile Include="Model\University.cs" />
<Compile Include="Model\UploadServerInfo.cs" />
<Compile Include="Model\RequestParams\Users\UserSearchParams.cs" />
<Compile Include="Model\VideoAlbum.cs" />
<Compile Include="Model\VkObject.cs" />
<Compile Include="Utils\ApiMethodNameAttribute.cs" />