2
0

PageLaunchRight.xaml.vb 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. Public Class PageLaunchRight
  2. Private Sub Init() Handles Me.Loaded
  3. PanBack.ScrollToHome()
  4. PanScroll = PanBack '不知道为啥不能在 XAML 设置
  5. PanLog.Visibility = If(ModeDebug, Visibility.Visible, Visibility.Collapsed)
  6. '快照版提示
  7. #If BETA Then
  8. PanHint.Visibility = Visibility.Collapsed
  9. #Else
  10. PanHint.Visibility = If(ThemeCheckGold(), Visibility.Collapsed, Visibility.Visible)
  11. LabHint1.Text = "快照版包含尚未正式发布的测试功能,仅用于赞助者本人尝鲜。请不要发给其他人或者用来制作整合包哦!"
  12. LabHint2.Text = $"若已累积赞助¥23.33,在爱发电私信发送 {vbLQ}解锁码{vbRQ} 即可永久隐藏此提示。"
  13. #End If
  14. End Sub
  15. '暂时关闭快照版提示
  16. #If Not BETA Then
  17. Private Sub BtnHintClose_Click(sender As Object, e As EventArgs) Handles BtnHintClose.Click
  18. AniDispose(PanHint, True)
  19. End Sub
  20. #End If
  21. #Region "自定义主页"
  22. ''' <summary>
  23. ''' 刷新自定义主页。
  24. ''' </summary>
  25. Private Sub Refresh() Handles Me.Loaded
  26. RunInNewThread(Sub()
  27. Try
  28. SyncLock RefreshLock
  29. RefreshReal()
  30. End SyncLock
  31. Catch ex As Exception
  32. Log(ex, "加载 PCL 主页自定义信息失败", LogLevel.Msgbox)
  33. End Try
  34. End Sub, $"刷新自定义主页 #{GetUuid()}")
  35. End Sub
  36. Private Sub RefreshReal()
  37. Dim Content As String = ""
  38. Dim Url As String
  39. Select Case Setup.Get("UiCustomType")
  40. Case 1
  41. '加载本地文件
  42. Log("[Page] 主页自定义数据来源:本地文件")
  43. Content = ReadFile(Path & "PCL\Custom.xaml") 'ReadFile 会进行存在检测
  44. Case 2
  45. Url = Setup.Get("UiCustomNet")
  46. Download:
  47. '加载联网文件
  48. If String.IsNullOrWhiteSpace(Url) Then Exit Select
  49. If Url = Setup.Get("CacheSavedPageUrl") AndAlso File.Exists(PathTemp & "Cache\Custom.xaml") Then
  50. '缓存可用
  51. Log("[Page] 主页自定义数据来源:联网缓存文件")
  52. Content = ReadFile(PathTemp & "Cache\Custom.xaml")
  53. '后台更新缓存
  54. OnlineLoader.Start(Url)
  55. Else
  56. '缓存不可用
  57. Log("[Page] 主页自定义数据来源:联网全新下载")
  58. Hint("正在加载主页……")
  59. RunInUiWait(Sub() LoadContent("")) '在加载结束前清空页面
  60. Setup.Set("CacheSavedPageVersion", "")
  61. OnlineLoader.Start(Url) '下载完成后将会再次触发更新
  62. Exit Sub
  63. End If
  64. Case 3
  65. Select Case Setup.Get("UiCustomPreset")
  66. Case 0 '你知道吗
  67. Log("[Page] 主页预设:你知道吗")
  68. Content = "
  69. <local:MyCard Title=""你知道吗?"" Margin=""0,0,0,15"">
  70. <TextBlock Margin=""25,38,23,15"" FontSize=""13.5"" IsHitTestVisible=""False"" Text=""{hint}"" TextWrapping=""Wrap"" Foreground=""{DynamicResource ColorBrush1}"" />
  71. <local:MyIconButton Height=""22"" Width=""22"" Margin=""9"" VerticalAlignment=""Top"" HorizontalAlignment=""Right""
  72. EventType=""刷新主页"" EventData=""/""
  73. Logo=""M875.52 148.48C783.36 56.32 655.36 0 512 0 291.84 0 107.52 138.24 30.72 332.8l122.88 46.08C204.8 230.4 348.16 128 512 128c107.52 0 199.68 40.96 271.36 112.64L640 384h384V0L875.52 148.48zM512 896c-107.52 0-199.68-40.96-271.36-112.64L384 640H0v384l148.48-148.48C240.64 967.68 368.64 1024 512 1024c220.16 0 404.48-138.24 481.28-332.8L870.4 645.12C819.2 793.6 675.84 896 512 896z"" />
  74. </local:MyCard>"
  75. Case 1 '回声洞
  76. Log("[Page] 主页预设:回声洞")
  77. Content = "
  78. <local:MyCard Title=""回声洞"" Margin=""0,0,0,15"">
  79. <TextBlock Margin=""25,38,23,15"" FontSize=""13.5"" IsHitTestVisible=""False"" Text=""{cave}"" TextWrapping=""Wrap"" Foreground=""{DynamicResource ColorBrush1}"" />
  80. <local:MyIconButton Height=""22"" Width=""22"" Margin=""9"" VerticalAlignment=""Top"" HorizontalAlignment=""Right""
  81. EventType=""刷新主页"" EventData=""/""
  82. Logo=""M875.52 148.48C783.36 56.32 655.36 0 512 0 291.84 0 107.52 138.24 30.72 332.8l122.88 46.08C204.8 230.4 348.16 128 512 128c107.52 0 199.68 40.96 271.36 112.64L640 384h384V0L875.52 148.48zM512 896c-107.52 0-199.68-40.96-271.36-112.64L384 640H0v384l148.48-148.48C240.64 967.68 368.64 1024 512 1024c220.16 0 404.48-138.24 481.28-332.8L870.4 645.12C819.2 793.6 675.84 896 512 896z"" />
  83. </local:MyCard>"
  84. Case 2 '新闻
  85. Log("[Page] 主页预设:Minecraft 新闻")
  86. Url = "http://pcl.mcnews.thestack.top"
  87. GoTo Download
  88. Case 3 '简单主页
  89. Log("[Page] 主页预设:简单主页")
  90. Url = "https://gitee.com/mfn233/PCL-Mainpage/raw/main/Custom.xaml"
  91. GoTo Download
  92. Case 4 '历史上的今天
  93. Log("[Page] 主页预设:历史上的今天")
  94. Url = "https://pclnews.52chye.cn/custom.xaml"
  95. GoTo Download
  96. End Select
  97. End Select
  98. RunInUi(Sub() LoadContent(Content))
  99. End Sub
  100. Private RefreshLock As New Object
  101. '联网获取自定义主页文件
  102. Private OnlineLoader As New LoaderTask(Of String, Integer)("自定义主页获取", AddressOf OnlineLoaderSub) With {.ReloadTimeout = 10 * 60 * 1000}
  103. Private Sub OnlineLoaderSub(Task As LoaderTask(Of String, Integer))
  104. Try
  105. '获取版本校验地址
  106. Dim VersionAddress As String
  107. If Task.Input.Contains(".xaml") Then
  108. VersionAddress = Task.Input.Replace(".xaml", ".xaml.ini")
  109. Else
  110. VersionAddress = Task.Input.Split("?").First
  111. If Not VersionAddress.EndsWith("/") Then VersionAddress += "/"
  112. VersionAddress += "version"
  113. If Task.Input.Contains("?") Then VersionAddress += Task.Input.Split("?").Last
  114. End If
  115. '校验版本
  116. Dim Version As String = ""
  117. Dim NeedDownload As Boolean = True
  118. Try
  119. Version = NetGetCodeByRequestOnce(VersionAddress, Timeout:=10000)
  120. If Version.Length > 100 Then Throw New Exception($"获取的自定义主页版本过长({Version.Length} 字符)")
  121. Dim CurrentVersion As String = Setup.Get("CacheSavedPageVersion")
  122. If Version <> "" AndAlso CurrentVersion <> "" AndAlso Version = CurrentVersion Then
  123. Log($"[Page] 当前缓存的自定义主页已为最新,当前版本:{Version},检查源:{VersionAddress}")
  124. NeedDownload = False
  125. Else
  126. Log($"[Page] 需要下载联网自定义主页,当前版本:{Version},检查源:{VersionAddress}")
  127. End If
  128. Catch exx As Exception
  129. Log(exx, $"联网获取自定义主页版本失败", LogLevel.Developer)
  130. Log($"[Page] 无法检查联网自定义主页版本,将直接下载,检查源:{VersionAddress}")
  131. End Try
  132. '实际下载
  133. If NeedDownload Then
  134. Dim FileContent As String = NetGetCodeByRequestRetry(Task.Input)
  135. Log($"[Page] 已联网下载自定义主页,内容长度:{FileContent.Length},来源:{Task.Input}")
  136. Setup.Set("CacheSavedPageUrl", Task.Input)
  137. Setup.Set("CacheSavedPageVersion", Version)
  138. WriteFile(PathTemp & "Cache\Custom.xaml", FileContent)
  139. End If
  140. '要求刷新
  141. Refresh()
  142. Catch ex As Exception
  143. If Setup.Get("CacheSavedPageVersion") = "" Then
  144. Log(ex, $"联网下载自定义主页失败({Task.Input})", LogLevel.Msgbox)
  145. Else
  146. Log(ex, $"联网下载自定义主页失败({Task.Input})")
  147. End If
  148. Task.Input = ""
  149. End Try
  150. End Sub
  151. ''' <summary>
  152. ''' 立即强制刷新自定义主页。
  153. ''' 必须在 UI 线程调用。
  154. ''' </summary>
  155. Public Sub ForceRefresh()
  156. Log("[Page] 要求强制刷新自定义主页")
  157. ClearCache()
  158. '实际的刷新
  159. If FrmMain.PageCurrent.Page = FormMain.PageType.Launch Then
  160. PanBack.ScrollToHome()
  161. Refresh()
  162. Else
  163. FrmMain.PageChange(FormMain.PageType.Launch)
  164. End If
  165. End Sub
  166. ''' <summary>
  167. ''' 清空自定义主页缓存信息。
  168. ''' </summary>
  169. Private Sub ClearCache()
  170. LoadedContentHash = -1
  171. OnlineLoader.Input = ""
  172. Setup.Set("CacheSavedPageUrl", "")
  173. Setup.Set("CacheSavedPageVersion", "")
  174. Log("[Page] 已清空自定义主页缓存")
  175. End Sub
  176. ''' <summary>
  177. ''' 从文本内容中加载自定义主页。
  178. ''' 必须在 UI 线程调用。
  179. ''' </summary>
  180. Private Sub LoadContent(Content As String)
  181. SyncLock LoadContentLock
  182. '如果加载目标内容一致则不加载
  183. Dim Hash = Content.GetHashCode()
  184. If Hash = LoadedContentHash Then Exit Sub
  185. LoadedContentHash = Hash
  186. '实际加载内容
  187. PanCustom.Children.Clear()
  188. If String.IsNullOrWhiteSpace(Content) Then
  189. Log($"[Page] 实例化:清空自定义主页 UI,来源为空")
  190. Return
  191. End If
  192. Content = "<StackPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:PCL;assembly=Plain Craft Launcher 2"">" & Content & "</StackPanel>"
  193. Content = HelpArgumentReplace(Content)
  194. Log($"[Page] 实例化:加载自定义主页 UI,最终内容长度:{Content.Count}")
  195. Try
  196. PanCustom.Children.Add(GetObjectFromXML(Content))
  197. Catch ex As Exception
  198. Log("[Page] 加载失败的自定义主页内容:" & vbCrLf & Content)
  199. If MyMsgBox($"自定义主页内容编写有误,请根据下列错误信息进行检查:{vbCrLf}{ex.Message}", "加载自定义主页失败", "重试", "取消") = 1 Then
  200. GoTo Refresh '防止 SyncLock 死锁
  201. End If
  202. End Try
  203. End SyncLock
  204. Return
  205. Refresh:
  206. ForceRefresh()
  207. End Sub
  208. Private LoadedContentHash As Integer = -1
  209. Private LoadContentLock As New Object
  210. #End Region
  211. End Class