mirror of
https://github.com/vknet/vk.git
synced 2026-08-21 06:13:32 +00:00
#137 Добавление в метод Users.Search функционала
This commit is contained in:
parent
ca84d2e30b
commit
ffdc73e0fe
7 changed files with 619 additions and 288 deletions
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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 & 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 & 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
37
VkNet/Enums/MaritalStatus.cs
Normal file
37
VkNet/Enums/MaritalStatus.cs
Normal 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
|
||||
}
|
||||
}
|
||||
18
VkNet/Enums/SafetyEnums/UserSection.cs
Normal file
18
VkNet/Enums/SafetyEnums/UserSection.cs
Normal 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
17
VkNet/Enums/UserSort.cs
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
namespace VkNet.Enums
|
||||
{
|
||||
/// <summary>
|
||||
/// Сортировка результатов: 1 - по дате регистрации, 0 - по популярности целое число.
|
||||
/// </summary>
|
||||
public enum UserSort
|
||||
{
|
||||
/// <summary>
|
||||
/// По популярности
|
||||
/// </summary>
|
||||
ByPopularity = 0,
|
||||
/// <summary>
|
||||
/// По дате регистрации
|
||||
/// </summary>
|
||||
ByRegDate
|
||||
}
|
||||
}
|
||||
222
VkNet/Model/RequestParams/Users/UserSearchParams.cs
Normal file
222
VkNet/Model/RequestParams/Users/UserSearchParams.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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" />
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue