アバター一覧の追加、アバターダウンロードの追加

This commit is contained in:
mii
2020-11-06 00:41:21 +09:00
parent e059652cd3
commit 80eb129fc0
10 changed files with 339 additions and 158 deletions

View File

@ -8,13 +8,19 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Debug|Any CPU.Build.0 = Debug|Any CPU
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Debug|x64.ActiveCfg = Debug|x64
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Debug|x64.Build.0 = Debug|x64
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Release|Any CPU.ActiveCfg = Release|Any CPU
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Release|Any CPU.Build.0 = Release|Any CPU
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Release|x64.ActiveCfg = Release|x64
{12F51A26-2AE2-4798-9087-516F7BC3B788}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -8,12 +8,13 @@ namespace VRCExternalTools
{
class Friend
{
public String id { get; set; }
public string id { get; set; }
public Friend(String userId)
public Friend(string userId)
{
id = userId;
}
}
}

View File

@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:VRCExternalTools"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
Title="VRCExternalTool" Height="450" Width="800">
<Grid>
<TabControl>
<TabItem Header="Settings">
@ -23,12 +23,13 @@
</TabItem>
<TabItem Header="Avatars" Height="22" VerticalAlignment="Bottom">
<Grid Background="#FFE5E5E5">
<ListView x:Name="avatars" Margin="10">
<Button x:Name="reloadAvatarsButton" Content="Reload" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="reloadAvatarsButton_Click"/>
<ListView x:Name="avatarsListView" Margin="10,35,10,10" PreviewMouseDoubleClick="AvatarsListView_OnPreviewMouseDoubleClick">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding name}" FontSize="15"/>
<TextBlock Text="{Binding description}"/>
<TextBlock Text="{Binding id}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>

View File

@ -30,7 +30,7 @@ namespace VRCExternalTools
{
InitializeComponent();
friends.ItemsSource = friendsCollection;
avatars.ItemsSource = avatarsCollection;
avatarsListView.ItemsSource = avatarsCollection;
BindingOperations.EnableCollectionSynchronization(this.friendsCollection, new object());
BindingOperations.EnableCollectionSynchronization(this.avatarsCollection, new object());
}
@ -51,22 +51,20 @@ namespace VRCExternalTools
loginButton.IsEnabled = false;
var userConfig = api.getUserConfig();
Name.Content = userConfig.username;
var avatars = api.searchAvatars(user: "me", releaseStatus: "all");
foreach (var avatar in avatars)
{
avatarsCollection.Add(avatar);
}
}
else
{
MessageBox.Show("2FA Failed.");
return;
}
}
else if (api == null)
{
MessageBox.Show("Invalid Username or Password");
return;
}
MessageBox.Show("Logined.");
}
private void reloadFriends_Click(object sender, RoutedEventArgs e)
@ -81,5 +79,21 @@ namespace VRCExternalTools
}
}
}
private void reloadAvatarsButton_Click(object sender, RoutedEventArgs e)
{
var avatars = api.searchAvatars(user: "me", releaseStatus: "all");
foreach (var avatar in avatars)
{
avatarsCollection.Add(avatar);
}
}
private void AvatarsListView_OnPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var avatar = (VRCAPIBase.AvatarObject) avatarsListView.SelectedItems[0];
var window = new avatarWindow(api, avatar);
window.Show();
}
}
}

View File

