PageLoginMsSkin.xaml.vb 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 = Settings.Get("CacheMsV2Name")
  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 = Settings.Get("CacheMsV2OAuthRefresh"), .UserName = Settings.Get("CacheMsV2Name"), .AccessToken = Settings.Get("CacheMsV2Access"), .Uuid = Settings.Get("CacheMsV2Uuid"), .ProfileJson = Settings.Get("CacheMsV2ProfileJson")}
  22. Else
  23. Return New McLoginMs With {.OAuthRefreshToken = Settings.Get("CacheMsV2OAuthRefresh"), .UserName = Settings.Get("CacheMsV2Name")}
  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 Return
  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. '退出登录
  40. Private Sub BtnExit_Click() Handles BtnExit.Click
  41. Settings.Set("CacheMsV2OAuthRefresh", "")
  42. Settings.Set("CacheMsV2Access", "")
  43. Settings.Set("CacheMsV2ProfileJson", "")
  44. Settings.Set("CacheMsV2Uuid", "")
  45. Settings.Set("CacheMsV2Name", "")
  46. McLoginMsLoader.Interrupt()
  47. FrmLaunchLeft.RefreshPage(False, True)
  48. End Sub
  49. #End Region
  50. #Region "皮肤/披风"
  51. '展开
  52. Private Sub BtnSkin_Click(sender As Object, e As RoutedEventArgs) Handles BtnSkin.Click
  53. BtnSkin.ContextMenu.IsOpen = True
  54. End Sub
  55. '修改皮肤
  56. Private IsChanging As Boolean = False
  57. Public Sub BtnSkinEdit_Click(sender As Object, e As RoutedEventArgs)
  58. '检查条件,获取新皮肤
  59. If IsChanging Then
  60. Hint("正在更改皮肤中,请稍候!")
  61. Return
  62. End If
  63. If McLoginLoader.State = LoadState.Failed Then
  64. Hint("登录失败,无法更改皮肤!", HintType.Red)
  65. Return
  66. End If
  67. Dim SkinInfo As McSkinInfo = McSkinSelect()
  68. If Not SkinInfo.IsVaild Then Return
  69. Hint("正在更改皮肤……")
  70. IsChanging = True
  71. '开始实际获取
  72. RunInNewThread(Sub() EditSkin(SkinInfo), "Ms Skin Upload")
  73. End Sub
  74. Private Sub EditSkin(SkinInfo As McSkinInfo)
  75. Retry:
  76. Try
  77. Do While McLoginMsLoader.State = LoadState.Loading '等待登录结束
  78. Thread.Sleep(10)
  79. Loop
  80. If McLoginMsLoader.State = LoadState.Failed Then Throw New Exception("登录失败", McLoginMsLoader.Error)
  81. Dim AccessToken As String = Settings.Get("CacheMsV2Access")
  82. Dim Uuid As String = Settings.Get("CacheMsV2Uuid")
  83. Dim Result As String = NetRequestByClientRetry("https://api.minecraftservices.com/minecraft/profile/skins", HttpMethod.Post,
  84. Content:=New Net.Http.MultipartFormDataContent From {
  85. {New Net.Http.StringContent(If(SkinInfo.IsSlim, "slim", "classic")), "variant"},
  86. {New Net.Http.ByteArrayContent(ReadFileBytes(SkinInfo.LocalFile)), "file", GetFileNameFromPath(SkinInfo.LocalFile)}
  87. },
  88. Headers:={{"Authorization", "Bearer " & AccessToken}, {"Accept", "*/*"}, {"User-Agent", "MojangSharp/0.1"}})
  89. If Result.Contains("request requires user authentication") Then
  90. Hint("正在重新登录,将在登录后自动更改皮肤……")
  91. McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True)
  92. GoTo Retry
  93. ElseIf Result.Contains("""error""") Then
  94. Hint("更改皮肤失败:" & GetJson(Result)("error").ToString, HintType.Red)
  95. Return
  96. End If
  97. '获取新皮肤地址
  98. Log("[Skin] 皮肤修改返回值:" & vbCrLf & Result)
  99. Dim ResultJson As JObject = GetJson(Result)
  100. If ResultJson.ContainsKey("errorMessage") Then Throw New Exception(ResultJson("errorMessage").ToString) '#5309
  101. For Each Skin As JObject In ResultJson("skins")
  102. If Skin("state").ToString = "ACTIVE" Then
  103. MySkin.ReloadCache(Skin("url"))
  104. Return
  105. End If
  106. Next
  107. Throw New Exception("未知错误(" & Result & ")")
  108. Catch ex As Exception
  109. If TypeOf ex Is OperationCanceledException OrElse TypeOf ex Is TimeoutException Then
  110. Hint("更改皮肤失败:连接皮肤服务器超时,请稍后再试,或使用 VPN 改善网络环境", HintType.Red)
  111. ElseIf TypeOf ex Is ResponsedWebException AndAlso CType(ex, ResponsedWebException).StatusCode = HttpStatusCode.Unauthorized Then
  112. Log(ex, "更改皮肤时遭遇 401 错误", NotifyLevel.DevelopOnly)
  113. Hint("正在重新登录,将在登录后自动更改皮肤……")
  114. McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True)
  115. GoTo Retry
  116. Else
  117. Log(ex, "更改皮肤失败", NotifyLevel.AllUsers)
  118. End If
  119. Finally
  120. IsChanging = False
  121. End Try
  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