From 7ac03c5898d09d3f65ea3aed38772af2f85ac8fb Mon Sep 17 00:00:00 2001 From: gil zhang Date: Sun, 26 Mar 2023 17:11:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E5=90=88=E8=A1=A8=E6=83=85=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=AF=BC=E5=85=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ElectronBot.BraincasePreview/App.xaml.cs | 1 + .../Controls/MarketplacePage.xaml | 48 +++--- .../Controls/MarketplacePage.xaml.cs | 4 +- .../Models/eShop/EmojisHttpData.cs | 23 +++ .../Models/eShop/EmojisItemDto.cs | 5 + .../Services/eShop/EmojiseShopService.cs | 153 +++++++++++++++++- .../Strings/en-us/Resources.resw | 9 ++ .../Strings/zh-cn/Resources.resw | 9 ++ .../ViewModels/EmojisEditViewModel.cs | 13 +- .../ViewModels/MarketplaceViewModel.cs | 60 +++++++ .../Views/EmojisEditPage.xaml | 2 +- 11 files changed, 285 insertions(+), 42 deletions(-) create mode 100644 src/ElectronBot.BraincasePreview/Models/eShop/EmojisHttpData.cs create mode 100644 src/ElectronBot.BraincasePreview/ViewModels/MarketplaceViewModel.cs diff --git a/src/ElectronBot.BraincasePreview/App.xaml.cs b/src/ElectronBot.BraincasePreview/App.xaml.cs index 3322f0a..81de6ed 100644 --- a/src/ElectronBot.BraincasePreview/App.xaml.cs +++ b/src/ElectronBot.BraincasePreview/App.xaml.cs @@ -132,6 +132,7 @@ public partial class App : Application services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml b/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml index becad7a..ee40950 100644 --- a/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml +++ b/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml @@ -13,6 +13,7 @@ xmlns:local="using:Controls" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:models="using:ElectronBot.BraincasePreview.Models" + xmlns:models1="using:Models" Width="800" Height="400" MinWidth="800" @@ -20,14 +21,14 @@ Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" mc:Ignorable="d"> - - + + - + @@ -35,33 +36,30 @@ - + - + - + --> + - + - - - - - - - - + diff --git a/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml.cs b/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml.cs index 5220e50..2b21ca7 100644 --- a/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml.cs +++ b/src/ElectronBot.BraincasePreview/Controls/MarketplacePage.xaml.cs @@ -27,14 +27,14 @@ namespace Controls; /// public sealed partial class MarketplacePage : Page { - public EmojisEditViewModel ViewModel + public MarketplaceViewModel ViewModel { get; } public MarketplacePage() { - ViewModel = App.GetService(); + ViewModel = App.GetService(); this.InitializeComponent(); } } diff --git a/src/ElectronBot.BraincasePreview/Models/eShop/EmojisHttpData.cs b/src/ElectronBot.BraincasePreview/Models/eShop/EmojisHttpData.cs new file mode 100644 index 0000000..5a749de --- /dev/null +++ b/src/ElectronBot.BraincasePreview/Models/eShop/EmojisHttpData.cs @@ -0,0 +1,23 @@ +namespace Models +{ + + public class EmojisHttpData + { + public int PageIndex + { + get; set; + } + public int PageSize + { + get; set; + } + public int Count + { + get; set; + } + public List Items + { + get; set; + } = new(); + } +} diff --git a/src/ElectronBot.BraincasePreview/Models/eShop/EmojisItemDto.cs b/src/ElectronBot.BraincasePreview/Models/eShop/EmojisItemDto.cs index 5345453..8930b07 100644 --- a/src/ElectronBot.BraincasePreview/Models/eShop/EmojisItemDto.cs +++ b/src/ElectronBot.BraincasePreview/Models/eShop/EmojisItemDto.cs @@ -11,6 +11,11 @@ public class EmojisItemDto get; set; } = string.Empty; + public string Desc + { + get; set; + } = string.Empty; + public decimal Price { get; set; diff --git a/src/ElectronBot.BraincasePreview/Services/eShop/EmojiseShopService.cs b/src/ElectronBot.BraincasePreview/Services/eShop/EmojiseShopService.cs index bc66089..2a7a3c6 100644 --- a/src/ElectronBot.BraincasePreview/Services/eShop/EmojiseShopService.cs +++ b/src/ElectronBot.BraincasePreview/Services/eShop/EmojiseShopService.cs @@ -1,9 +1,13 @@ using System.Net.Http.Headers; using System.Text.Json; using Contracts.Services; +using ElectronBot.BraincasePreview; +using ElectronBot.BraincasePreview.Contracts.Services; +using ElectronBot.BraincasePreview.Helpers; using ElectronBot.BraincasePreview.Models; using Models; -using Windows.Media.Protection.PlayReady; +using Verdure.ElectronBot.Core.Helpers; +using Windows.Storage; namespace Services; public class EmojiseShopService : IEmojiseShopService @@ -13,30 +17,165 @@ public class EmojiseShopService : IEmojiseShopService private const string ProfileImageUploadUri = "http://api.douwp.club"; private readonly IEmojisFileService _emojisFileService; - public EmojiseShopService(IHttpClientFactory httpClientFactory, IEmojisFileService emojisFileService) + + private readonly ILocalSettingsService _localSettingsService; + public EmojiseShopService(IHttpClientFactory httpClientFactory, + IEmojisFileService emojisFileService, + ILocalSettingsService localSettingsService) { _httpClientFactory = httpClientFactory; _emojisFileService = emojisFileService; + _localSettingsService = localSettingsService; } public async Task DownloadEmojisAsync(string id) { var httpClient = _httpClientFactory.CreateClient(); var response = await httpClient.GetAsync($"{ProfileImageUploadUri}/api/GridFS/Download/{id}"); - - using (var stream = await response.Content.ReadAsStreamAsync()) + + if (response.IsSuccessStatusCode) { - using (var fileStream = new FileStream(@"C:\Users\gil\cursor-tutor\file.zip", FileMode.Create)) + + var contentDisposition = response?.Content?.Headers?.ContentDisposition.FileName; + + var fileName = contentDisposition.Replace("\"", ""); + + using (var stream = await response.Content.ReadAsStreamAsync()) { - await stream.CopyToAsync(fileStream); + var folder = ApplicationData.Current.LocalFolder; + + var storageFolder = await folder.CreateFolderAsync(Constants.EmojisTempFileFolder, CreationCollisionOption.OpenIfExists); + + using (var fileStream = new FileStream($"{storageFolder.Path}/{fileName}", FileMode.Create)) + { + await stream.CopyToAsync(fileStream); + } + ZipFileCreatorHelper.ExtractZipFile($"{storageFolder.Path}/{fileName}", storageFolder.Path); + + var file = await storageFolder.GetFileAsync(fileName); + + if (file != null) + { + await file.DeleteAsync(); + } + + var fileNames = await storageFolder.GetFilesAsync(); + + var list = (await _localSettingsService + .ReadSettingAsync>(Constants.EmojisActionListKey)) ?? new List(); + + var action = new EmoticonAction(); + + if (fileNames != null && fileNames.Count > 0) + { + foreach (var fileItem in fileNames) + { + if (fileItem.Name.Contains("manifest")) + { + var text = await FileIO.ReadTextAsync(fileItem); + + var emojisFileInfo = JsonSerializer.Deserialize(text) ?? throw new Exception("表情不存在"); + action.Name = emojisFileInfo.Name; + action.NameId = emojisFileInfo.NameId; + action.Desc = emojisFileInfo.Description; + action.EmojisType = emojisFileInfo.EmojisType; + action.HasAction = emojisFileInfo.HasAction; + } + else + { + if (list.Where(e => e.NameId == fileItem.DisplayName).Any() || Constants.EMOJI_ACTION_LIST.Where(e => e.NameId == fileItem.DisplayName).Any()) + { + ToastHelper.SendToast("EmojisNameIdAlreadyExists".GetLocalized(), TimeSpan.FromSeconds(3)); + + await storageFolder.DeleteAsync(); + return null; + } + + var actionFolder = await folder.CreateFolderAsync(Constants.EmojisFolder, CreationCollisionOption.OpenIfExists); + + var storageFile = await actionFolder + .CreateFileAsync(fileItem.Name, CreationCollisionOption.OpenIfExists); + + await FileIO.WriteBytesAsync(storageFile, await fileItem.ReadBytesAsync()); + + if (storageFile.FileType == ".mp4") + { + action.EmojisVideoPath = storageFile.Path; + } + else if (storageFile.FileType == ".png" || + storageFile.FileType == ".jpg" || + storageFile.FileType == ".jpeg") + { + action.Avatar = storageFile.Path; + } + else if (storageFile.FileType == ".json") + { + action.EmojisActionPath = storageFile.Path; + } + } + } + + var actions = new List() + { + action + }; + + list.AddRange(actions); + + await _localSettingsService.SaveSettingAsync>(Constants.EmojisActionListKey, list); + + await storageFolder.DeleteAsync(); + + return new EmoticonAction(); + } } } + + return null; } public Task GetEmojisItemAsync(string id) => throw new NotImplementedException(); - public Task> GetEmojisListAsync(EmojisItemQuery itemQuery) => throw new NotImplementedException(); + public async Task> GetEmojisListAsync(EmojisItemQuery itemQuery) + { + var httpClient = _httpClientFactory.CreateClient(); + + var response = await httpClient.GetAsync($"{ProfileImageUploadUri}/api/v1/Catalog/items/by_page?typeId=-1&brandId=-1&pageSize={itemQuery.PageSize}&pageIndex={itemQuery.PageIndex}"); + + var list = new List(); + + if (response.IsSuccessStatusCode) + { + var resultData = await response.Content.ReadAsStringAsync(); + + var options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + + var emojisData = JsonSerializer.Deserialize(resultData, options); + + if (emojisData is not null) + { + foreach (var emojisItem in emojisData.Items) + { + var item = new EmojisItemDto + { + Id = emojisItem.Id, + Name = emojisItem.Name, + Desc = emojisItem.Desc, + PictureFileId = emojisItem.PictureFileId, + PictureFileName = $"{ProfileImageUploadUri}/api/Pics/{emojisItem.PictureFileName}", + Price = emojisItem.Price, + VideoFileId = emojisItem.VideoFileId, + }; + list.Add(item); + } + } + } + return list; + } public async Task UploadEmojisAsync(EmoticonAction emoticon) { var pathName = await _emojisFileService.ExportEmojisFileToTempAsync(emoticon); diff --git a/src/ElectronBot.BraincasePreview/Strings/en-us/Resources.resw b/src/ElectronBot.BraincasePreview/Strings/en-us/Resources.resw index 4c17842..25db2ba 100644 --- a/src/ElectronBot.BraincasePreview/Strings/en-us/Resources.resw +++ b/src/ElectronBot.BraincasePreview/Strings/en-us/Resources.resw @@ -616,4 +616,13 @@ 分享表情 + + 下载表情 + + + 关闭 + + + 表情商城 + \ No newline at end of file diff --git a/src/ElectronBot.BraincasePreview/Strings/zh-cn/Resources.resw b/src/ElectronBot.BraincasePreview/Strings/zh-cn/Resources.resw index d65c10d..01ff3dd 100644 --- a/src/ElectronBot.BraincasePreview/Strings/zh-cn/Resources.resw +++ b/src/ElectronBot.BraincasePreview/Strings/zh-cn/Resources.resw @@ -619,4 +619,13 @@ 分享表情 + + 下载表情 + + + 关闭 + + + 表情商城 + \ No newline at end of file diff --git a/src/ElectronBot.BraincasePreview/ViewModels/EmojisEditViewModel.cs b/src/ElectronBot.BraincasePreview/ViewModels/EmojisEditViewModel.cs index 22b5981..79dd669 100644 --- a/src/ElectronBot.BraincasePreview/ViewModels/EmojisEditViewModel.cs +++ b/src/ElectronBot.BraincasePreview/ViewModels/EmojisEditViewModel.cs @@ -101,16 +101,15 @@ public partial class EmojisEditViewModel : ObservableRecipient } [RelayCommand] - public async void RandomContentEdit() + public async void Marketplace() { try { - var randomContentEditDialog = new ContentDialog() + var marketplaceDialog = new ContentDialog() { - Title = "AddRandomContentTitle".GetLocalized(), - PrimaryButtonText = "AddEmojisOkBtnContent".GetLocalized(), - CloseButtonText = "AddEmojisCancelBtnContent".GetLocalized(), - DefaultButton = ContentDialogButton.Primary, + Title = "MarketplaceDialogTitle".GetLocalized(), + CloseButtonText = "MarketplaceDialogClose".GetLocalized(), + DefaultButton = ContentDialogButton.Close, XamlRoot = App.MainWindow.Content.XamlRoot, Width = 800, Height = 600, @@ -118,7 +117,7 @@ public partial class EmojisEditViewModel : ObservableRecipient Content = new MarketplacePage() }; - await randomContentEditDialog.ShowAsync(); + await marketplaceDialog.ShowAsync(); } catch (Exception) { diff --git a/src/ElectronBot.BraincasePreview/ViewModels/MarketplaceViewModel.cs b/src/ElectronBot.BraincasePreview/ViewModels/MarketplaceViewModel.cs new file mode 100644 index 0000000..566087f --- /dev/null +++ b/src/ElectronBot.BraincasePreview/ViewModels/MarketplaceViewModel.cs @@ -0,0 +1,60 @@ +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Contracts.Services; +using ElectronBot.BraincasePreview.Helpers; +using Models; + +namespace ElectronBot.BraincasePreview.ViewModels; + +public partial class MarketplaceViewModel : ObservableRecipient +{ + private ObservableCollection _emojisList = new(); + + private readonly IEmojiseShopService _emojiseShopService; + + public MarketplaceViewModel( + IEmojiseShopService emojiseShopService) + { + _emojiseShopService = emojiseShopService; + } + + [RelayCommand] + public async void Loaded() + { + var list = await _emojiseShopService.GetEmojisListAsync(new EmojisItemQuery { PageIndex = 0, PageSize = 100 }); + + EmojisList = new ObservableCollection(list); + } + + [RelayCommand] + public async void DownLoadEmojis(object? obj) + { + if (obj is EmojisItemDto emojis) + { + IsActive = true; + var ret = await _emojiseShopService.DownloadEmojisAsync(emojis.VideoFileId); + + if (ret is not null) + { + ToastHelper.SendToast("下载表情成功", TimeSpan.FromSeconds(3)); + } + else + { + ToastHelper.SendToast("表情下载失败", TimeSpan.FromSeconds(3)); + } + + IsActive = false; + } + + } + + [ObservableProperty] + bool isActive = false; + + public ObservableCollection EmojisList + { + get => _emojisList; + set => SetProperty(ref _emojisList, value); + } +} diff --git a/src/ElectronBot.BraincasePreview/Views/EmojisEditPage.xaml b/src/ElectronBot.BraincasePreview/Views/EmojisEditPage.xaml index 3f1dcc9..4c38e37 100644 --- a/src/ElectronBot.BraincasePreview/Views/EmojisEditPage.xaml +++ b/src/ElectronBot.BraincasePreview/Views/EmojisEditPage.xaml @@ -64,7 +64,7 @@ x:Uid="MarketplaceBtn" Margin="8" HorizontalAlignment="Right" - Command="{x:Bind ViewModel.RandomContentEditCommand}" + Command="{x:Bind ViewModel.MarketplaceCommand}" Foreground="{ThemeResource SystemAccentColor}">