@ -11,12 +11,12 @@ using JsonSerializer = System.Text.Json.JsonSerializer;
namespace VRCExternalTools.VRCAPI
{
class VRCAPI
public class VRCAPI
{
public String apiKey;
public String authToken;
public string apiKey;
public string authToken;
private HttpClientHandler handler = new HttpClientHandler();
public VRCAPI(String key, String token)
public VRCAPI(string key, string token)
{
apiKey = key;
authToken = token;
@ -35,7 +35,20 @@ namespace VRCExternalTools.VRCAPI
}
}
public List<VRCAPIBase.AvatarObject> searchAvatars(String user = null, bool featured = false, String userId = null, int n = -1, int offset = -1, string order = null, string releaseStatus = null, string sort = null, string maxUnityVersion = null, string minUnityVersion = null, string maxAssetVersion = null, string minAssetVersion = null, string platform = null)
public VRCAPIBase.AvatarObject getAvatarById(string id)
{
StringBuilder urlParams = new StringBuilder("?");
urlParams.Append("apiKey=" + apiKey);
Uri uri = new Uri(VRCAPIBase.api_base + "/avatars/" + id + urlParams);
using (var client = new HttpClient(handler, false))
{
var request = new HttpRequestMessage(HttpMethod.Get, uri);
var result = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<VRCAPIBase.AvatarObject>(result);
}
}
public List<VRCAPIBase.AvatarObject> searchAvatars(string user = null, bool featured = false, string userId = null, int n = -1, int offset = -1, string order = null, string releaseStatus = null, string sort = null, string maxUnityVersion = null, string minUnityVersion = null, string maxAssetVersion = null, string minAssetVersion = null, string platform = null)
{
string urlParams = "?";
if (user != null) { urlParams += "user=" + user + "&"; }
@ -71,7 +84,6 @@ namespace VRCExternalTools.VRCAPI
//request.Content = new StringContent(JsonSerializer.Serialize(new VRCAPIBase.FriendsRequest() { apiKey = apiKey, n = n, offline = offline, offset = offset }), Encoding.UTF8, "application/json");
var request = new HttpRequestMessage(HttpMethod.Get, uri);
var result = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
MessageBox.Show(result);
return JsonConvert.DeserializeObject<List<VRCAPIBase.LimitedUserObject>>(result);
}
}

View File

