PageLoginMsSkin.xaml.vb 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. Public Class PageLoginMsSkin
  2. Public Sub New()
  3. InitializeComponent()
  4. Skin.Loader = PageLaunchLeft.SkinMs
  5. End Sub
  6. Private Sub PageLoginLegacy_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  7. Skin.Loader.Start()
  8. End Sub
  9. ''' <summary>
  10. ''' 刷新页面显示的所有信息。
  11. ''' </summary>
  12. Public Sub Reload(KeepInput As Boolean)
  13. TextName.Text = Setup.Get("CacheMsName")
  14. '皮肤在 Loaded 加载
  15. End Sub
  16. ''' <summary>
  17. ''' 获取当前页面的登录信息。
  18. ''' </summary>
  19. Public Shared Function GetLoginData() As McLoginMs
  20. If McLoginMsLoader.State = LoadState.Finished Then
  21. Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsOAuthRefresh"), .UserName = Setup.Get("CacheMsName"), .AccessToken = Setup.Get("CacheMsAccess"), .Uuid = Setup.Get("CacheMsUuid"), .ProfileJson = Setup.Get("CacheMsProfileJson")}
  22. Else
  23. Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsOAuthRefresh"), .UserName = Setup.Get("CacheMsName")}
  24. End If
  25. End Function
  26. #Region "下边栏其他内容"
  27. '显示/隐藏控制
  28. Private Sub ShowPanel(sender As Object, e As MouseEventArgs) Handles PanData.MouseEnter
  29. AniStart(AaOpacity(PanButtons, 1 - PanButtons.Opacity, 120), "PageLoginMsSkin Button")
  30. End Sub
  31. Public Sub HidePanel() Handles PanData.MouseLeave
  32. If BtnEdit.ContextMenu.IsOpen OrElse BtnSkin.ContextMenu.IsOpen OrElse PanData.IsMouseOver Then Exit Sub
  33. AniStart(AaOpacity(PanButtons, -PanButtons.Opacity, 120), "PageLoginMsSkin Button")
  34. End Sub
  35. '修改账号信息
  36. Private Sub BtnEdit_Click(sender As Object, e As EventArgs) Handles BtnEdit.Click
  37. BtnEdit.ContextMenu.IsOpen = True
  38. End Sub
  39. Public Sub BtnEditPassword_Click(sender As Object, e As RoutedEventArgs)
  40. OpenWebsite("https://account.live.com/password/Change")
  41. End Sub
  42. Public Sub BtnEditName_Click(sender As Object, e As RoutedEventArgs)
  43. OpenWebsite("https://www.minecraft.net/zh-hans/msaprofile/mygames/editprofile")
  44. End Sub
  45. '退出登录
  46. Private Sub BtnExit_Click() Handles BtnExit.Click
  47. Setup.Set("CacheMsOAuthRefresh", "")
  48. Setup.Set("CacheMsAccess", "")
  49. Setup.Set("CacheMsProfileJson", "")
  50. Setup.Set("CacheMsUuid", "")
  51. Setup.Set("CacheMsName", "")
  52. McLoginMsLoader.Abort()
  53. FrmLaunchLeft.RefreshPage(False, True)
  54. End Sub
  55. #End Region
  56. #Region "皮肤/披风"
  57. '展开
  58. Private Sub BtnSkin_Click(sender As Object, e As RoutedEventArgs) Handles BtnSkin.Click
  59. BtnSkin.ContextMenu.IsOpen = True
  60. End Sub
  61. '修改皮肤
  62. Private IsChanging As Boolean = False
  63. Public Sub BtnSkinEdit_Click(sender As Object, e As RoutedEventArgs)
  64. '检查条件,获取新皮肤
  65. If IsChanging Then
  66. Hint("正在更改皮肤中,请稍候!")
  67. Exit Sub
  68. End If
  69. If McLoginLoader.State = LoadState.Failed Then
  70. Hint("登录失败,无法更改皮肤!", HintType.Critical)
  71. Exit Sub
  72. End If
  73. Dim SkinInfo As McSkinInfo = McSkinSelect()
  74. If Not SkinInfo.IsVaild Then Exit Sub
  75. Hint("正在更改皮肤……")
  76. IsChanging = True
  77. '开始实际获取
  78. RunInNewThread(
  79. Async Sub()
  80. Try
  81. Retry:
  82. If McLoginMsLoader.State = LoadState.Loading Then McLoginMsLoader.WaitForExit() '等待登录结束
  83. Dim AccessToken As String = Setup.Get("CacheMsAccess")
  84. Dim Uuid As String = Setup.Get("CacheMsUuid")
  85. Dim Client As New Net.Http.HttpClient With {.Timeout = New TimeSpan(0, 0, 30)}
  86. Client.DefaultRequestHeaders.Authorization = New Net.Http.Headers.AuthenticationHeaderValue("Bearer", AccessToken)
  87. Client.DefaultRequestHeaders.Accept.Add(New Net.Http.Headers.MediaTypeWithQualityHeaderValue("*/*"))
  88. Client.DefaultRequestHeaders.UserAgent.Add(New Net.Http.Headers.ProductInfoHeaderValue("MojangSharp", "0.1"))
  89. Dim Contents As New Net.Http.MultipartFormDataContent From {
  90. {New Net.Http.StringContent(If(SkinInfo.IsSlim, "slim", "classic")), "variant"},
  91. {New Net.Http.ByteArrayContent(File.ReadAllBytes(SkinInfo.LocalFile)), "file", GetFileNameFromPath(SkinInfo.LocalFile)}
  92. }
  93. Dim Result As String = Await (Await Client.PostAsync(New Uri("https://api.minecraftservices.com/minecraft/profile/skins"), Contents)).Content.ReadAsStringAsync
  94. If Result.Contains("request requires user authentication") Then
  95. Hint("正在登录,将在登录完成后继续更改皮肤……")
  96. McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True)
  97. GoTo Retry
  98. ElseIf Result.Contains("""error""") Then
  99. Hint("更改皮肤失败:" & GetJson(Result)("error"), HintType.Critical)
  100. Exit Sub
  101. End If
  102. '获取新皮肤地址
  103. Log("[Skin] 皮肤修改返回值:" & vbCrLf & Result)
  104. Dim ResultJson As JObject = GetJson(Result)
  105. For Each Skin As JObject In ResultJson("skins")
  106. If Skin("state").ToString = "ACTIVE" Then
  107. MySkin.ReloadCache(Skin("url"))
  108. Exit Sub
  109. End If
  110. Next
  111. Throw New Exception("未知错误(" & Result & ")")
  112. Catch ex As Exception
  113. If ex.GetType.Equals(GetType(Tasks.TaskCanceledException)) Then
  114. Hint("更改皮肤失败:与 Mojang 皮肤服务器的连接超时,请检查你的网络是否通畅!", HintType.Critical)
  115. Else
  116. Log(ex, "更改皮肤失败", LogLevel.Hint)
  117. End If
  118. Finally
  119. IsChanging = False
  120. End Try
  121. End Sub, "Ms Skin Upload")
  122. End Sub
  123. '保存皮肤
  124. Public Sub BtnSkinSave_Click(sender As Object, e As RoutedEventArgs)
  125. Skin.BtnSkinSave_Click()
  126. End Sub
  127. '刷新头像
  128. Public Sub BtnSkinRefresh_Click(sender As Object, e As RoutedEventArgs)
  129. Skin.RefreshClick()
  130. End Sub
  131. '修改披风
  132. Public Sub BtnSkinCape_Click(sender As Object, e As RoutedEventArgs)
  133. Skin.BtnSkinCape_Click()
  134. End Sub
  135. #End Region
  136. End Class