diff --git a/VkNet/Enums/SafetyEnums/GroupChangeSettings.cs b/VkNet/Enums/SafetyEnums/GroupChangeSettings.cs index cf91898a4..754d835ae 100644 --- a/VkNet/Enums/SafetyEnums/GroupChangeSettings.cs +++ b/VkNet/Enums/SafetyEnums/GroupChangeSettings.cs @@ -11,7 +11,7 @@ namespace VkNet.Model.GroupUpdate /// Событие о изменении настроек сообщества /// [Serializable] - public class GroupChangeSettings + public class GroupChangeSettings : IGroupUpdate { /// /// Идентификатор пользователя, который внёс изменения; diff --git a/VkNet/Enums/SafetyEnums/GroupUpdateType.cs b/VkNet/Enums/SafetyEnums/GroupUpdateType.cs index 1380d8aad..57ecad031 100644 --- a/VkNet/Enums/SafetyEnums/GroupUpdateType.cs +++ b/VkNet/Enums/SafetyEnums/GroupUpdateType.cs @@ -1,8 +1,11 @@ +using System; + namespace VkNet.Enums.SafetyEnums { /// /// Тип обновления /// + [Obsolete("Типы обновлений теперь проверяются в GroupUpdate")] public sealed class GroupUpdateType : SafetyEnum { /// diff --git a/VkNet/Enums/SafetyEnums/LikeAdd.cs b/VkNet/Enums/SafetyEnums/LikeAdd.cs index f891260e6..b843fc76f 100644 --- a/VkNet/Enums/SafetyEnums/LikeAdd.cs +++ b/VkNet/Enums/SafetyEnums/LikeAdd.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// Событие о новой отметке "Мне нравится" /// [Serializable] - public class LikeAdd + public class LikeAdd : IGroupUpdate { /// /// Идентификатор пользователя, который поставил отметку. diff --git a/VkNet/Enums/SafetyEnums/LikeRemove.cs b/VkNet/Enums/SafetyEnums/LikeRemove.cs index 1fd8a8412..c221d72f5 100644 --- a/VkNet/Enums/SafetyEnums/LikeRemove.cs +++ b/VkNet/Enums/SafetyEnums/LikeRemove.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// Событие о снятии отметке "Мне нравится" /// [Serializable] - public class LikeRemove + public class LikeRemove : IGroupUpdate { /// /// Идентификатор пользователя, который убрал отметку. diff --git a/VkNet/Enums/SafetyEnums/MessageTypingState.cs b/VkNet/Enums/SafetyEnums/MessageTypingState.cs index e8107797c..02661ac68 100644 --- a/VkNet/Enums/SafetyEnums/MessageTypingState.cs +++ b/VkNet/Enums/SafetyEnums/MessageTypingState.cs @@ -9,7 +9,7 @@ namespace VkNet.Model.GroupUpdate /// Объект, который содержит информацию о статусе печатании /// [Serializable] - public class MessageTypingState + public class MessageTypingState : IGroupUpdate { /// /// Идентификатор пользователя, который набирает текст. diff --git a/VkNet/Enums/SafetyEnums/VkPayTransaction.cs b/VkNet/Enums/SafetyEnums/VkPayTransaction.cs index d9d8a256f..f3d73781c 100644 --- a/VkNet/Enums/SafetyEnums/VkPayTransaction.cs +++ b/VkNet/Enums/SafetyEnums/VkPayTransaction.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// платёж через VK Pay /// [Serializable] - public class VkPayTransaction + public class VkPayTransaction : IGroupUpdate { /// /// Идентификатор пользователя-отправителя перевода. diff --git a/VkNet/Model/Attachments/Audio.cs b/VkNet/Model/Attachments/Audio.cs index 90f848f77..e091f29c4 100644 --- a/VkNet/Model/Attachments/Audio.cs +++ b/VkNet/Model/Attachments/Audio.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using VkNet.Enums; +using VkNet.Model.GroupUpdate; using VkNet.Utils; namespace VkNet.Model.Attachments @@ -12,7 +13,7 @@ namespace VkNet.Model.Attachments /// См. описание http://vk.com/dev/audio_object /// [Serializable] - public class Audio : MediaAttachment + public class Audio : MediaAttachment, IGroupUpdate { /// protected override string Alias => "audio"; diff --git a/VkNet/Model/Attachments/Message.cs b/VkNet/Model/Attachments/Message.cs index dac627dcb..642e589ff 100644 --- a/VkNet/Model/Attachments/Message.cs +++ b/VkNet/Model/Attachments/Message.cs @@ -5,6 +5,7 @@ using Newtonsoft.Json.Converters; using VkNet.Enums; using VkNet.Model.Attachments; +using VkNet.Model.GroupUpdate; using VkNet.Model.Keyboard; using VkNet.Utils; using VkNet.Utils.JsonConverter; @@ -17,7 +18,7 @@ namespace VkNet.Model /// [DebuggerDisplay("[{PeerId}-{Id}] {Text}")] [Serializable] - public class Message : MediaAttachment + public class Message : MediaAttachment, IGroupUpdate { /// protected override string Alias => "message"; diff --git a/VkNet/Model/Attachments/Photo.cs b/VkNet/Model/Attachments/Photo.cs index 629fb37cd..d58e18c23 100644 --- a/VkNet/Model/Attachments/Photo.cs +++ b/VkNet/Model/Attachments/Photo.cs @@ -2,6 +2,7 @@ using System.Collections.ObjectModel; using Newtonsoft.Json; using Newtonsoft.Json.Converters; +using VkNet.Model.GroupUpdate; using VkNet.Utils; namespace VkNet.Model.Attachments @@ -13,7 +14,7 @@ namespace VkNet.Model.Attachments /// См. описание http://vk.com/dev/photo /// [Serializable] - public class Photo : MediaAttachment + public class Photo : MediaAttachment, IGroupUpdate { /// protected override string Alias => "photo"; diff --git a/VkNet/Model/Attachments/Video.cs b/VkNet/Model/Attachments/Video.cs index 648fa1a38..6397df209 100644 --- a/VkNet/Model/Attachments/Video.cs +++ b/VkNet/Model/Attachments/Video.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using VkNet.Infrastructure; +using VkNet.Model.GroupUpdate; using VkNet.Utils; namespace VkNet.Model.Attachments @@ -16,7 +17,7 @@ namespace VkNet.Model.Attachments /// [DebuggerDisplay("Id = {Id}, Title = {Title}")] [Serializable] - public class Video : MediaAttachment + public class Video : MediaAttachment, IGroupUpdate { /// protected override string Alias => "video"; diff --git a/VkNet/Model/GroupUpdate/BoardPost.cs b/VkNet/Model/GroupUpdate/BoardPost.cs index 40d45720e..dc2cbbbff 100644 --- a/VkNet/Model/GroupUpdate/BoardPost.cs +++ b/VkNet/Model/GroupUpdate/BoardPost.cs @@ -9,7 +9,7 @@ namespace VkNet.Model.GroupUpdate /// (CommentBoard с дополнительными полями) /// [Serializable] - public class BoardPost : CommentBoard + public class BoardPost : CommentBoard, IGroupUpdate { /// /// Идентификатор обсуждения @@ -39,5 +39,22 @@ public class BoardPost : CommentBoard TopicOwnerId = response["topic_owner_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator BoardPost(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/BoardPostDelete.cs b/VkNet/Model/GroupUpdate/BoardPostDelete.cs index 598e45d83..c94b26fa4 100644 --- a/VkNet/Model/GroupUpdate/BoardPostDelete.cs +++ b/VkNet/Model/GroupUpdate/BoardPostDelete.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Удаление комментария в обсуждении (BoardPostDelete) /// [Serializable] - public class BoardPostDelete + public class BoardPostDelete : IGroupUpdate { /// /// Идентификатор комментария @@ -37,5 +37,22 @@ public static BoardPostDelete FromJson(VkResponse response) TopicOwnerId = response["topic_owner_id"], }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator BoardPostDelete(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/DonutChanged.cs b/VkNet/Model/GroupUpdate/DonutChanged.cs index 90038c7d9..0698895f7 100644 --- a/VkNet/Model/GroupUpdate/DonutChanged.cs +++ b/VkNet/Model/GroupUpdate/DonutChanged.cs @@ -11,7 +11,7 @@ namespace VkNet.Model.GroupUpdate /// Добавление участника или заявки на вступление в сообщество /// [Serializable] - public class DonutChanged + public class DonutChanged : IGroupUpdate { /// /// Идентификатор пользователя @@ -53,5 +53,22 @@ public static DonutChanged FromJson(VkResponse response) return groupJoin; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator DonutChanged(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } diff --git a/VkNet/Model/GroupUpdate/DonutEnd.cs b/VkNet/Model/GroupUpdate/DonutEnd.cs index bc4480f5e..9a6ceeede 100644 --- a/VkNet/Model/GroupUpdate/DonutEnd.cs +++ b/VkNet/Model/GroupUpdate/DonutEnd.cs @@ -11,7 +11,7 @@ namespace VkNet.Model.GroupUpdate /// Добавление участника или заявки на вступление в сообщество /// [Serializable] - public class DonutEnd + public class DonutEnd : IGroupUpdate { /// /// Идентификатор пользователя @@ -29,5 +29,22 @@ public static DonutEnd FromJson(VkResponse response) return groupJoin; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator DonutEnd(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } diff --git a/VkNet/Model/GroupUpdate/DonutNew.cs b/VkNet/Model/GroupUpdate/DonutNew.cs index 71d0e839b..84498119d 100644 --- a/VkNet/Model/GroupUpdate/DonutNew.cs +++ b/VkNet/Model/GroupUpdate/DonutNew.cs @@ -11,7 +11,7 @@ namespace VkNet.Model.GroupUpdate /// Добавление участника или заявки на вступление в сообщество /// [Serializable] - public class DonutNew + public class DonutNew : IGroupUpdate { /// /// Идентификатор пользователя @@ -41,5 +41,22 @@ public static DonutNew FromJson(VkResponse response) return groupJoin; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator DonutNew(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } diff --git a/VkNet/Model/GroupUpdate/DonutWithdraw.cs b/VkNet/Model/GroupUpdate/DonutWithdraw.cs index c4b8bf493..e7c813f7b 100644 --- a/VkNet/Model/GroupUpdate/DonutWithdraw.cs +++ b/VkNet/Model/GroupUpdate/DonutWithdraw.cs @@ -11,7 +11,7 @@ namespace VkNet.Model.GroupUpdate /// Добавление участника или заявки на вступление в сообщество /// [Serializable] - public class DonutWithdraw + public class DonutWithdraw : IGroupUpdate { /// /// Произошла ли ошибка @@ -49,5 +49,22 @@ public static DonutWithdraw FromJson(VkResponse response) return groupJoin; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator DonutWithdraw(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } diff --git a/VkNet/Model/GroupUpdate/GroupChangePhoto.cs b/VkNet/Model/GroupUpdate/GroupChangePhoto.cs index d822c3828..e2c5a35e7 100644 --- a/VkNet/Model/GroupUpdate/GroupChangePhoto.cs +++ b/VkNet/Model/GroupUpdate/GroupChangePhoto.cs @@ -8,7 +8,7 @@ namespace VkNet.Model.GroupUpdate /// Изменение главного фото /// [Serializable] - public class GroupChangePhoto + public class GroupChangePhoto : IGroupUpdate { /// /// Идентификатор пользователя, который внес изменения @@ -32,5 +32,22 @@ public static GroupChangePhoto FromJson(VkResponse response) Photo = response["photo"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator GroupChangePhoto(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/GroupJoin.cs b/VkNet/Model/GroupUpdate/GroupJoin.cs index d5e3922d1..5d33ec52b 100644 --- a/VkNet/Model/GroupUpdate/GroupJoin.cs +++ b/VkNet/Model/GroupUpdate/GroupJoin.cs @@ -11,7 +11,7 @@ namespace VkNet.Model.GroupUpdate /// Добавление участника или заявки на вступление в сообщество /// [Serializable] - public class GroupJoin + public class GroupJoin : IGroupUpdate { /// /// Идентификатор пользователя @@ -36,5 +36,22 @@ public static GroupJoin FromJson(VkResponse response) return groupJoin; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator GroupJoin(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/GroupLeave.cs b/VkNet/Model/GroupUpdate/GroupLeave.cs index 16445fbad..e20da7072 100644 --- a/VkNet/Model/GroupUpdate/GroupLeave.cs +++ b/VkNet/Model/GroupUpdate/GroupLeave.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Удаление/выход участника из сообщества /// [Serializable] - public class GroupLeave + public class GroupLeave : IGroupUpdate { /// /// Идентификатор пользователя @@ -31,5 +31,22 @@ public static GroupLeave FromJson(VkResponse response) IsSelf = response["self"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator GroupLeave(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/GroupOfficersEdit.cs b/VkNet/Model/GroupUpdate/GroupOfficersEdit.cs index c3d2c9cbe..567aa9448 100644 --- a/VkNet/Model/GroupUpdate/GroupOfficersEdit.cs +++ b/VkNet/Model/GroupUpdate/GroupOfficersEdit.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// Редактирование списка руководителей /// [Serializable] - public class GroupOfficersEdit + public class GroupOfficersEdit : IGroupUpdate { /// /// Идентификатор пользователя @@ -44,5 +44,22 @@ public static GroupOfficersEdit FromJson(VkResponse response) { return JsonConvert.DeserializeObject(response.ToString(), JsonConfigure.JsonSerializerSettings); } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator GroupOfficersEdit(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/GroupUpdate.cs b/VkNet/Model/GroupUpdate/GroupUpdate.cs index 6a47090e2..7b508d266 100644 --- a/VkNet/Model/GroupUpdate/GroupUpdate.cs +++ b/VkNet/Model/GroupUpdate/GroupUpdate.cs @@ -1,4 +1,6 @@ using System; +using System.Linq.Expressions; +using System.Reflection; using Newtonsoft.Json; using VkNet.Enums.SafetyEnums; using VkNet.Infrastructure; @@ -14,206 +16,250 @@ namespace VkNet.Model.GroupUpdate [Serializable] public class GroupUpdate { + /// + /// Экземпляр самого обновления группы. + /// + public IGroupUpdate Instance { get; private set; } + /// /// Тип обновления /// [JsonConverter(typeof(SafetyEnumJsonConverter))] + [Obsolete("Используйте свойство Instance")] public GroupUpdateType Type { get; set; } /// /// Сообщение для типов событий с сообщением в ответе. /// + [Obsolete("Используйте свойство Instance")] public MessageNew MessageNew { get; set; } + /// /// Собеседник набираеет сообщение /// + [Obsolete("Используйте свойство Instance")] public MessageTypingState MessageTypingState { get; set; } /// /// Событие о новой отметке "Мне нравится" /// + [Obsolete("Используйте свойство Instance")] public LikeAdd LikeAdd { get; set; } /// /// Событие о удалении отметки "Мне нравится" /// + [Obsolete("Используйте свойство Instance")] public LikeRemove LikeRemove { get; set; } /// /// Событие о изменении настроек сообщества /// + [Obsolete("Используйте свойство Instance")] public GroupChangeSettings GroupChangeSettings { get; set; } /// /// Платёж через VK Pay /// + [Obsolete("Используйте свойство Instance")] public VkPayTransaction VkPayTransaction { get; set; } /// /// Сообщение callback кнопки для типов событий с сообщением callback кнопок в ответе. /// + [Obsolete("Используйте свойство Instance")] public MessageEvent MessageEvent { get; set; } /// /// Сообщение для типов событий с сообщением в ответе /// (MessageEdit, MessageReply, для версий API ниже 5.103 также MessageNew). /// + [Obsolete("Используйте свойство Instance")] public Message Message { get; set; } /// /// Фотография для типов событий с фотографией в ответе(PhotoNew) /// + [Obsolete("Используйте свойство Instance")] public Photo Photo { get; set; } /// /// Аудиозапись /// + [Obsolete("Используйте свойство Instance")] public Audio Audio { get; set; } /// /// Видеозапись /// + [Obsolete("Используйте свойство Instance")] public Video Video { get; set; } /// /// Подписка на сообщения от сообщества /// + [Obsolete("Используйте свойство Instance")] public MessageAllow MessageAllow { get; set; } /// /// Новый запрет сообщений от сообщества(MessageDeny) /// + [Obsolete("Используйте свойство Instance")] public MessageDeny MessageDeny { get; set; } /// /// Добавление/редактирование/восстановление комментария к фотографии /// (PhotoCommentNew, PhotoCommentEdit, PhotoCommentRestore) /// + [Obsolete("Используйте свойство Instance")] public PhotoComment PhotoComment { get; set; } /// /// Удаление комментария к фотографии (PhotoCommentDelete) /// + [Obsolete("Используйте свойство Instance")] public PhotoCommentDelete PhotoCommentDelete { get; set; } /// /// Добавление/редактирование/восстановление комментария к видео /// (VideoCommentNew, VideoCommentEdit, VideoCommentRestore) /// + [Obsolete("Используйте свойство Instance")] public VideoComment VideoComment { get; set; } /// /// Удаление комментария к видео (VideoCommentDelete) /// + [Obsolete("Используйте свойство Instance")] public VideoCommentDelete VideoCommentDelete { get; set; } /// /// Добавление/редактирование/восстановление комментария в обсуждении /// (BoardPostNew, BoardPostEdit, BoardPostRestore) /// + [Obsolete("Используйте свойство Instance")] public BoardPost BoardPost { get; set; } /// /// Удаление комментария в обсуждении (BoardPostDelete) /// + [Obsolete("Используйте свойство Instance")] public BoardPostDelete BoardPostDelete { get; set; } /// /// Изменение главного фото /// + [Obsolete("Используйте свойство Instance")] public GroupChangePhoto GroupChangePhoto { get; set; } /// /// Добавление участника или заявки на вступление в сообщество /// + [Obsolete("Используйте свойство Instance")] public GroupJoin GroupJoin { get; set; } /// /// Удаление/выход участника из сообщества /// + [Obsolete("Используйте свойство Instance")] public GroupLeave GroupLeave { get; set; } /// /// Редактирование списка руководителей /// + [Obsolete("Используйте свойство Instance")] public GroupOfficersEdit GroupOfficersEdit { get; set; } /// /// Добавление/редактирование/восстановление комментария к товару /// (MarketCommentNew, MarketCommentEdit, MarketCommentRestore) /// + [Obsolete("Используйте свойство Instance")] public MarketComment MarketComment { get; set; } /// /// Удаление комментария к товару (MarketCommentDelete) /// + [Obsolete("Используйте свойство Instance")] public MarketCommentDelete MarketCommentDelete { get; set; } /// /// Добавление голоса в публичном опросе /// + [Obsolete("Используйте свойство Instance")] public PollVoteNew PollVoteNew { get; set; } /// /// Добавление пользователя в чёрный список /// + [Obsolete("Используйте свойство Instance")] public UserBlock UserBlock { get; set; } /// /// Удаление пользователя из чёрного списка /// + [Obsolete("Используйте свойство Instance")] public UserUnblock UserUnblock { get; set; } /// /// Новая запись на стене (WallPost, WallRepost) /// + [Obsolete("Используйте свойство Instance")] public WallPost WallPost { get; set; } /// /// Добавление/редактирование/восстановление комментария на стене /// (WallReplyNew, WallReplyEdit, WallReplyRestore) /// + [Obsolete("Используйте свойство Instance")] public WallReply WallReply { get; set; } /// /// Удаление комментария к записи (WallReplyDelete) /// + [Obsolete("Используйте свойство Instance")] public WallReplyDelete WallReplyDelete { get; set; } /// /// Cоздание/Продление подписки /// (DonutSubscriptionCreate, DonutSubscriptionProlonged) /// + [Obsolete("Используйте свойство Instance")] public DonutNew DonutSubscriptionNew { get; set; } /// /// Подписка истекла/отменена /// (DonutSubscriptionExpired, DonutSubscriptionCancelled) /// + [Obsolete("Используйте свойство Instance")] public DonutEnd DonutSubscriptionEnd { get; set; } /// /// Изменение стоимости подписки (DonutSubscriptionPriceChanged) /// + [Obsolete("Используйте свойство Instance")] public DonutChanged DonutSubscriptionPriceChanged { get; set; } /// /// Вывод денег /// (DonutMoneyWithdraw, DonutMoneyWithdrawError) /// + [Obsolete("Используйте свойство Instance")] public DonutWithdraw DonutMoneyWithdraw { get; set; } /// /// ID группы /// [JsonProperty("group_id")] + [Obsolete("Используйте свойство Instance")] public ulong? GroupId { get; set; } /// /// Secret Key для Callback /// [JsonProperty("secret")] + [Obsolete("Используйте свойство Instance")] public string Secret { get; set; } /// @@ -228,138 +274,82 @@ public class GroupUpdate /// public static GroupUpdate FromJson(VkResponse response) { - var fromJson = JsonConvert.DeserializeObject(response.ToString(), JsonConfigure.JsonSerializerSettings); - + string type = response["type"]; var resObj = response["object"]; + + var fromJson = type switch + { + "message_new" or "message_edit" or "message_reply" + => resObj.ContainsKey("client_info") + ? CreateTyped(u => u.MessageNew, resObj) + : CreateTyped(u => u.Message, resObj), + "message_allow" => CreateTyped(u => u.MessageAllow, resObj), + "message_typing_state" => CreateTyped(u => u.MessageTypingState, resObj), + "vkpay_transaction" => CreateTyped(u => u.VkPayTransaction, resObj), + "like_add" => CreateTyped(u => u.LikeAdd, resObj), + "like_remove" => CreateTyped(u => u.LikeRemove, resObj), + "group_change_settings" => CreateTyped(u => u.GroupChangeSettings, resObj), + "message_deny" => CreateTyped(u => u.MessageDeny, resObj), + "photo_new" => CreateTyped(u => u.Photo, resObj), + "photo_comment_new" or "photo_comment_edit" or "photo_comment_restore" => CreateTyped(u => u.PhotoComment, resObj), + "photo_comment_delete" => CreateTyped(u => u.PhotoCommentDelete, resObj), + "audio_new" => CreateTyped(u => u.Audio, resObj), + "video_new" => CreateTyped(u => u.Video, resObj), + "video_comment_new" or "video_comment_edit" or "video_comment_restore" => CreateTyped(u => u.VideoComment, resObj), + "video_comment_delete" => CreateTyped(u => u.VideoCommentDelete, resObj), + "wall_post_new" or "wall_repost" => CreateTyped(u => u.WallPost, resObj), + "wall_reply_new" or "wall_reply_edit" or "wall_reply_restore" => CreateTyped(u => u.WallReply, resObj), + "wall_reply_delete" => CreateTyped(u => u.WallReplyDelete, resObj), + "board_post_new" or "board_post_edit" or "board_post_restore" => CreateTyped(u => u.BoardPost, resObj), + "board_post_delete" => CreateTyped(u => u.BoardPostDelete, resObj), + "market_comment_new" or "market_comment_edit" or "market_comment_restore" => CreateTyped(u => u.MarketComment, resObj), + "market_comment_delete" => CreateTyped(u => u.MarketCommentDelete, resObj), + "group_leave" => CreateTyped(u => u.GroupLeave, resObj), + "group_join" => CreateTyped(u => u.GroupJoin, resObj), + "user_block" => CreateTyped(u => u.UserBlock, resObj), + "user_unblock" => CreateTyped(u => u.UserUnblock, resObj), + "poll_vote_new" => CreateTyped(u => u.PollVoteNew, resObj), + "group_change_photo" => CreateTyped(u => u.GroupChangePhoto, resObj), + "group_officers_edit" => CreateTyped(u => u.GroupOfficersEdit, resObj), + "message_event" => CreateTyped(u => u.MessageEvent, resObj), + "donut_subscription_create" or "donut_subscription_prolonged" => CreateTyped(u => u.DonutSubscriptionNew, resObj), + "donut_subscription_cancelled" or "donut_subscription_expired" => CreateTyped(u => u.DonutSubscriptionEnd, resObj), + "donut_subscription_price_changed" => CreateTyped(u => u.DonutSubscriptionPriceChanged, resObj), + "donut_money_withdraw" or "donut_money_withdraw_error" => CreateTyped(u => u.DonutMoneyWithdraw, resObj), + var _ => JsonConvert.DeserializeObject(response.ToString(), JsonConfigure.JsonSerializerSettings) + }; + + fromJson!.Type = GroupUpdateType.FromJsonString(type); fromJson.Raw = resObj; + fromJson.GroupId = response["group_id"]; + + return fromJson; + } + + #region Приватные методы - if (fromJson.Type == GroupUpdateType.MessageNew - || fromJson.Type == GroupUpdateType.MessageEdit - || fromJson.Type == GroupUpdateType.MessageReply) + private static GroupUpdate CreateTyped( + Expression> propertySelector, + TGroupUpdate instance) + where TGroupUpdate : IGroupUpdate + { + var update = new GroupUpdate { - if (resObj.ContainsKey("client_info")) - { - fromJson.MessageNew = resObj; - } - else + Instance = instance, + }; + + // для сохранения обратной совместимости с публичными свойствами. + if (propertySelector.Body is MemberExpression { - fromJson.Message = resObj; - } - } else if (fromJson.Type == GroupUpdateType.MessageAllow) - { - fromJson.MessageAllow = MessageAllow.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.MessageTypingState) - { - fromJson.MessageTypingState = MessageTypingState.FromJson(resObj); - }else if (fromJson.Type == GroupUpdateType.VkPayTransaction) - { - fromJson.VkPayTransaction = VkPayTransaction.FromJson(resObj); - }else if (fromJson.Type == GroupUpdateType.LikeAdd) - { - fromJson.LikeAdd = LikeAdd.FromJson(resObj); - }else if (fromJson.Type == GroupUpdateType.LikeRemove) - { - fromJson.LikeRemove = LikeRemove.FromJson(resObj); - }else if (fromJson.Type == GroupUpdateType.GroupChangeSettings) - { - fromJson.GroupChangeSettings = GroupChangeSettings.FromJson(resObj); - }else if (fromJson.Type == GroupUpdateType.MessageDeny) - { - fromJson.MessageDeny = MessageDeny.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.PhotoNew) - { - fromJson.Photo = resObj; - } else if (fromJson.Type == GroupUpdateType.PhotoCommentNew - || fromJson.Type == GroupUpdateType.PhotoCommentEdit - || fromJson.Type == GroupUpdateType.PhotoCommentRestore) - { - fromJson.PhotoComment = PhotoComment.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.PhotoCommentDelete) - { - fromJson.PhotoCommentDelete = PhotoCommentDelete.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.AudioNew) - { - fromJson.Audio = resObj; - } else if (fromJson.Type == GroupUpdateType.VideoNew) + Member: PropertyInfo propertyInfo + }) { - fromJson.Video = resObj; - } else if (fromJson.Type == GroupUpdateType.VideoCommentNew - || fromJson.Type == GroupUpdateType.VideoCommentEdit - || fromJson.Type == GroupUpdateType.VideoCommentRestore) - { - fromJson.VideoComment = VideoComment.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.VideoCommentDelete) - { - fromJson.VideoCommentDelete = VideoCommentDelete.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.WallPostNew || fromJson.Type == GroupUpdateType.WallRepost) - { - fromJson.WallPost = WallPost.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.WallReplyNew - || fromJson.Type == GroupUpdateType.WallReplyEdit - || fromJson.Type == GroupUpdateType.WallReplyRestore) - { - fromJson.WallReply = WallReply.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.WallReplyDelete) - { - fromJson.WallReplyDelete = WallReplyDelete.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.BoardPostNew - || fromJson.Type == GroupUpdateType.BoardPostEdit - || fromJson.Type == GroupUpdateType.BoardPostRestore) - { - fromJson.BoardPost = BoardPost.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.BoardPostDelete) - { - fromJson.BoardPostDelete = BoardPostDelete.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.MarketCommentNew - || fromJson.Type == GroupUpdateType.MarketCommentEdit - || fromJson.Type == GroupUpdateType.MarketCommentRestore) - { - fromJson.MarketComment = MarketComment.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.MarketCommentDelete) - { - fromJson.MarketCommentDelete = MarketCommentDelete.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.GroupLeave) - { - fromJson.GroupLeave = GroupLeave.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.GroupJoin) - { - fromJson.GroupJoin = GroupJoin.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.UserBlock) - { - fromJson.UserBlock = UserBlock.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.UserUnblock) - { - fromJson.UserUnblock = UserUnblock.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.PollVoteNew) - { - fromJson.PollVoteNew = PollVoteNew.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.GroupChangePhoto) - { - fromJson.GroupChangePhoto = GroupChangePhoto.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.GroupOfficersEdit) - { - fromJson.GroupOfficersEdit = GroupOfficersEdit.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.MessageEvent) - { - fromJson.MessageEvent = MessageEvent.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.DonutSubscriptionCreate - || fromJson.Type == GroupUpdateType.DonutSubscriptionProlonged) - { - fromJson.DonutSubscriptionNew = DonutNew.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.DonutSubscriptionCanceled - || fromJson.Type == GroupUpdateType.DonutSubscriptionExpired) - { - fromJson.DonutSubscriptionEnd = DonutEnd.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.DonutSubscriptionPriceChanged) - { - fromJson.DonutSubscriptionPriceChanged = DonutChanged.FromJson(resObj); - } else if (fromJson.Type == GroupUpdateType.DonutMoneyWithdraw - || fromJson.Type == GroupUpdateType.DonutMoneyWithdrawError) - { - fromJson.DonutMoneyWithdraw = DonutWithdraw.FromJson(resObj); + propertyInfo.SetValue(update, instance); } - return fromJson; + return update; } + + #endregion } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/IGroupUpdate.cs b/VkNet/Model/GroupUpdate/IGroupUpdate.cs new file mode 100644 index 000000000..60208aa16 --- /dev/null +++ b/VkNet/Model/GroupUpdate/IGroupUpdate.cs @@ -0,0 +1,9 @@ +namespace VkNet.Model.GroupUpdate; + +/// +/// Интерфейс-маркер для обновлений группы +/// +public interface IGroupUpdate +{ + +} \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/MarketComment.cs b/VkNet/Model/GroupUpdate/MarketComment.cs index 16f770b65..7dda861a3 100644 --- a/VkNet/Model/GroupUpdate/MarketComment.cs +++ b/VkNet/Model/GroupUpdate/MarketComment.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// (Comment с дополнительными полями) /// [Serializable] - public class MarketComment : Comment + public class MarketComment : Comment, IGroupUpdate { /// /// Идентификатор товара @@ -42,5 +42,22 @@ public class MarketComment : Comment MarketOwnerId = response["market_owner_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator MarketComment(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/MarketCommentDelete.cs b/VkNet/Model/GroupUpdate/MarketCommentDelete.cs index c5fb71635..16437a1f3 100644 --- a/VkNet/Model/GroupUpdate/MarketCommentDelete.cs +++ b/VkNet/Model/GroupUpdate/MarketCommentDelete.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Удаление комментария к товару (MarketCommentDelete) /// [Serializable] - public class MarketCommentDelete + public class MarketCommentDelete : IGroupUpdate { /// /// Идентификатор комментария @@ -49,5 +49,22 @@ public static MarketCommentDelete FromJson(VkResponse response) DeleterId = response["deleter_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator MarketCommentDelete(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/MessageAllow.cs b/VkNet/Model/GroupUpdate/MessageAllow.cs index 5b254ec1d..a592046dc 100644 --- a/VkNet/Model/GroupUpdate/MessageAllow.cs +++ b/VkNet/Model/GroupUpdate/MessageAllow.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Подписка на сообщения от сообщества (MessageAllow, ваш капитан!) /// [Serializable] - public class MessageAllow + public class MessageAllow : IGroupUpdate { /// /// Идентификатор пользователя @@ -31,5 +31,22 @@ public static MessageAllow FromJson(VkResponse response) Key = response["key"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator MessageAllow(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/MessageDeny.cs b/VkNet/Model/GroupUpdate/MessageDeny.cs index c0c2ce5a8..41326b4e6 100644 --- a/VkNet/Model/GroupUpdate/MessageDeny.cs +++ b/VkNet/Model/GroupUpdate/MessageDeny.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Новый запрет сообщений от сообщества (MessageDeny) /// [Serializable] - public class MessageDeny + public class MessageDeny : IGroupUpdate { /// /// Идентификатор пользователя @@ -22,5 +22,22 @@ public static MessageDeny FromJson(VkResponse response) { return new MessageDeny { UserId = response["user_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator MessageDeny(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/MessageEvent.cs b/VkNet/Model/GroupUpdate/MessageEvent.cs index e3a4abb6e..11ddb23b2 100644 --- a/VkNet/Model/GroupUpdate/MessageEvent.cs +++ b/VkNet/Model/GroupUpdate/MessageEvent.cs @@ -8,7 +8,7 @@ namespace VkNet.Model.GroupUpdate /// Объект, который содержит сообщение и информацию о доступных пользователю функциях. /// [Serializable] - public class MessageEvent + public class MessageEvent : IGroupUpdate { /// /// Идентификатор пользователя. diff --git a/VkNet/Model/GroupUpdate/MessageNew.cs b/VkNet/Model/GroupUpdate/MessageNew.cs index e11898ecd..b1ccbd8c5 100644 --- a/VkNet/Model/GroupUpdate/MessageNew.cs +++ b/VkNet/Model/GroupUpdate/MessageNew.cs @@ -8,7 +8,7 @@ namespace VkNet.Model.GroupUpdate /// Объект, который содержит сообщение и информацию о доступных пользователю функциях. /// [Serializable] - public class MessageNew + public class MessageNew : IGroupUpdate { /// /// Сообщение. diff --git a/VkNet/Model/GroupUpdate/PhotoComment.cs b/VkNet/Model/GroupUpdate/PhotoComment.cs index ae704c694..a53070bfa 100644 --- a/VkNet/Model/GroupUpdate/PhotoComment.cs +++ b/VkNet/Model/GroupUpdate/PhotoComment.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// (Comment с дополнительными полями) /// [Serializable] - public class PhotoComment : Comment + public class PhotoComment : Comment, IGroupUpdate { /// /// Идентификатор фотографии @@ -42,5 +42,22 @@ public class PhotoComment : Comment PhotoOwnerId = response["photo_owner_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator PhotoComment(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/PhotoCommentDelete.cs b/VkNet/Model/GroupUpdate/PhotoCommentDelete.cs index d5098b2a8..af32d6a7d 100644 --- a/VkNet/Model/GroupUpdate/PhotoCommentDelete.cs +++ b/VkNet/Model/GroupUpdate/PhotoCommentDelete.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Удаление комментария к фотографии (PhotoCommentDelete) /// [Serializable] - public class PhotoCommentDelete + public class PhotoCommentDelete : IGroupUpdate { /// /// Идентификатор комментария @@ -49,5 +49,22 @@ public static PhotoCommentDelete FromJson(VkResponse response) DeleterId = response["deleter_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator PhotoCommentDelete(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/PollVoteNew.cs b/VkNet/Model/GroupUpdate/PollVoteNew.cs index 62714262c..8c8b91cb8 100644 --- a/VkNet/Model/GroupUpdate/PollVoteNew.cs +++ b/VkNet/Model/GroupUpdate/PollVoteNew.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Добавление голоса в публичном опросе /// [Serializable] - public class PollVoteNew + public class PollVoteNew : IGroupUpdate { /// /// Идентификатор пользователя @@ -43,5 +43,22 @@ public static PollVoteNew FromJson(VkResponse response) OwnerId = response["owner_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator PollVoteNew(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/UserBlock.cs b/VkNet/Model/GroupUpdate/UserBlock.cs index cb6bccc89..8c33187c2 100644 --- a/VkNet/Model/GroupUpdate/UserBlock.cs +++ b/VkNet/Model/GroupUpdate/UserBlock.cs @@ -11,7 +11,7 @@ namespace VkNet.Model.GroupUpdate /// Добавление пользователя в чёрный список /// [Serializable] - public class UserBlock + public class UserBlock : IGroupUpdate { /// /// Идентификатор пользователя @@ -55,5 +55,22 @@ public static UserBlock FromJson(VkResponse response) return userBlock; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator UserBlock(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/UserUnblock.cs b/VkNet/Model/GroupUpdate/UserUnblock.cs index bc15be0b2..bc32b4a9b 100644 --- a/VkNet/Model/GroupUpdate/UserUnblock.cs +++ b/VkNet/Model/GroupUpdate/UserUnblock.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Удаление пользователя из чёрного списка /// [Serializable] - public class UserUnblock + public class UserUnblock : IGroupUpdate { /// /// Идентификатор пользователя @@ -37,5 +37,22 @@ public static UserUnblock FromJson(VkResponse response) ByEndDate = (long) response["by_end_date"] > 0 }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator UserUnblock(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/VideoComment.cs b/VkNet/Model/GroupUpdate/VideoComment.cs index 7910cde0b..d31dffff2 100644 --- a/VkNet/Model/GroupUpdate/VideoComment.cs +++ b/VkNet/Model/GroupUpdate/VideoComment.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// (Comment с дополнительными полями) /// [Serializable] - public class VideoComment : Comment + public class VideoComment : Comment, IGroupUpdate { /// /// Идентификатор видеозаписи @@ -42,5 +42,22 @@ public class VideoComment : Comment VideoOwnerId = response["video_owner_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator VideoComment(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/VideoCommentDelete.cs b/VkNet/Model/GroupUpdate/VideoCommentDelete.cs index 95dba9e6f..e6c69ea36 100644 --- a/VkNet/Model/GroupUpdate/VideoCommentDelete.cs +++ b/VkNet/Model/GroupUpdate/VideoCommentDelete.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Удаление комментария к видео (VideoCommentDelete) /// [Serializable] - public class VideoCommentDelete + public class VideoCommentDelete : IGroupUpdate { /// /// Идентификатор комментария @@ -49,5 +49,22 @@ public static VideoCommentDelete FromJson(VkResponse response) DeleterId = response["deleter_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator VideoCommentDelete(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/WallPost.cs b/VkNet/Model/GroupUpdate/WallPost.cs index b59040fdc..54e286817 100644 --- a/VkNet/Model/GroupUpdate/WallPost.cs +++ b/VkNet/Model/GroupUpdate/WallPost.cs @@ -9,7 +9,7 @@ namespace VkNet.Model.GroupUpdate /// (Post с дополнительными полями) /// [Serializable] - public class WallPost : Post + public class WallPost : Post, IGroupUpdate { /// /// Id отложенной записи @@ -60,5 +60,22 @@ public class WallPost : Post Donut = response["donut"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator WallPost(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/WallReply.cs b/VkNet/Model/GroupUpdate/WallReply.cs index 60e1901b4..77f620171 100644 --- a/VkNet/Model/GroupUpdate/WallReply.cs +++ b/VkNet/Model/GroupUpdate/WallReply.cs @@ -10,7 +10,7 @@ namespace VkNet.Model.GroupUpdate /// (Comment с дополнительными полями) /// [Serializable] - public class WallReply : Comment + public class WallReply : Comment, IGroupUpdate { /// /// Идентификатор записи @@ -42,5 +42,22 @@ public class WallReply : Comment PostOwnerId = response["post_owner_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator WallReply(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file diff --git a/VkNet/Model/GroupUpdate/WallReplyDelete.cs b/VkNet/Model/GroupUpdate/WallReplyDelete.cs index 3a3cc469b..7ebc12699 100644 --- a/VkNet/Model/GroupUpdate/WallReplyDelete.cs +++ b/VkNet/Model/GroupUpdate/WallReplyDelete.cs @@ -7,7 +7,7 @@ namespace VkNet.Model.GroupUpdate /// Удаление комментария к записи (WallReplyDelete) /// [Serializable] - public class WallReplyDelete + public class WallReplyDelete : IGroupUpdate { /// /// Идентификатор комментария @@ -49,5 +49,22 @@ public static WallReplyDelete FromJson(VkResponse response) DeleterId = response["deleter_id"] }; } + + /// + /// Преобразование класса в + /// + /// Ответ сервера. + /// Результат преобразования в + public static implicit operator WallReplyDelete(VkResponse response) + { + if (response == null) + { + return null; + } + + return response.HasToken() + ? FromJson(response) + : null; + } } } \ No newline at end of file