@ -7,109 +7,126 @@ using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Security.RightsManagement;
using Newtonsoft.Json;
namespace VRCExternalTools.VRCAPI
{
class VRCAPIBase
public class VRCAPIBase
{
public static readonly String api_base = "https://api.vrchat.cloud/api/1";
public static readonly string api_base = "https://api.vrchat.cloud/api/1";
public class AvatarObject
{
public String id { get; set; }
public String name { get; set; }
public String description { get; set; }
public String authorId { get; set; }
public String authorName { get; set; }
public string id { get; set; }
public string name { get; set; }
public string description { get; set; }
public string authorId { get; set; }
public string authorName { get; set; }
public string[] tags { get; set; }
public int version { get; set; }
public bool featured { get; set; }
public string created_at { get; set; }
public string updated_at { get; set; }
public string releaseStatus { get; set; }
public string assetUrl { get; set; }
public string assetVersion { get; set; }
public string platform { get; set; }
public string imageUrl { get; set; }
public string thumbnailImageUrl { get; set; }
public string unityVersion { get; set; }
public string unityPackageUrl { get; set; }
}
public class PastDisplayNameObject
{
public String displayName { get; set; }
public String updated_at { get; set; }
public string displayName { get; set; }
public string updated_at { get; set; }
}
public class CurrentUserObject
{
public String username { get; set; }
public String displayName { get; set; }
public string username { get; set; }
public string displayName { get; set; }
[JsonProperty(Required = Required.AllowNull)]
public PastDisplayNameObject[] pastDisplayNames { get; set; }
public String id { get; set; }
public String bio { get; set; }
public String[] bioLinks { get; set; }
public String email { get; set; }
public string id { get; set; }
public string bio { get; set; }
public string[] bioLinks { get; set; }
public string email { get; set; }
public bool emailVerified { get; set; }
public bool hasEmail { get; set; }
public bool hasPendingEmail { get; set; }
public String obfuscatedEmail { get; set; }
public String obfuscatedPendingEmail { get; set; }
public String steamId { get; set; }
public String[] steamDetails { get; set; }
public String oculusId { get; set; }
public string obfuscatedEmail { get; set; }
public string obfuscatedPendingEmail { get; set; }
public string steamId { get; set; }
public string[] steamDetails { get; set; }
public string oculusId { get; set; }
public int acceptedTOSVersion { get; set; }
public bool hasBirthday { get; set; }
public String[] friends { get; set; }
public String[] onlineFriends { get; set; }
public String[] activeFriends { get; set; }
public String[] offlineFriends { get; set; }
public String[] friendGroupNames { get; set; }
public String state { get; set; }
public String status { get; set; }
public string[] friends { get; set; }
public string[] onlineFriends { get; set; }
public string[] activeFriends { get; set; }
public string[] offlineFriends { get; set; }
public string[] friendGroupNames { get; set; }
public string state { get; set; }
public string status { get; set; }
}
public class WorldUnityPackageObject
{
public String id { get; set; }
public String platform { get; set; }
public String assetUrl { get; set; }
public String unityVersion { get; set; }
public string id { get; set; }
public string platform { get; set; }
public string assetUrl { get; set; }
public string unityVersion { get; set; }
public int unitySortNumber { get; set; }
public int assetVersion { get; set; }
public String created_at { get; set; }
public String assetUrlObject { get; set; }
public String pluginUrl { get; set; }
public String pluginUrlObject { get; set; }
public string created_at { get; set; }
public string assetUrlObject { get; set; }
public string pluginUrl { get; set; }
public string pluginUrlObject { get; set; }
}
public class LimitedWorldObject
{
public String name { get; set; }
public String id { get; set; }
public String authorName { get; set; }
public string name { get; set; }
public string id { get; set; }
public string authorName { get; set; }
public int authorId { get; set; }
public String[] tags { get; set; }
public String created_at { get; set; }
public String updated_at { get; set; }
public String releaseStatus { get; set; }
public string[] tags { get; set; }
public string created_at { get; set; }
public string updated_at { get; set; }
public string releaseStatus { get; set; }
public int visits { get; set; }
public int occupants { get; set; }
public int capacity { get; set; }
public int favorites { get; set; }
public int popularity { get; set; }
public String imageUrl { get; set; }
public String thumbnailImageUrl { get; set; }
public String organization { get; set; }
public string imageUrl { get; set; }
public string thumbnailImageUrl { get; set; }
public string organization { get; set; }
public int heat { get; set; }
public String publicationDate { get; set; }
public String labsPublicationDate { get; set; }
public string publicationDate { get; set; }
public string labsPublicationDate { get; set; }
public WorldUnityPackageObject[] unityPackages { get; set; }
}
public class LimitedUserObject
{
public String username { get; set; }
public String displayName { get; set; }
public String id { get; set; }
public String bio { get; set; }
public String statys { get; set; }
public String currentAvatarImageUrl { get; set; }
public String currentAvatarThumbnailImageUrl { get; set; }
public String last_platform { get; set; }
public String[] tags { get; set; }
public String developerType { get; set; }
public string username { get; set; }
public string displayName { get; set; }
public string id { get; set; }
public string bio { get; set; }
public string statys { get; set; }
public string currentAvatarImageUrl { get; set; }
public string currentAvatarThumbnailImageUrl { get; set; }
public string last_platform { get; set; }
public string[] tags { get; set; }
public string developerType { get; set; }
public bool isFriend { get; set; }
//[JsonProperty(Required = Required.AllowNull)]
// public LimitedWorldObject location { get; set; }
}
@ -118,13 +135,13 @@ namespace VRCExternalTools.VRCAPI
public int offset { get; set; }
public int n { get; set; }
public bool offline { get; set; }
public String apiKey { get; set; }
public string apiKey { get; set; }
}
public class TwoFactorRequest
{
public String apiKey { get; set; }
public String code { get; set; }
public string apiKey { get; set; }
public string code { get; set; }
}
public class TwoFactorAuthReturn
@ -134,110 +151,110 @@ namespace VRCExternalTools.VRCAPI
public class DisplayNameObject
{
public String displayName { get; set; }
public String updated_at { get; set; }
public string displayName { get; set; }
public string updated_at { get; set; }
}
public class UserDataReturn
{
public String id { get; set; }
public String username { get; set; }
public String displayName { get; set; }
public String userIcon { get; set; }
public String bio { get; set; }
public String[] bioLinks { get; set; }
public string id { get; set; }
public string username { get; set; }
public string displayName { get; set; }
public string userIcon { get; set; }
public string bio { get; set; }
public string[] bioLinks { get; set; }
public DisplayNameObject[] pastDisplayNames { get; set; }
public bool hasEmail { get; set; }
public bool hasPendingEmail { get; set; }
public String email { get; set; }
public String obfuscatedEmail { get; set; }
public String obfuscatedPendingEmail { get; set; }
public string email { get; set; }
public string obfuscatedEmail { get; set; }
public string obfuscatedPendingEmail { get; set; }
public bool emailVerified { get; set; }
public bool hasBirthday { get; set; }
public bool unsubscribe { get; set; }
public String[] friends { get; set; }
public String[] friendGroupNames { get; set; }
public String currentAvatarImageUrl { get; set; }
public String currentAvatarThumbnailImageUrl { get; set; }
public String fallbackAvatar { get; set; }
public String currentAvatar { get; set; }
public String currentAvatarAssetUrl { get; set; }
public String accountDeletionDate { get; set; }
public string[] friends { get; set; }
public string[] friendGroupNames { get; set; }
public string currentAvatarImageUrl { get; set; }
public string currentAvatarThumbnailImageUrl { get; set; }
public string fallbackAvatar { get; set; }
public string currentAvatar { get; set; }
public string currentAvatarAssetUrl { get; set; }
public string accountDeletionDate { get; set; }
public int acceptedTOSVersion { get; set; }
public String steamId { get; set; }
public String oculusId { get; set; }
public string steamId { get; set; }
public string oculusId { get; set; }
public bool hasLoggedInFromClient { get; set; }
public String homeLocation { get; set; }
public string homeLocation { get; set; }
public bool twoFactorAuthEnabled { get; set; }
public String status { get; set; }
public String statusDescription { get; set; }
public String state { get; set; }
public String[] tags { get; set; }
public String developerType { get; set; }
public String last_login { get; set; }
public String last_platform { get; set; }
public string status { get; set; }
public string statusDescription { get; set; }
public string state { get; set; }
public string[] tags { get; set; }
public string developerType { get; set; }
public string last_login { get; set; }
public string last_platform { get; set; }
public bool allowAvatarCopying { get; set; }
public bool isFriend { get; set; }
public String friendKey { get; set; }
public String[] onlineFriends { get; set; }
public String[] activeFriends { get; set; }
public String[] offlineFriends { get; set; }
public string friendKey { get; set; }
public string[] onlineFriends { get; set; }
public string[] activeFriends { get; set; }
public string[] offlineFriends { get; set; }
}
public class ConfigDataReturn
{
public String messageOfTheDay { get; set; }
public String timeOutWorldId { get; set; }
public String gearDemoRoomId { get; set; }
public String releaseServerVersionStandalone { get; set; }
public String downloadLinkWindows { get; set; }
public String releaseAppVersionStandalone { get; set; }
public String devAppVersionStandalone { get; set; }
public String devServerVersionStandalone { get; set; }
public String devDownloadLinkWindows { get; set; }
public string messageOfTheDay { get; set; }
public string timeOutWorldId { get; set; }
public string gearDemoRoomId { get; set; }
public string releaseServerVersionStandalone { get; set; }
public string downloadLinkWindows { get; set; }
public string releaseAppVersionStandalone { get; set; }
public string devAppVersionStandalone { get; set; }
public string devServerVersionStandalone { get; set; }
public string devDownloadLinkWindows { get; set; }
public int currentTOSVersiona { get; set; }
public String releaseSdkUrl { get; set; }
public String releaseSdkVersion { get; set; }
public String devSdkUrl { get; set; }
public String devSdkVersion { get; set; }
public String[] whiteListedAssetUrls { get; set; }
public String clientApiKey { get; set; }
public String viveWindowsUrl { get; set; }
public String sdkUnityVersion { get; set; }
public String hubWorldId { get; set; }
public String homeWorldId { get; set; }
public String tutorialWorldId { get; set; }
public string releaseSdkUrl { get; set; }
public string releaseSdkVersion { get; set; }
public string devSdkUrl { get; set; }
public string devSdkVersion { get; set; }
public string[] whiteListedAssetUrls { get; set; }
public string clientApiKey { get; set; }
public string viveWindowsUrl { get; set; }
public string sdkUnityVersion { get; set; }
public string hubWorldId { get; set; }
public string homeWorldId { get; set; }
public string tutorialWorldId { get; set; }
public bool disableEventStream { get; set; }
public bool disableAvatarGating { get; set; }
public bool disableFeedbackGating { get; set; }
public bool disableRegistration { get; set; }
public String plugin { get; set; }
public String sdkNotAllowedToPublishMessage { get; set; }
public String sdkDeveloperFaqUrl { get; set; }
public String sdkDiscordUrl { get; set; }
public String notAllowedToSelectAvatarInPrivateWorldMessage { get; set; }
public string plugin { get; set; }
public string sdkNotAllowedToPublishMessage { get; set; }
public string sdkDeveloperFaqUrl { get; set; }
public string sdkDiscordUrl { get; set; }
public string notAllowedToSelectAvatarInPrivateWorldMessage { get; set; }
public int userVerificationTimeout { get; set; }
public int userUpdatePeriod { get; set; }
public int userVerificationDelay { get; set; }
public int userVerificationRetry { get; set; }
public int worldUpdatePeriod { get; set; }
public int moderationQueryPeriod { get; set; }
public String defaultAvatar { get; set; }
public string defaultAvatar { get; set; }
// public String dynamicWorldRows { get; set; } // Array of DynamicWorldRows WIP
public String address { get; set; }
public String contactEmail { get; set; }
public String supportEmail { get; set; }
public String jobsEmail { get; set; }
public String copyrightEmail { get; set; }
public String moderationEmail { get; set; }
public string address { get; set; }
public string contactEmail { get; set; }
public string supportEmail { get; set; }
public string jobsEmail { get; set; }
public string copyrightEmail { get; set; }
public string moderationEmail { get; set; }
public bool disableEmail { get; set; }
public String appName { get; set; }
public String serverName { get; set; }
public String deploymentGroup { get; set; }
public String buildVersionTag { get; set; }
public String apiKey { get; set; }
public string appName { get; set; }
public string serverName { get; set; }
public string deploymentGroup { get; set; }
public string buildVersionTag { get; set; }
public string apiKey { get; set; }
}
}
}

