ModEvent.vb 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. Public Module ModEvent
  2. Public Sub TryStartEvent(Type As String, Data As String)
  3. If String.IsNullOrWhiteSpace(Type) Then Exit Sub
  4. Dim RealData As String() = {""}
  5. If Data IsNot Nothing Then RealData = Data.Split("|")
  6. StartEvent(Type, RealData)
  7. End Sub
  8. Public Sub StartEvent(Type As String, Data As String())
  9. Try
  10. Log("[Control] 执行自定义事件:" & Type & ", " & Join(Data, ", "))
  11. Select Case Type
  12. Case "打开网页"
  13. Data(0) = Data(0).Replace("\", "/")
  14. If Not Data(0).Contains("://") OrElse Data(0).StartsWithF("file", True) Then '为了支持更多协议(#2200)
  15. MyMsgBox("EventData 必须为一个网址。" & vbCrLf & "如果想要启动程序,请将 EventType 改为 打开文件。", "事件执行失败")
  16. Exit Sub
  17. End If
  18. Hint("正在开启中,请稍候……")
  19. OpenWebsite(Data(0))
  20. Case "打开文件", "打开帮助"
  21. RunInThread(
  22. Sub()
  23. Try
  24. '确认实际路径
  25. Dim ActualPaths = GetEventAbsoluteUrls(Data(0), Type)
  26. Dim Location = ActualPaths(0), WorkingDir = ActualPaths(1)
  27. Log($"[Control] 打开类自定义事件实际路径:{Location},工作目录:{WorkingDir}")
  28. '执行
  29. If Type = "打开文件" Then
  30. Dim Info As New ProcessStartInfo With {
  31. .Arguments = If(Data.Length >= 2, Data(1), ""),
  32. .FileName = Location,
  33. .WorkingDirectory = WorkingDir
  34. }
  35. Process.Start(Info)
  36. Else '打开帮助
  37. PageOtherHelp.EnterHelpPage(Location)
  38. End If
  39. Catch ex As Exception
  40. Log(ex, "执行打开类自定义事件失败", LogLevel.Msgbox)
  41. End Try
  42. End Sub)
  43. Case "启动游戏"
  44. If Data(0) = "\current" Then
  45. If McVersionCurrent Is Nothing Then
  46. Hint("请先选择一个 Minecraft 版本!", HintType.Critical)
  47. Exit Sub
  48. Else
  49. Data(0) = McVersionCurrent.Name
  50. End If
  51. End If
  52. If McLaunchStart(New McLaunchOptions With
  53. {.ServerIp = If(Data.Length >= 2, Data(1), Nothing), .Version = New McVersion(Data(0))}) Then
  54. Hint("正在启动 " & Data(0) & "……")
  55. End If
  56. Case "复制文本"
  57. ClipboardSet(Join(Data, "|"))
  58. Case "刷新主页"
  59. FrmLaunchRight.ForceRefresh()
  60. If Data(0) = "" Then Hint("已刷新主页!", HintType.Finish)
  61. Case "刷新帮助"
  62. PageOtherLeft.RefreshHelp()
  63. Case "今日人品"
  64. PageOtherTest.Jrrp()
  65. Case "内存优化"
  66. RunInThread(Sub() PageOtherTest.MemoryOptimize(True))
  67. Case "清理垃圾"
  68. RunInThread(Sub() PageOtherTest.RubbishClear())
  69. Case "弹出窗口"
  70. MyMsgBox(Data(1).Replace("\n", vbCrLf), Data(0).Replace("\n", vbCrLf))
  71. Case "切换页面"
  72. FrmMain.PageChange(Val(Data(0)), Val(Data(1)))
  73. Case "导入整合包", "安装整合包"
  74. RunInUi(Sub() ModpackInstall())
  75. Case "下载文件"
  76. Data(0) = Data(0).Replace("\", "/")
  77. If Not (Data(0).StartsWithF("http://", True) OrElse Data(0).StartsWithF("https://", True)) Then
  78. MyMsgBox("EventData 必须为以 http:// 或 https:// 开头的网址。" & vbCrLf & "PCL 不支持其他乱七八糟的下载协议。", "事件执行失败")
  79. Exit Sub
  80. End If
  81. Try
  82. Select Case Data.Length
  83. Case 1
  84. PageOtherTest.StartCustomDownload(Data(0), GetFileNameFromPath(Data(0)))
  85. Case 2
  86. PageOtherTest.StartCustomDownload(Data(0), Data(1))
  87. Case Else
  88. PageOtherTest.StartCustomDownload(Data(0), Data(1), Data(2))
  89. End Select
  90. Catch
  91. PageOtherTest.StartCustomDownload(Data(0), "未知")
  92. End Try
  93. Case Else
  94. MyMsgBox("未知的事件类型:" & Type & vbCrLf & "请检查事件类型填写是否正确,或者 PCL 是否为最新版本。", "事件执行失败")
  95. End Select
  96. Catch ex As Exception
  97. Log(ex, "事件执行失败", LogLevel.Msgbox)
  98. End Try
  99. End Sub
  100. ''' <summary>
  101. ''' 返回自定义事件的绝对 Url。实际返回 {绝对 Url, WorkingDir}。
  102. ''' 失败会抛出异常。
  103. ''' </summary>
  104. Public Function GetEventAbsoluteUrls(RelativeUrl As String, EventType As String) As String()
  105. '网页确认
  106. If RelativeUrl.StartsWithF("http", True) Then
  107. If RunInUi() Then
  108. Throw New Exception("能打开联网帮助页面的 MyListItem 必须手动设置 Title、Info 属性!")
  109. End If
  110. '获取文件名
  111. Dim RawFileName As String
  112. Try
  113. RawFileName = GetFileNameFromPath(RelativeUrl)
  114. If Not RawFileName.EndsWithF(".json", True) Then Throw New Exception("未指向 .json 后缀的文件")
  115. Catch ex As Exception
  116. Throw New Exception("联网帮助页面须指向一个帮助 JSON 文件,并在同路径下包含相应 XAML 文件!" & vbCrLf &
  117. "例如:" & vbCrLf &
  118. " - https://www.baidu.com/test.json(填写这个路径)" & vbCrLf &
  119. " - https://www.baidu.com/test.xaml(同时也需要包含这个文件)", ex)
  120. End Try
  121. '下载文件
  122. Dim LocalTemp1 As String = PathTemp & "CustomEvent\" & RawFileName
  123. Dim LocalTemp2 As String = PathTemp & "CustomEvent\" & RawFileName.Replace(".json", ".xaml")
  124. Log("[Event] 转换网络资源:" & RelativeUrl & " -> " & LocalTemp1)
  125. Hint("正在获取资源,请稍候……")
  126. Try
  127. NetDownload(RelativeUrl, LocalTemp1)
  128. NetDownload(RelativeUrl.Replace(".json", ".xaml"), LocalTemp1.Replace(".json", ".xaml"))
  129. Catch ex As Exception
  130. Throw New Exception("下载指定的文件失败!" & vbCrLf &
  131. "注意,联网帮助页面须指向一个帮助 JSON 文件,并在同路径下包含相应 XAML 文件!" & vbCrLf &
  132. "例如:" & vbCrLf &
  133. " - https://www.baidu.com/test.json(填写这个路径)" & vbCrLf &
  134. " - https://www.baidu.com/test.xaml(同时也需要包含这个文件)", ex)
  135. End Try
  136. RelativeUrl = LocalTemp1
  137. End If
  138. RelativeUrl = RelativeUrl.Replace("/", "\").ToLower.TrimStart("\")
  139. '确认实际路径
  140. Dim Location As String, WorkingDir As String = Path & "PCL"
  141. HelpTryExtract()
  142. If RelativeUrl.Contains(":\") Then
  143. '绝对路径
  144. Location = RelativeUrl
  145. Log("[Control] 自定义事件中由绝对路径" & EventType & ":" & Location)
  146. ElseIf File.Exists(Path & "PCL\" & RelativeUrl) Then
  147. '相对 PCL 文件夹的路径
  148. Location = Path & "PCL\" & RelativeUrl
  149. Log("[Control] 自定义事件中由相对 PCL 文件夹的路径" & EventType & ":" & Location)
  150. ElseIf File.Exists(Path & "PCL\Help\" & RelativeUrl) Then
  151. '相对 PCL 本地帮助文件夹的路径
  152. Location = Path & "PCL\Help\" & RelativeUrl
  153. WorkingDir = Path & "PCL\Help\"
  154. Log("[Control] 自定义事件中由相对 PCL 本地帮助文件夹的路径" & EventType & ":" & Location)
  155. ElseIf EventType = "打开帮助" AndAlso File.Exists(PathTemp & "Help\" & RelativeUrl) Then
  156. '相对 PCL 自带帮助文件夹的路径
  157. Location = PathTemp & "Help\" & RelativeUrl
  158. WorkingDir = PathTemp & "Help\"
  159. Log("[Control] 自定义事件中由相对 PCL 自带帮助文件夹的路径" & EventType & ":" & Location)
  160. ElseIf EventType = "打开文件" Then
  161. '直接使用原有路径启动程序
  162. Location = RelativeUrl
  163. Log("[Control] 自定义事件中直接" & EventType & ":" & Location)
  164. Else
  165. '打开帮助,但是格式不对劲
  166. Throw New FileNotFoundException("未找到 EventData 指向的本地 xaml 文件:" & RelativeUrl, RelativeUrl)
  167. End If
  168. Return {Location, WorkingDir}
  169. End Function
  170. End Module