Skip to content

Commit

Permalink
Сервис для обработки вложений с возможностью расширения (#1555)
Browse files Browse the repository at this point in the history
Co-authored-by: Sem <9l@tut.by>
Co-authored-by: inyutin-maxim <inyutin_maxim@mail.ru>
  • Loading branch information
3 people committed Jul 20, 2023
1 parent 9dda1f9 commit 5f5b83f
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 50 deletions.
102 changes: 102 additions & 0 deletions VkNet/Utils/AttachmentConverterService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
using Newtonsoft.Json.Linq;
using VkNet.Model;

namespace VkNet.Utils
{
/// <summary>
/// Сервис для обработки вложений
/// </summary>
public class AttachmentConverterService
{
/// <summary>
/// Инстанция сервиса.
/// Может быть переопределена кастомной реализацией
/// </summary>
public static AttachmentConverterService Instance { get; set; } = new AttachmentConverterService();

/// <summary>
/// Десериализация из json
/// </summary>
public virtual Attachment FromJson(JToken item)
{
var type = item["type"].ToString();

var typeToken = item[type];

var attachment = type switch
{
"link" => CreateTyped(typeToken
.ToObject<Link>()),
"photo" or "posted_photo" => CreateTyped(typeToken
.ToObject<Photo>()),
"audio" => CreateTyped(typeToken
.ToObject<Audio>()),
"video" => CreateTyped(typeToken
.ToObject<Video>()),
"doc" => CreateTyped(typeToken
.ToObject<Document>()),
"podcast" => CreateTyped(typeToken
.ToObject<Podcast>()),
"article" => CreateTyped(typeToken
.ToObject<Article>()),
"event" => CreateTyped(typeToken
.ToObject<Event>()),
"graffiti" => CreateTyped(typeToken
.ToObject<Graffiti>()),
"money_transfer" => CreateTyped(typeToken
.ToObject<MoneyTransfer>()),
"money_request" => CreateTyped(typeToken
.ToObject<MoneyRequest>()),
"note" => CreateTyped(typeToken
.ToObject<Note>()),
"poll" => CreateTyped(typeToken
.ToObject<Poll>()),
"page" => CreateTyped(typeToken
.ToObject<Page>()),
"album" => CreateTyped(typeToken
.ToObject<Album>()),
"photos_list" => CreateTyped(typeToken
.ToObject<PhotosList>()),

Check warning on line 59 in VkNet/Utils/AttachmentConverterService.cs

View workflow job for this annotation

GitHub Actions / build

'PhotosList' is obsolete: 'Для версии API ниже 5.0'

Check warning on line 59 in VkNet/Utils/AttachmentConverterService.cs

View workflow job for this annotation

GitHub Actions / build

'PhotosList' is obsolete: 'Для версии API ниже 5.0'
"wall" => CreateTyped(typeToken
.ToObject<Wall>()),
"sticker" => CreateTyped(typeToken
.ToObject<Sticker>()),
"wall_reply" => CreateTyped(typeToken
.ToObject<WallReply>()),
"market_album" => CreateTyped(typeToken
.ToObject<MarketAlbum>()),
"market" => CreateTyped(typeToken
.ToObject<Market>()),
"pretty_cards" => CreateTyped(typeToken
.ToObject<PrettyCards>()),
"audio_message" => CreateTyped(typeToken
.ToObject<AudioMessage>()),
"call" => CreateTyped(typeToken
.ToObject<Call>()),
"story" => CreateTyped(typeToken
.ToObject<Story>()),
"audio_playlist" => CreateTyped(typeToken
.ToObject<AudioPlaylist>()),
var _ => CreateTyped(typeToken
.ToObject<UnknownAttachment>())
};

return attachment;
}

/// <summary>
/// Создает экземпляр Attachment
/// </summary>
protected virtual Attachment CreateTyped<TAttachment>(TAttachment instance)
where TAttachment : MediaAttachment
{
var attachment = new Attachment
{
Type = typeof(TAttachment),
Instance = instance
};

return attachment;
}
}
}
53 changes: 3 additions & 50 deletions VkNet/Utils/JsonConverter/AttachmentJsonConverter.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using System;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using VkNet.Model;
using VkNet.Utils;

namespace VkNet.Utils.JsonConverter;

Expand Down Expand Up @@ -73,60 +74,12 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist

foreach (var item in obj)
{
var type = item["type"].ToString();

var attachment = type switch
{
"link" => CreateTyped(item[type].ToObject<Link>()),
"photo" or "posted_photo" => CreateTyped(item[type].ToObject<Photo>()),
"audio" => CreateTyped(item[type].ToObject<Audio>()),
"video" => CreateTyped(item[type].ToObject<Video>()),
"doc" => CreateTyped(item[type].ToObject<Document>()),
"podcast" => CreateTyped(item[type].ToObject<Podcast>()),
"article" => CreateTyped(item[type].ToObject<Article>()),
"event" => CreateTyped(item[type].ToObject<Event>()),
"graffiti" => CreateTyped(item[type].ToObject<Graffiti>()),
"money_transfer" => CreateTyped(item[type].ToObject<MoneyTransfer>()),
"money_request" => CreateTyped(item[type].ToObject<MoneyRequest>()),
"note" => CreateTyped(item[type].ToObject<Note>()),
"poll" => CreateTyped(item[type].ToObject<Poll>()),
"page" => CreateTyped(item[type].ToObject<Page>()),
"album" => CreateTyped(item[type].ToObject<Album>()),
"photos_list" => CreateTyped(item[type].ToObject<PhotosList>()),
"wall" => CreateTyped(item[type].ToObject<Wall>()),
"sticker" => CreateTyped(item[type].ToObject<Sticker>()),
"wall_reply" => CreateTyped(item[type].ToObject<WallReply>()),
"market_album" => CreateTyped(item[type].ToObject<MarketAlbum>()),
"market" => CreateTyped(item[type].ToObject<Market>()),
"pretty_cards" => CreateTyped(item[type].ToObject<PrettyCards>()),
"audio_message" => CreateTyped(item[type].ToObject<AudioMessage>()),
"call" => CreateTyped(item[type].ToObject<Call>()),
"story" => CreateTyped(item[type].ToObject<Story>()),
"audio_playlist" => CreateTyped(item[type].ToObject<AudioPlaylist>()),
var _ => CreateTyped(item[type].ToObject<UnknownAttachment>())
};

list.Add(attachment);
list.Add(AttachmentConverterService.Instance.FromJson(item));
}

return Activator.CreateInstance(vkCollection, list);
}

#region Приватные методы

private static Attachment CreateTyped<TAttachment>(TAttachment instance)
where TAttachment : MediaAttachment
{
var attachment = new Attachment
{
Type = typeof(TAttachment),
Instance = instance
};

return attachment;
}

#endregion

/// <inheritdoc />
public override bool CanConvert(Type objectType) => typeof(ReadOnlyCollection<>).IsAssignableFrom(c: objectType);
Expand Down

0 comments on commit 5f5b83f

Please sign in to comment.