View File

@ -14,19 +14,19 @@ namespace VRCExternalTools.VRCAPI
{
class VRCAuthenticator
{
private String userName;
private String password;
private String apiKey;
private String authToken;
private string userName;
private string password;
private string apiKey;
private string authToken;
private bool twoFactor = false;
public VRCAuthenticator(String name, String pass)
public VRCAuthenticator(string name, string pass)
{
userName = name;
password = pass;
}
public async Task<String> getApiKey()
public async Task<string> getApiKey()
{
Uri uri = new Uri(VRCAPIBase.api_base + "/config");
using (var client = new HttpClient())
@ -37,7 +37,7 @@ namespace VRCExternalTools.VRCAPI
}
}
public string getAuthToken(String name, String pass)
public string getAuthToken(string name, string pass)
{
var cookieContainer = new CookieContainer();
@ -69,14 +69,14 @@ namespace VRCExternalTools.VRCAPI
}
}
return String.Empty;
return string.Empty;
}
public async Task<VRCAPI> loginAsync()
{
apiKey = await getApiKey();
authToken = getAuthToken(userName, password);
if (authToken == String.Empty)
if (authToken == string.Empty)
{
return null;
}

View File

@ -34,6 +34,28 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
@ -86,10 +108,17 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="avatarWindow.xaml.cs">
<DependentUpon>avatarWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Friend.cs" />
<Compile Include="VRCAPI\VRCAPIBase.cs" />
<Compile Include="VRCAPI\VRCAuthenticator.cs" />
<Compile Include="VRCAPI\VRCAPI.cs" />
<Page Include="avatarWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>

View File

@ -0,0 +1,36 @@
<Window x:Class="VRCExternalTools.avatarWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:VRCExternalTools"
mc:Ignorable="d"
Title="AVATAR" Height="370" Width="400">
<Grid>
<TabControl>
<TabItem Header="全般">
<Grid Background="#FFE5E5E5">
<Label Content="id:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
<Label Content="name:" HorizontalAlignment="Left" Margin="10,36,0,0" VerticalAlignment="Top"/>
<Label Content="description:" HorizontalAlignment="Left" Margin="10,62,0,0" VerticalAlignment="Top"/>
<Label Content="version:" HorizontalAlignment="Left" Margin="10,88,0,0" VerticalAlignment="Top"/>
<Label Content="featured:" HorizontalAlignment="Left" Margin="10,114,0,0" VerticalAlignment="Top"/>
<Label Content="created__at:" HorizontalAlignment="Left" Margin="10,140,0,0" VerticalAlignment="Top"/>
<Label Content="updated__at:" HorizontalAlignment="Left" Margin="10,166,0,0" VerticalAlignment="Top"/>
<Label Content="releaseStatus:" HorizontalAlignment="Left" Margin="10,192,0,0" VerticalAlignment="Top"/>
<Label Content="platform:" HorizontalAlignment="Left" Margin="9,218,0,0" VerticalAlignment="Top"/>
<Label x:Name="idLabel" Content="Label" HorizontalAlignment="Left" Margin="97,10,0,0" VerticalAlignment="Top"/>
<Label x:Name="nameLabel" Content="Label" HorizontalAlignment="Left" Margin="97,36,0,0" VerticalAlignment="Top"/>
<Label x:Name="descriptionLabel" Content="Label" HorizontalAlignment="Left" Margin="97,62,0,0" VerticalAlignment="Top"/>
<Label x:Name="versionLabel" Content="Label" HorizontalAlignment="Left" Margin="97,88,0,0" VerticalAlignment="Top"/>
<Label x:Name="featuredLabel" Content="Label" HorizontalAlignment="Left" Margin="97,114,0,0" VerticalAlignment="Top"/>
<Label x:Name="created_atLabel" Content="Label" HorizontalAlignment="Left" Margin="97,140,0,0" VerticalAlignment="Top"/>
<Label x:Name="updated_atLabel" Content="Label" HorizontalAlignment="Left" Margin="97,166,0,0" VerticalAlignment="Top"/>
<Label x:Name="releaseStatusLabel" Content="Label" HorizontalAlignment="Left" Margin="97,192,0,0" VerticalAlignment="Top"/>
<Label x:Name="platformLabel" Content="Label" HorizontalAlignment="Left" Margin="97,218,0,0" VerticalAlignment="Top"/>
<Button x:Name="downloadPackageButton" Content="download package" HorizontalAlignment="Left" Margin="10,249,0,0" VerticalAlignment="Top" Width="125" Click="downloadPackageButton_Click"/>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>

View File

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Win32;
using VRCExternalTools.VRCAPI;
namespace VRCExternalTools
{
/// <summary>
/// avatarWindow.xaml の相互作用ロジック
/// </summary>
public partial class avatarWindow : Window
{
private VRCAPI.VRCAPI api;
private VRCAPIBase.AvatarObject avatar;
public avatarWindow(VRCAPI.VRCAPI vrcApi, VRCAPIBase.AvatarObject currentAvatar)
{
api = vrcApi;
avatar = currentAvatar;
InitializeComponent();
this.Title = avatar.name;
idLabel.Content = avatar.id;
nameLabel.Content = avatar.name;
descriptionLabel.Content = avatar.description;
versionLabel.Content = avatar.version.ToString();
featuredLabel.Content = avatar.featured.ToString();
created_atLabel.Content = avatar.created_at;
updated_atLabel.Content = avatar.updated_at;
releaseStatusLabel.Content = avatar.releaseStatus;
platformLabel.Content = avatar.platform;
}
private void downloadPackageButton_Click(object sender, RoutedEventArgs e)
{
var perfectAvatar = api.getAvatarById(avatar.id);
var dialog = new SaveFileDialog();
dialog.Filter = "Unity package file(*.unitypackage)|*.unitypackage";
dialog.FileName = perfectAvatar.name + ".unitypackage";
var result = dialog.ShowDialog() ?? false;
if (!result)
{
return;
}
var client = new WebClient();
client.DownloadFile(perfectAvatar.unityPackageUrl, dialog.FileName);
}
}
}