using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using Newtonsoft.Json;
using VkNet.Enums;
using VkNet.Enums.StringEnums;
using VkNet.Utils.JsonConverter;
// ReSharper disable UnusedAutoPropertyAccessor.Global
// ReSharper disable MemberCanBePrivate.Global
namespace VkNet.Model;
///
/// Информация о пользователе.
/// См. описание https://vk.ru/dev/objects/user
///
[DebuggerDisplay("[{Id}] {FirstName} {LastName}")]
[Serializable]
[JsonConverter(typeof(UserJsonConverter))]
public class User
{
#region Базовые поля
///
/// Идентификатор пользователя.
///
[JsonProperty("id")]
public long Id { get; set; }
///
/// Имя пользователя.
///
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("name")]
private string Name
{
get => FirstName;
set => FirstName = value;
}
///
/// Фамилия пользователя.
///
[JsonProperty("last_name")]
public string LastName { get; set; }
///
/// Возвращается при вызове без access_token, если пользователь установил настройку
/// «Кому в интернете видна моя
/// страница» — «Только пользователям ВКонтакте».
/// Обратите внимание, в этом случае дополнительные поля fields не возвращаются.
///
[JsonProperty("hidden")]
public bool Hidden { get; set; }
///
/// Скрыт ли профиль пользователя настройками приватности.
///
///
/// Начиная с версии 5.89 обязательное поле
///
[JsonProperty("is_closed")]
public bool? IsClosed { get; set; }
///
/// Может ли текущий пользователь видеть профиль при is_closed = 1 (например, если он есть в друзьях).
///
///
/// Начиная с версии 5.89 обязательное поле
///
[JsonProperty("can_access_closed")]
public bool? CanAccessClosed { get; set; }
#endregion
#region Опциональные поля
///
/// Причина блокирования аккаунта
///
[JsonProperty("deactivated", DefaultValueHandling = DefaultValueHandling.Populate)]
public Deactivated? Deactivated { get; set; }
///
/// Информация пользователя о себе.
///
[JsonProperty("about")]
public string About { get; set; }
///
/// Информация пользователя о себе.
///
[JsonProperty("twitter")]
public string Twitter { get; set; }
///
/// Чем занимается пользователь.
///
[JsonProperty("activities")]
public string Activities { get; set; }
///
/// Дата рождения пользователя. Возвращается в формате DD.MM.YYYY или DD.MM (если
/// год рождения скрыт).
/// Если дата рождения скрыта целиком, поле отсутствует в ответе.
///
[JsonProperty("bdate")]
public string BirthDate { get; set; }
///
/// Возвращается 1, если текущий пользователь находится в черном списке у
/// запрашиваемого пользователя.
///
[JsonProperty("blacklisted")]
public bool Blacklisted { get; set; }
///
/// Возвращается 1, если запрашиваемый пользователь находится в черном списке у
/// текущего пользователя.
///
[JsonProperty("blacklisted_by_me")]
public bool BlacklistedByMe { get; set; }
///
/// Любимые книги пользователя.
///
[JsonProperty("books")]
public string Books { get; set; }
///
/// Признак разрешено ли оставлять записи на стене у пользователя.
///
[JsonProperty("can_post")]
public bool CanPost { get; set; }
///
/// Признак разрешено ли видеть чужие записи на стене пользователя.
///
[JsonProperty("can_see_all_posts")]
public bool CanSeeAllPosts { get; set; }
///
/// Признак разрешено ли видеть чужие аудиозаписи на стене пользователя.
///
[JsonProperty("can_see_audio")]
public bool CanSeeAudio { get; set; }
///
/// Информация о том, будет ли отправлено уведомление пользователю о заявке в
/// друзья.
///
[JsonProperty("can_send_friend_request")]
public bool CanSendFriendRequest { get; set; }
///
/// Признак разрешено ли написание личных сообщений данному пользователю.
///
[JsonProperty("can_write_private_message")]
public bool CanWritePrivateMessage { get; set; }
///
/// Информация о карьере пользователя.
///
[JsonProperty("career")]
public ReadOnlyCollection Career { get; set; }
///
/// Идентификатор города, указанного на странице пользователя в разделе «Контакты».
/// Если город не указан, или основная информация страницы скрыта настройками
/// приватности, то 0.
///
[JsonProperty("city")]
public City City { get; set; }
///
/// Общее количество друзей с текущим пользователем.
///
[JsonProperty("common_count")]
public int? CommonCount { get; set; }
///
/// Данные о подключенных сервисах пользователя, таких как: skype, facebook,
/// twitter, instagram.
///
[JsonProperty("connections")]
public Connections Connections { get; set; }
///
/// Информация о телефонных номерах пользователя.
///
[JsonProperty("contacts")]
public Contacts Contacts { get; set; }
///
/// Различные счетчики пользователя.
///
[JsonProperty("counters")]
public Counters Counters { get; set; }
///
/// Идентификатор страны, указанной на странице пользователя в разделе «Контакты».
/// Если страна не указана или основная информация страницы скрыта настройками
/// приватности, то 0.
///
[JsonProperty("country")]
public Country Country { get; set; }
///
/// Возвращает данные о точках, по которым вырезаны профильная и миниатюрная
/// фотографии пользователя.
///
[JsonProperty("crop_photo")]
public CropPhoto CropPhoto { get; set; }
///
/// Короткий адрес страницы пользователя. Возвращается строка, содержащая короткий
/// адрес страницы (возвращается только
/// сам поддомен, например, andrew). Если он не назначен, то "id"+uid, например,
/// id35828305.
///
[JsonProperty("domain")]
public string Domain { get; set; }
///
/// Сведения об образовании пользователя.
///
[JsonProperty("education")]
public Education Education { get; set; }
///
/// Внешние сервисы, в которые настроен экспорт из ВК.
///
[JsonProperty("exports")]
public Exports Exports { get; set; }
///
/// Имя в именительном падеже
///
[JsonProperty("first_name_nom")]
public string FirstNameNom { get; set; }
///
/// Имя в родительном падеже
///
[JsonProperty("first_name_gen")]
public string FirstNameGen { get; set; }
///
/// Имя в дательном падеже
///
[JsonProperty("first_name_dat")]
public string FirstNameDat { get; set; }
///
/// Имя в винительном падеже
///
[JsonProperty("first_name_acc")]
public string FirstNameAcc { get; set; }
///
/// Имя в творительном падеже
///
[JsonProperty("first_name_ins")]
public string FirstNameIns { get; set; }
///
/// Имя в предложном падеже
///
[JsonProperty("first_name_abl")]
public string FirstNameAbl { get; set; }
///
/// Количество подписчиков пользователя.
///
[JsonProperty("followers_count")]
public long? FollowersCount { get; set; }
///
/// Состояние дружбы с пользователями.
///
[JsonProperty("friend_status")]
public FriendStatus? FriendStatus { get; set; }
///
/// Любимые игры пользователя.
///
[JsonProperty("games")]
public string Games { get; set; }
///
/// Информация о том, известен ли номер мобильного телефона пользователя (true -
/// известен, false - не известен).
///
[JsonProperty("has_mobile")]
public bool? HasMobile { get; set; }
///
/// Возвращается 1, если текущий пользователь установил фотографию для профиля.
///
[JsonProperty("has_photo")]
public bool? HasPhoto { get; set; }
///
/// Родной город пользователя.
///
[JsonProperty("home_town")]
public string HomeTown { get; set; }
///
/// Интересы пользователя.
///
[JsonProperty("interests")]
public string Interests { get; set; }
///
/// Возвращается 1, если пользователь находится в закладках у текущего
/// пользователя.
///
[JsonProperty("is_favorite")]
public bool IsFavorite { get; set; }
///
/// 1 – пользователь друг, 2 – пользователь не в друзьях.
///
[JsonProperty("is_friend")]
public bool? IsFriend { get; set; }
///
/// Возвращается 1, если пользователь скрыт в новостях у текущего пользователя.
///
[JsonProperty("is_hidden_from_feed")]
public bool IsHiddenFromFeed { get; set; }
///
/// Фамилия в именительном падеже
///
[JsonProperty("last_name_nom")]
public string LastNameNom { get; set; }
///
/// Фамилия в родительном падеже
///
[JsonProperty("last_name_gen")]
public string LastNameGen { get; set; }
///
/// Фамилия в дательном падеже
///
[JsonProperty("last_name_dat")]
public string LastNameDat { get; set; }
///
/// Фамилия в винительном падеже
///
[JsonProperty("last_name_acc")]
public string LastNameAcc { get; set; }
///
/// Фамилия в творительном падеже
///
[JsonProperty("last_name_ins")]
public string LastNameIns { get; set; }
///
/// Фамилия в предложном падеже
///
[JsonProperty("last_name_abl")]
public string LastNameAbl { get; set; }
///
/// Время последнего посещения сайта.
///
[JsonProperty("last_seen")]
public LastSeen LastSeen { get; set; }
///
/// Идентификаторы списков друзей, в которых состоит пользователь. Поле доступно
/// только для метода
/// FriendsCategory.Get. Получить информацию об идентификаторах и названиях списков
/// друзей можно с
/// помощью метода FriendsCategory.GetLists. Если пользователь не состоит ни в
/// одном списке друзей, данное
/// поле принимает значение null.
///
///
/// поле lists
///
[JsonProperty("lists")]
public ReadOnlyCollection FriendLists { get; set; }
///
/// Девичья фамилия (только для женского пола)
///
[JsonProperty("maiden_name")]
public string MaidenName { get; set; }
///
/// Информация о военной службе пользователя.
///
[JsonProperty("military")]
public Military[] Military { get; set; }
///
/// Любимые фильмы пользователя.
///
[JsonProperty("movies")]
public string Movies { get; set; }
///
/// Любимая музыка пользователя.
///
[JsonProperty("music")]
public string Music { get; set; }
///
/// Прозвище (ник) пользователя.
///
[JsonProperty("nickname")]
public string Nickname { get; set; }
///
/// Информация о текущем роде занятия пользователя.
///
[JsonProperty("occupation")]
public Occupation Occupation { get; set; }
///
/// Признак находится ли пользователь сейчас на сайте.
///
[JsonProperty("online")]
public bool? Online { get; set; }
///
/// Жизненная позиция.
///
///
/// поле personal
///
[JsonProperty("personal")]
public StandInLife StandInLife { get; set; }
///
/// url квадратной фотографии пользователя, имеющей ширину 50 пикселей. В случае
/// отсутствия у пользователя фотографии
/// возвращается http://vk.ru/images/camera_c.gif
///
[JsonProperty("photo_50")]
public Uri Photo50 { get; set; }
///
/// url квадратной фотографии пользователя, имеющей ширину 100 пикселей. В случае
/// отсутствия у пользователя фотографии
/// возвращается http://vk.ru/images/camera_b.gif.
///
[JsonProperty("photo_100")]
public Uri Photo100 { get; set; }
///
/// url фотографии пользователя, имеющей ширину 200 пикселей. В случае отсутствия у
/// пользователя фотографии
/// возвращается http://vk.ru/images/camera_a.gif.
///
[JsonProperty("photo_200_orig")]
public Uri Photo200Orig { get; set; }
///
/// url квадратной фотографии пользователя, имеющей ширину 200 пикселей. Если
/// фотография была загружена давно,
/// изображения с такими размерами может не быть, в этом случае ответ не будет
/// содержать этого поля.
///
[JsonProperty("photo_200")]
public Uri Photo200 { get; set; }
///
/// url фотографии пользователя, имеющей ширину 400 пикселей.
/// Если у пользователя отсутствует фотография такого размера, ответ не будет
/// содержать этого поля.
///
[JsonProperty("photo_400_orig")]
public Uri Photo400Orig { get; set; }
///
/// id главной фотографии профиля пользователя в формате user_id+photo_id,
/// например, 6492_192164258.
/// В некоторых случаях (если фотография была установлена очень давно) это поле не
/// возвращается.
///
[JsonProperty("photo_id")]
public string PhotoId { get; set; }
///
/// url квадратной фотографии пользователя с максимальной шириной.
/// Может быть возвращена фотография, имеющая ширину как 200, так и 100 пикселей.
/// В случае отсутствия у пользователя фотографии возвращается
/// http://vk.ru/images/camera_b.gif.
///
[JsonProperty("photo_max")]
public Uri PhotoMax { get; set; }
///
/// url фотографии пользователя максимального размера.
/// Может быть возвращена фотография, имеющая ширину как 400, так и 200 пикселей.
/// В случае отсутствия у пользователя фотографии возвращается
/// http://vk.ru/images/camera_a.gif.
///
[JsonProperty("photo_max_orig")]
public Uri PhotoMaxOrig { get; set; }
///
/// Избранные пользователем цитаты.
///
[JsonProperty("quotes")]
public string Quotes { get; set; }
///
/// Родственники пользователя.
///
[JsonProperty("relatives")]
public ReadOnlyCollection Relatives { get; set; }
///
/// Семейное положение.
///
[JsonProperty("relation")]
public RelationType? Relation { get; set; }
///
/// Школы, в которых учился пользователь.
///
[JsonProperty("schools")]
public ReadOnlyCollection Schools { get; set; }
///
/// Короткое имя (поддомен) страницы пользователя.
///
[JsonProperty("screen_name")]
public string ScreenName { get; set; }
///
/// Пол пользователя.
///
[JsonProperty("sex")]
public Sex? Sex { get; set; }
///
/// Возвращает указанный в профиле сайт пользователя.
///
[JsonProperty("site")]
public string Site { get; set; }
///
/// Строка со статусом пользователя.
///
[JsonProperty("status")]
public string Status { get; set; }
///
/// Объект аудиозаписи, установленной в статус (если аудиозапись транслируется в текущей момент).
///
[JsonProperty("status_audio")]
public Audio StatusAudio { get; set; }
///
/// Часовой пояс пользователя.
///
[JsonProperty("timezone")]
public int? Timezone { get; set; }
///
/// Возвращается 1, если запрашиваемый пользователь находится в черном списке у
/// текущего пользователя.
///
[JsonProperty("trending")]
public bool Trending { get; set; }
///
/// Любимые телешоу пользователя.
///
[JsonProperty("tv")]
public string Tv { get; set; }
///
/// Список высших учебных заведений, в которых учился пользователь.
///
[JsonProperty("universities")]
public ReadOnlyCollection Universities { get; set; }
///
/// Возвращается 1, если страница пользователя верифицирована, 0 — если не
/// верифицирована.
///
[JsonProperty("verified")]
public bool? Verified { get; set; }
///
/// Доступно ли комментирование стены (1 — доступно, 0 — недоступно).
///
[JsonProperty("wall_default")]
public bool WallComments { get; set; }
#endregion
#region Поля, установленные экспериментально
///
/// Информация о ссылках на предпросмотр фотографий пользователя.
///
[JsonProperty("photo_previews")]
public Previews PhotoPreviews { get; set; }
///
/// Номер мобильного телефона (если нет записи или скрыт, то null).
///
[JsonProperty("mobile_phone")]
public string MobilePhone { get; set; }
///
/// Номер домашнего телефона (если нет записи или скрыт, то null).
///
[JsonProperty("home_phone")]
public string HomePhone { get; set; }
///
/// Информация о блокировке пользователя
///
[JsonProperty("ban_info")]
public BanInfo BanInfo { get; set; }
///
/// Является ли пользователь заблокированным
///
[JsonProperty("is_deactivated")]
public bool IsDeactivated { get; set; }
///
/// Идентификатор языка, установленный в настройках.
///
[JsonProperty("language")]
public long? Language { get; set; }
///
/// Признак использует ли пользователь мобильное приложение либо мобильную версию
/// сайта.
///
[JsonProperty("online_mobile")]
public bool? OnlineMobile { get; set; }
///
/// Если пользователь зашёл через приложение, то Id приложения иначе null.
///
[JsonProperty("online_app")]
public long? OnlineApp { get; set; }
///
/// Партнер в семейных отношениях.
///
[JsonProperty("relation_partner")]
public User RelationPartner { get; set; }
///
/// Идентификатор пользователя, пригласившего пользователя в беседу (для
/// GetChatUsers).
///
[JsonProperty("invited_by")]
public long? InvitedBy { get; set; }
///
/// Видимость даты рождения.
///
[JsonProperty("bdate_visibility")]
public BirthdayVisibility? BirthdayVisibility { get; set; }
///
/// Информация о заявке на смену имени.
///
[JsonProperty("change_name_request")]
public ChangeNameRequest ChangeNameRequest { get; set; }
///
/// Информация о заявке на смену имени.
///
public OwnerState OwnerState { get; set; }
#endregion
#region Поля для Groups.GetMembers
///
/// Полномочия руководителя (для Groups.GetMembers)
///
[JsonProperty("role")]
public ManagerRole? Role { get; set; }
#endregion
#region Поля для NewsFeed.Get
///
/// Количество друзей (для Groups.GetMembers)
///
[JsonProperty("count")]
public long? Count { get; set; }
#endregion
#region private
[JsonProperty("uid")]
private long Uid
{
get => Id;
set => Id = value;
}
[JsonProperty("user_id")]
private long UserId
{
get => Id;
set => Id = value;
}
[JsonProperty("phone")]
private string Phone
{
get => MobilePhone;
set => MobilePhone = value;
}
#endregion
///
/// Идентификатор университета.
///
[JsonProperty("university")]
public long? UniversityId { get; set; }
///
/// Название ВУЗа.
///
[JsonProperty("university_name")]
public string UniversityName { get; set; }
///
/// Идентификатор факультета.
///
[JsonProperty("faculty")]
public long? FacultyId { get; set; }
///
/// Название факультета.
///
[JsonProperty("faculty_name")]
public string FacultyName { get; set; }
///
/// Год окончания.
///
[JsonProperty("graduation")]
public int? Graduation { get; set; }
#region Поля, установленные экспериментально
///
/// Форма обучения.
///
[JsonProperty("education_form")]
public string EducationForm { get; set; }
///
/// Текущий статус пользователя в высшем учебном заведении.
///
[JsonProperty("education_status")]
public string EducationStatus { get; set; }
#endregion
///
/// Логин в Skype.
///
[JsonProperty("skype")]
public string Skype { get; set; }
///
/// Идентификатор акаунта в Facebook.
///
[JsonProperty("facebook")]
public string Facebook { get; set; }
///
/// Имя и фамилия в facebook.
///
[JsonProperty("facebook_name")]
public string FacebookName { get; set; }
///
/// Акаунт в Instagram.
///
[JsonProperty("instagram")]
public string Instagram { get; set; }
}