提交记录修改Core/App.config+13 −13看文件
修改Core/Core.csproj+24 −9看文件
新增Core/Event/WebServerEventHandler.cs+12 −0看文件
删除Core/Librarys/Browser/Favicon/ChromeFaviconManager.cs+0 −137
新增Core/Librarys/Browser/Favicon/FaviconDownloader.cs+50 −0看文件
删除Core/Librarys/Browser/Favicon/IFaviconManager.cs+0 −24
修改Core/Librarys/Browser/UrlHelper.cs+1 −1看文件
新增Core/Librarys/Browser/WebSocketEvent.cs+22 −0看文件
修改Core/Models/Config/GeneralModel.cs+1 −1看文件
新增Core/Models/WebPage/NotifyWeb.cs+25 −0看文件
删除Core/Servicers/Instances/BrowserObserver.cs+0 −323
删除Core/Servicers/Instances/ChromeBrowserWatch.cs+0 −220
删除Core/Servicers/Instances/MSEdgeBrowserWatch.cs+0 −243
修改Core/Servicers/Instances/Main.cs+57 −3看文件
修改Core/Servicers/Instances/Sleepdiscover.cs+3 −1看文件
删除Core/Servicers/Instances/VivaldiBrowserWatch.cs+0 −219
修改Core/Servicers/Instances/WebFilter.cs+6 −1看文件
新增Core/Servicers/Instances/WebServer.cs+58 −0看文件
删除Core/Servicers/Interfaces/IBrowserObserver.cs+0 −29
改名Core/Servicers/Interfaces/IBrowserWatcher.cs → Core/Servicers/Interfaces/IWebServer.cs+4 −4看文件
修改Core/packages.config+1 −0看文件
修改TaiBug/App.config+3 −3看文件
修改TaiBug/Properties/Resources.Designer.cs+24 −32看文件
修改TaiBug/Properties/Settings.Designer.cs+13 −17看文件
修改TaiBug/TaiBug.csproj+2 −1看文件
修改UI/App.config+10 −10看文件
修改UI/Properties/Settings.Designer.cs+1 −1看文件
修改UI/Themes/SettingPanel/SettingPanelItem.xaml+1 −1看文件
修改UI/UI.csproj+2 −1看文件
修改Updater/App.config+3 −3看文件
修改Updater/Properties/Resources.Designer.cs+24 −32看文件
修改Updater/Properties/Settings.Designer.cs+13 −17看文件
修改Updater/Updater.csproj+2 −1看文件
新增WebExtensions/Chrome/icons/socket-active.png看文件 新增WebExtensions/Chrome/icons/socket-inactive.png看文件 新增WebExtensions/Chrome/manifest.json+17 −0看文件
新增WebExtensions/Chrome/service-worker.js+318 −0看文件
| @@ -1,35 +1,35 @@ | ||
| 1 | 删除:<?xml version="1.0" encoding="utf-8"?> | |
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 2 | <configuration> |
| 3 | 3 | <configSections> |
| 4 | 4 | <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> |
| 5 | 删除: <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> | |
| 5 | 新增: <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> | |
| 6 | 6 | </configSections> |
| 7 | 7 | <entityFramework> |
| 8 | 8 | <providers> |
| 9 | 删除: <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> | |
| 10 | 删除: <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> | |
| 9 | 新增: <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/> | |
| 10 | 新增: <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/> | |
| 11 | 11 | </providers> |
| 12 | 12 | </entityFramework> |
| 13 | 13 | <system.data> |
| 14 | 14 | <DbProviderFactories> |
| 15 | 删除: <remove invariant="System.Data.SQLite.EF6" /> | |
| 16 | 删除: <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> | |
| 15 | 新增: <remove invariant="System.Data.SQLite.EF6"/> | |
| 16 | 新增: <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6"/> | |
| 17 | 17 | </DbProviderFactories> |
| 18 | 18 | </system.data> |
| 19 | 19 | <runtime> |
| 20 | 20 | <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> |
| 21 | 21 | <dependentAssembly> |
| 22 | 删除: <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" /> | |
| 23 | 删除: <bindingRedirect oldVersion="0.0.0.0-1.0.115.5" newVersion="1.0.115.5" /> | |
| 22 | 新增: <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral"/> | |
| 23 | 新增: <bindingRedirect oldVersion="0.0.0.0-1.0.115.5" newVersion="1.0.115.5"/> | |
| 24 | 24 | </dependentAssembly> |
| 25 | 25 | <dependentAssembly> |
| 26 | 删除: <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> | |
| 27 | 删除: <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> | |
| 26 | 新增: <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/> | |
| 27 | 新增: <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/> | |
| 28 | 28 | </dependentAssembly> |
| 29 | 29 | <dependentAssembly> |
| 30 | 删除: <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> | |
| 31 | 删除: <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" /> | |
| 30 | 新增: <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/> | |
| 31 | 新增: <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1"/> | |
| 32 | 32 | </dependentAssembly> |
| 33 | 33 | </assemblyBinding> |
| 34 | 34 | </runtime> |
| 35 | 删除:</configuration> | |
| 文件末尾没有换行 | ||
| 35 | 新增:<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration> | |
| @@ -16,7 +16,7 @@ | ||
| 16 | 16 | <AppDesignerFolder>Properties</AppDesignerFolder> |
| 17 | 17 | <RootNamespace>Core</RootNamespace> |
| 18 | 18 | <AssemblyName>Core</AssemblyName> |
| 19 | 删除: <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> | |
| 19 | 新增: <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> | |
| 20 | 20 | <FileAlignment>512</FileAlignment> |
| 21 | 21 | <Deterministic>true</Deterministic> |
| 22 | 22 | <TargetFrameworkProfile /> |
| @@ -137,19 +137,28 @@ | ||
| 137 | 137 | <Reference Include="System.Data" /> |
| 138 | 138 | <Reference Include="System.Net.Http" /> |
| 139 | 139 | <Reference Include="System.Xml" /> |
| 140 | 新增: <Reference Include="websocket-sharp, Version=1.0.2.59611, Culture=neutral, PublicKeyToken=5660b08a1845a91e, processorArchitecture=MSIL"> | |
| 141 | 新增: <HintPath>..\packages\WebSocketSharp.1.0.3-rc11\lib\websocket-sharp.dll</HintPath> | |
| 142 | 新增: </Reference> | |
| 140 | 143 | <Reference Include="WindowsBase" /> |
| 141 | 144 | </ItemGroup> |
| 142 | 145 | <ItemGroup> |
| 143 | 146 | <Compile Include="AppState.cs" /> |
| 147 | 新增: <Compile Include="Enums\AppType.cs" /> | |
| 144 | 148 | <Compile Include="Enums\BrowserType.cs" /> |
| 145 | 149 | <Compile Include="Enums\SleepStatus.cs" /> |
| 146 | 150 | <Compile Include="Enums\WebPageInfoType.cs" /> |
| 151 | 新增: <Compile Include="Event\AppActiveChangedEventArgs.cs" /> | |
| 152 | 新增: <Compile Include="Event\AppDurationUpdatedEventArgs.cs" /> | |
| 153 | 新增: <Compile Include="Event\AppObserverEventHandler.cs" /> | |
| 154 | 新增: <Compile Include="Event\AppTimerEventHandler.cs" /> | |
| 147 | 155 | <Compile Include="Event\EventHandler.cs" /> |
| 148 | 156 | <Compile Include="Event\BrowserObserverEventHandler.cs" /> |
| 157 | 新增: <Compile Include="Event\WebServerEventHandler.cs" /> | |
| 149 | 158 | <Compile Include="Event\ObserverEventHandler.cs" /> |
| 150 | 删除: <Compile Include="Librarys\Browser\Favicon\ChromeFaviconManager.cs" /> | |
| 151 | 删除: <Compile Include="Librarys\Browser\Favicon\IFaviconManager.cs" /> | |
| 159 | 新增: <Compile Include="Librarys\Browser\Favicon\FaviconDownloader.cs" /> | |
| 152 | 160 | <Compile Include="Librarys\Browser\UrlHelper.cs" /> |
| 161 | 新增: <Compile Include="Librarys\Browser\WebSocketEvent.cs" /> | |
| 153 | 162 | <Compile Include="Librarys\FileHelper.cs" /> |
| 154 | 163 | <Compile Include="Librarys\ProcessHelper.cs" /> |
| 155 | 164 | <Compile Include="Librarys\RegexHelper.cs" /> |
| @@ -162,7 +171,9 @@ | ||
| 162 | 171 | <Compile Include="Librarys\Time.cs" /> |
| 163 | 172 | <Compile Include="Librarys\Win32API.cs" /> |
| 164 | 173 | <Compile Include="Models\AppModel.cs" /> |
| 174 | 新增: <Compile Include="Models\AppObserver\AppInfo.cs" /> | |
| 165 | 175 | <Compile Include="Models\AppObserver\AppObserverEventArgs.cs" /> |
| 176 | 新增: <Compile Include="Models\AppObserver\WindowInfo.cs" /> | |
| 166 | 177 | <Compile Include="Models\CategoryModel.cs" /> |
| 167 | 178 | <Compile Include="Models\Config\ConfigAttribute.cs" /> |
| 168 | 179 | <Compile Include="Models\Config\ConfigModel.cs" /> |
| @@ -177,14 +188,14 @@ | ||
| 177 | 188 | <Compile Include="Models\Db\WebUrlModel.cs" /> |
| 178 | 189 | <Compile Include="Models\HoursLogModel.cs" /> |
| 179 | 190 | <Compile Include="Models\DailyLogModel.cs" /> |
| 191 | 新增: <Compile Include="Models\WebPage\NotifyWeb.cs" /> | |
| 180 | 192 | <Compile Include="Models\WebPage\Site.cs" /> |
| 181 | 193 | <Compile Include="Properties\AssemblyInfo.cs" /> |
| 182 | 194 | <Compile Include="Servicers\Instances\AppConfig.cs" /> |
| 183 | 195 | <Compile Include="Servicers\Instances\AppData.cs" /> |
| 184 | 删除: <Compile Include="Servicers\Instances\BrowserObserver.cs" /> | |
| 196 | 新增: <Compile Include="Servicers\Instances\AppManager.cs" /> | |
| 197 | 新增: <Compile Include="Servicers\Instances\AppTimerServicer.cs" /> | |
| 185 | 198 | <Compile Include="Servicers\Instances\Categorys.cs" /> |
| 186 | 删除: <Compile Include="Servicers\Instances\MSEdgeBrowserWatch.cs" /> | |
| 187 | 删除: <Compile Include="Servicers\Instances\ChromeBrowserWatch.cs" /> | |
| 188 | 199 | <Compile Include="Servicers\Instances\Data.cs" /> |
| 189 | 200 | <Compile Include="Librarys\Logger.cs" /> |
| 190 | 201 | <Compile Include="Servicers\Instances\Database.cs" /> |
| @@ -195,9 +206,11 @@ | ||
| 195 | 206 | <Compile Include="Servicers\Instances\Sleepdiscover.cs" /> |
| 196 | 207 | <Compile Include="Servicers\Instances\WebData.cs" /> |
| 197 | 208 | <Compile Include="Servicers\Instances\WebFilter.cs" /> |
| 209 | 新增: <Compile Include="Servicers\Instances\WebServer.cs" /> | |
| 210 | 新增: <Compile Include="Servicers\Instances\WindowManager.cs" /> | |
| 198 | 211 | <Compile Include="Servicers\Interfaces\IAppConfig.cs" /> |
| 199 | 删除: <Compile Include="Servicers\Interfaces\IBrowserWatcher.cs" /> | |
| 200 | 删除: <Compile Include="Servicers\Interfaces\IBrowserObserver.cs" /> | |
| 212 | 新增: <Compile Include="Servicers\Interfaces\IAppManager.cs" /> | |
| 213 | 新增: <Compile Include="Servicers\Interfaces\IAppTimerServicer.cs" /> | |
| 201 | 214 | <Compile Include="Servicers\Interfaces\ICategorys.cs" /> |
| 202 | 215 | <Compile Include="Servicers\Interfaces\IAppData.cs" /> |
| 203 | 216 | <Compile Include="Servicers\Interfaces\IData.cs" /> |
| @@ -208,7 +221,8 @@ | ||
| 208 | 221 | <Compile Include="Servicers\Interfaces\ISleepdiscover.cs" /> |
| 209 | 222 | <Compile Include="Servicers\Interfaces\IWebData.cs" /> |
| 210 | 223 | <Compile Include="Servicers\Interfaces\IWebFilter.cs" /> |
| 211 | 删除: <Compile Include="Servicers\Instances\VivaldiBrowserWatch.cs" /> | |
| 224 | 新增: <Compile Include="Servicers\Interfaces\IWebServer.cs" /> | |
| 225 | 新增: <Compile Include="Servicers\Interfaces\IWindowManager.cs" /> | |
| 212 | 226 | </ItemGroup> |
| 213 | 227 | <ItemGroup> |
| 214 | 228 | <None Include="App.config" /> |
| @@ -225,6 +239,7 @@ | ||
| 225 | 239 | <EmbedInteropTypes>True</EmbedInteropTypes> |
| 226 | 240 | </COMReference> |
| 227 | 241 | </ItemGroup> |
| 242 | 新增: <ItemGroup /> | |
| 228 | 243 | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
| 229 | 244 | <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> |
| 230 | 245 | <PropertyGroup> |
| @@ -0,0 +1,12 @@ | ||
| 1 | 新增:using Core.Models.AppObserver; | |
| 2 | 新增:using Core.Models.WebPage; | |
| 3 | 新增:using System; | |
| 4 | 新增:using System.Collections.Generic; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增: | |
| 9 | 新增:namespace Core.Event | |
| 10 | 新增:{ | |
| 11 | 新增: public delegate void WebServerEventHandler(NotifyWeb args); | |
| 12 | 新增:} | |
| @@ -1,137 +0,0 @@ | ||
| 1 | 删除:using Core.Enums; | |
| 2 | 删除:using System; | |
| 3 | 删除:using System.Collections.Generic; | |
| 4 | 删除:using System.Data.SQLite; | |
| 5 | 删除:using System.Diagnostics; | |
| 6 | 删除:using System.Drawing; | |
| 7 | 删除:using System.IO; | |
| 8 | 删除:using System.Linq; | |
| 9 | 删除:using System.Net; | |
| 10 | 删除:using System.Security.Cryptography; | |
| 11 | 删除:using System.Security.Policy; | |
| 12 | 删除:using System.Text; | |
| 13 | 删除:using System.Threading; | |
| 14 | 删除:using System.Threading.Tasks; | |
| 15 | 删除: | |
| 16 | 删除:namespace Core.Librarys.Browser.Favicon | |
| 17 | 删除:{ | |
| 18 | 删除: public class ChromeFaviconManager : IFaviconManager | |
| 19 | 删除: { | |
| 20 | 删除: private readonly string _chromeFaviconsPath; | |
| 21 | 删除: private readonly string _faviconsTempPath; | |
| 22 | 删除: private readonly string _taiFaviconsPath; | |
| 23 | 删除: public ChromeFaviconManager(BrowserType browserType = BrowserType.Chrome) | |
| 24 | 删除: { | |
| 25 | 删除: var localAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); | |
| 26 | 删除: | |
| 27 | 删除: switch (browserType) | |
| 28 | 删除: { | |
| 29 | 删除: case BrowserType.Chrome: | |
| 30 | 删除: _chromeFaviconsPath = Path.Combine(localAppDataDir, "Google", "Chrome", "User Data", "Default", "Favicons"); | |
| 31 | 删除: break; | |
| 32 | 删除: case BrowserType.MSEdge: | |
| 33 | 删除: _chromeFaviconsPath = Path.Combine(localAppDataDir, "Microsoft", "Edge", "User Data", "Default", "Favicons"); | |
| 34 | 删除: break; | |
| 35 | 删除: case BrowserType.Vivaldi: | |
| 36 | 删除: _chromeFaviconsPath = Path.Combine(localAppDataDir, "Vivaldi", "User Data", "Default", "Favicons"); | |
| 37 | 删除: break; | |
| 38 | 删除: } | |
| 39 | 删除: _faviconsTempPath = $"{_chromeFaviconsPath}_tai.temp"; | |
| 40 | 删除: _taiFaviconsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebFavicons"); | |
| 41 | 删除: if (!File.Exists(_chromeFaviconsPath)) | |
| 42 | 删除: { | |
| 43 | 删除: throw new FileNotFoundException("favicons文件路径没有找到"); | |
| 44 | 删除: } | |
| 45 | 删除: if (!Directory.Exists(_taiFaviconsPath)) | |
| 46 | 删除: { | |
| 47 | 删除: Directory.CreateDirectory(_taiFaviconsPath); | |
| 48 | 删除: } | |
| 49 | 删除: } | |
| 50 | 删除: public async Task<object> GetIconDataAsync(string url) | |
| 51 | 删除: { | |
| 52 | 删除: if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } | |
| 53 | 删除: | |
| 54 | 删除: url = UrlHelper.ChromeURLEncode(url); | |
| 55 | 删除: | |
| 56 | 删除: var result = await Task.Run(() => | |
| 57 | 删除: { | |
| 58 | 删除: byte[] icon = { }; | |
| 59 | 删除: try | |
| 60 | 删除: { | |
| 61 | 删除: File.Copy(_chromeFaviconsPath, _faviconsTempPath, true); | |
| 62 | 删除: | |
| 63 | 删除: using (var con = new SQLiteConnection($"Data Source={_faviconsTempPath}")) | |
| 64 | 删除: { | |
| 65 | 删除: con.Open(); | |
| 66 | 删除: | |
| 67 | 删除: string iconId = GetIconId(url, con); | |
| 68 | 删除: | |
| 69 | 删除: if (iconId != string.Empty) | |
| 70 | 删除: { | |
| 71 | 删除: using (var cmd = new SQLiteCommand($"select * from favicon_bitmaps where icon_id={iconId} order by width desc LIMIT 1", con)) | |
| 72 | 删除: { | |
| 73 | 删除: using (SQLiteDataReader dr = cmd.ExecuteReader()) | |
| 74 | 删除: { | |
| 75 | 删除: if (dr.Read()) | |
| 76 | 删除: { | |
| 77 | 删除: icon = (System.Byte[])dr["image_data"]; | |
| 78 | 删除: } | |
| 79 | 删除: } | |
| 80 | 删除: } | |
| 81 | 删除: } | |
| 82 | 删除: } | |
| 83 | 删除: | |
| 84 | 删除: File.Delete(_faviconsTempPath); | |
| 85 | 删除: } | |
| 86 | 删除: catch (Exception ex) | |
| 87 | 删除: { | |
| 88 | 删除: Logger.Error(ex.ToString()); | |
| 89 | 删除: } | |
| 90 | 删除: return icon; | |
| 91 | 删除: }); | |
| 92 | 删除: | |
| 93 | 删除: return result.Length == 0 ? null : result; | |
| 94 | 删除: } | |
| 95 | 删除: | |
| 96 | 删除: private string GetIconId(string url_, SQLiteConnection con_) | |
| 97 | 删除: { | |
| 98 | 删除: string iconId = string.Empty; | |
| 99 | 删除: string sqlStr = url_.IndexOf("://") == -1 ? $"%{url_}%" : $"{url_}%"; | |
| 100 | 删除: using (var cmd = new SQLiteCommand($"select * from icon_mapping where page_url like'{sqlStr}' LIMIT 1", con_)) | |
| 101 | 删除: { | |
| 102 | 删除: using (SQLiteDataReader dr = cmd.ExecuteReader()) | |
| 103 | 删除: { | |
| 104 | 删除: if (dr.Read()) | |
| 105 | 删除: { | |
| 106 | 删除: iconId = dr["icon_id"].ToString(); | |
| 107 | 删除: } | |
| 108 | 删除: } | |
| 109 | 删除: } | |
| 110 | 删除: return iconId; | |
| 111 | 删除: } | |
| 112 | 删除: | |
| 113 | 删除: public async Task<string> SaveToLocalIconAsync(object data) | |
| 114 | 删除: { | |
| 115 | 删除: if (data == null) { throw new ArgumentNullException("data"); } | |
| 116 | 删除: return await Task.Run(() => | |
| 117 | 删除: { | |
| 118 | 删除: var icon = data as byte[]; | |
| 119 | 删除: string iconPath = string.Empty; | |
| 120 | 删除: using (var md5 = MD5.Create()) | |
| 121 | 删除: { | |
| 122 | 删除: var hash = md5.ComputeHash(icon); | |
| 123 | 删除: var md5Str = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); | |
| 124 | 删除: | |
| 125 | 删除: iconPath = Path.Combine(_taiFaviconsPath, $"{md5Str}.png"); | |
| 126 | 删除: if (!File.Exists(iconPath)) | |
| 127 | 删除: { | |
| 128 | 删除: File.WriteAllBytes(iconPath, icon); | |
| 129 | 删除: } | |
| 130 | 删除: iconPath = Path.Combine("WebFavicons", $"{md5Str}.png"); | |
| 131 | 删除: } | |
| 132 | 删除: return iconPath; | |
| 133 | 删除: }); | |
| 134 | 删除: | |
| 135 | 删除: } | |
| 136 | 删除: } | |
| 137 | 删除:} | |
| @@ -0,0 +1,50 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.IO; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Net; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增: | |
| 9 | 新增:namespace Core.Librarys.Browser.Favicon | |
| 10 | 新增:{ | |
| 11 | 新增: public class FaviconDownloader | |
| 12 | 新增: { | |
| 13 | 新增: /// <summary> | |
| 14 | 新增: /// 下载文件 | |
| 15 | 新增: /// </summary> | |
| 16 | 新增: /// <param name="url_">文件远程地址</param> | |
| 17 | 新增: /// <param name="savePath_">本地保存路径</param> | |
| 18 | 新增: public static async Task<string> DownloadAsync(string url_, string saveName_) | |
| 19 | 新增: { | |
| 20 | 新增: if (string.IsNullOrEmpty(url_)) return string.Empty; | |
| 21 | 新增: | |
| 22 | 新增: string savePath = Path.Combine(FileHelper.GetRootDirectory(), "WebFavicons", saveName_); | |
| 23 | 新增: string dir = Path.GetDirectoryName(savePath); | |
| 24 | 新增: // 暂时不支持svg格式ico,尝试获取png | |
| 25 | 新增: url_ = url_.Replace(".svg", ".png"); | |
| 26 | 新增: | |
| 27 | 新增: if (!Directory.Exists(dir)) | |
| 28 | 新增: { | |
| 29 | 新增: Directory.CreateDirectory(dir); | |
| 30 | 新增: } | |
| 31 | 新增: if (File.Exists(savePath)) | |
| 32 | 新增: { | |
| 33 | 新增: return savePath; | |
| 34 | 新增: } | |
| 35 | 新增: try | |
| 36 | 新增: { | |
| 37 | 新增: using (var web = new WebClient()) | |
| 38 | 新增: { | |
| 39 | 新增: await web.DownloadFileTaskAsync(url_, savePath); | |
| 40 | 新增: return savePath; | |
| 41 | 新增: } | |
| 42 | 新增: } | |
| 43 | 新增: catch (Exception e) | |
| 44 | 新增: { | |
| 45 | 新增: Logger.Error("下载图标失败," + e); | |
| 46 | 新增: return string.Empty; | |
| 47 | 新增: } | |
| 48 | 新增: } | |
| 49 | 新增: } | |
| 50 | 新增:} | |
| @@ -1,24 +0,0 @@ | ||
| 1 | 删除:using System; | |
| 2 | 删除:using System.Collections.Generic; | |
| 3 | 删除:using System.Linq; | |
| 4 | 删除:using System.Text; | |
| 5 | 删除:using System.Threading.Tasks; | |
| 6 | 删除: | |
| 7 | 删除:namespace Core.Librarys.Browser.Favicon | |
| 8 | 删除:{ | |
| 9 | 删除: public interface IFaviconManager | |
| 10 | 删除: { | |
| 11 | 删除: /// <summary> | |
| 12 | 删除: /// 保存图标数据到Tai目录下并返回图标相对路径 | |
| 13 | 删除: /// </summary> | |
| 14 | 删除: /// <param name="data"></param> | |
| 15 | 删除: /// <returns></returns> | |
| 16 | 删除: Task<string> SaveToLocalIconAsync(object data); | |
| 17 | 删除: /// <summary> | |
| 18 | 删除: /// 通过URL链接获取Favicon图标数据 | |
| 19 | 删除: /// </summary> | |
| 20 | 删除: /// <param name="url"></param> | |
| 21 | 删除: /// <returns></returns> | |
| 22 | 删除: Task<object> GetIconDataAsync(string url); | |
| 23 | 删除: } | |
| 24 | 删除:} | |
| @@ -98,7 +98,7 @@ namespace Core.Librarys.Browser | ||
| 98 | 98 | { |
| 99 | 99 | url_ = url_.Replace("http://", string.Empty); |
| 100 | 100 | url_ = url_.Replace("https://", string.Empty); |
| 101 | 删除: return url_.IndexOf("/") == -1; | |
| 101 | 新增: return url_.IndexOf("/") == -1 || url_.Last() == '/'; | |
| 102 | 102 | } |
| 103 | 103 | |
| 104 | 104 | /// <summary> |
| @@ -0,0 +1,22 @@ | ||
| 1 | 新增:using Core.Event; | |
| 2 | 新增:using Core.Models.WebPage; | |
| 3 | 新增:using System; | |
| 4 | 新增:using System.Collections.Generic; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增:using WebSocketSharp; | |
| 9 | 新增:using WebSocketSharp.Server; | |
| 10 | 新增: | |
| 11 | 新增:namespace Core.Librarys.Browser | |
| 12 | 新增:{ | |
| 13 | 新增: public class WebSocketEvent : WebSocketBehavior | |
| 14 | 新增: { | |
| 15 | 新增: public static event WebServerEventHandler OnWebLog; | |
| 16 | 新增: | |
| 17 | 新增: public static void Invoke(NotifyWeb args_) | |
| 18 | 新增: { | |
| 19 | 新增: OnWebLog?.Invoke(args_); | |
| 20 | 新增: } | |
| 21 | 新增: } | |
| 22 | 新增:} | |
| @@ -60,7 +60,7 @@ namespace Core.Models.Config | ||
| 60 | 60 | /// <summary> |
| 61 | 61 | /// 是否启用网站记录功能 |
| 62 | 62 | /// </summary> |
| 63 | 删除: [Config(Name = "网站浏览统计", Description = "统计浏览器的网站访问数据,支持:Google Chrome、MSEdge、Vivaldi", Group = "功能", IsBeta = true)] | |
| 63 | 新增: [Config(Name = "网站浏览统计", Description = "统计浏览器的网站访问数据,支持:Google Chrome、MSEdge或任何能够安装Chrome拓展的浏览器。在浏览器拓展管理中启用开发模式,选择加载已解压插件,选择Tai浏览器插件。", Group = "功能", IsBeta = true)] | |
| 64 | 64 | public bool IsWebEnabled { get; set; } = false; |
| 65 | 65 | } |
| 66 | 66 | } |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,25 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Models.WebPage | |
| 8 | 新增:{ | |
| 9 | 新增: public class NotifyWeb | |
| 10 | 新增: { | |
| 11 | 新增: public string Url { get; set; } | |
| 12 | 新增: public string Title { get; set; } | |
| 13 | 新增: public string Icon { get; set; } | |
| 14 | 新增: public int ActiveTime { get; set; } | |
| 15 | 新增: public int Duration { get; set; } | |
| 16 | 新增: public DateTime ActiveDateTime | |
| 17 | 新增: { | |
| 18 | 新增: get | |
| 19 | 新增: { | |
| 20 | 新增: DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); | |
| 21 | 新增: return dateTime.AddSeconds(ActiveTime).ToLocalTime(); | |
| 22 | 新增: } | |
| 23 | 新增: } | |
| 24 | 新增: } | |
| 25 | 新增:} | |
| @@ -1,323 +0,0 @@ | ||
| 1 | 删除:using Core.Enums; | |
| 2 | 删除:using Core.Event; | |
| 3 | 删除:using Core.Librarys; | |
| 4 | 删除:using Core.Librarys.Browser; | |
| 5 | 删除:using Core.Librarys.Browser.Favicon; | |
| 6 | 删除:using Core.Librarys.SQLite; | |
| 7 | 删除:using Core.Models.WebPage; | |
| 8 | 删除:using Core.Servicers.Interfaces; | |
| 9 | 删除:using NPOI.SS.Formula.Functions; | |
| 10 | 删除:using System; | |
| 11 | 删除:using System.Collections.Generic; | |
| 12 | 删除:using System.Data.SQLite; | |
| 13 | 删除:using System.Diagnostics; | |
| 14 | 删除:using System.IO; | |
| 15 | 删除:using System.Linq; | |
| 16 | 删除:using System.Security.Policy; | |
| 17 | 删除:using System.Text; | |
| 18 | 删除:using System.Threading; | |
| 19 | 删除:using System.Threading.Tasks; | |
| 20 | 删除:using System.Windows.Automation; | |
| 21 | 删除:using System.Windows.Forms; | |
| 22 | 删除:using System.Windows.Threading; | |
| 23 | 删除:using Site = Core.Models.WebPage.Site; | |
| 24 | 删除: | |
| 25 | 删除:namespace Core.Servicers.Instances | |
| 26 | 删除:{ | |
| 27 | 删除: public class BrowserObserver : IBrowserObserver | |
| 28 | 删除: { | |
| 29 | 删除: public event BrowserObserverEventHandler OnSiteChanged; | |
| 30 | 删除: | |
| 31 | 删除: private readonly IAppObserver _appObserver; | |
| 32 | 删除: private readonly IWebData _webData; | |
| 33 | 删除: private readonly IWebFilter _webFilter; | |
| 34 | 删除: private readonly ISleepdiscover _sleepdiscover; | |
| 35 | 删除: private readonly IDateTimeObserver _dateTimeObserver; | |
| 36 | 删除: | |
| 37 | 删除: private IBrowserWatcher _browserWatcher; | |
| 38 | 删除: private bool _isStart = false; | |
| 39 | 删除: /// <summary> | |
| 40 | 删除: /// 忽略的URL集合 | |
| 41 | 删除: /// </summary> | |
| 42 | 删除: private readonly string[] _ignoreURL = { "about:blank" }; | |
| 43 | 删除: /// <summary> | |
| 44 | 删除: /// 当前浏览站点 | |
| 45 | 删除: /// </summary> | |
| 46 | 删除: private Site _activeSite = null; | |
| 47 | 删除: /// <summary> | |
| 48 | 删除: /// 浏览开始时间 | |
| 49 | 删除: /// </summary> | |
| 50 | 删除: private DateTime _activeStartTime = DateTime.MinValue; | |
| 51 | 删除: // 已保存图标的链接 | |
| 52 | 删除: private List<string> _savedIconUrls = new List<string>(); | |
| 53 | 删除: public BrowserObserver(IAppObserver appObserver_, IWebData webData_, IWebFilter webFilter_, ISleepdiscover sleepdiscover_, IDateTimeObserver dateTimeObserver_) | |
| 54 | 删除: { | |
| 55 | 删除: _appObserver = appObserver_; | |
| 56 | 删除: _webData = webData_; | |
| 57 | 删除: _webFilter = webFilter_; | |
| 58 | 删除: _sleepdiscover = sleepdiscover_; | |
| 59 | 删除: _dateTimeObserver = dateTimeObserver_; | |
| 60 | 删除: } | |
| 61 | 删除: public void Start() | |
| 62 | 删除: { | |
| 63 | 删除: if (_isStart) | |
| 64 | 删除: { | |
| 65 | 删除: return; | |
| 66 | 删除: } | |
| 67 | 删除: _isStart = true; | |
| 68 | 删除: _appObserver.OnAppActive += AppObserver_OnAppActive; | |
| 69 | 删除: _sleepdiscover.SleepStatusChanged += _sleepdiscover_SleepStatusChanged; | |
| 70 | 删除: _dateTimeObserver.OnDateTimeChanging += _dateTimeObserver_OnDateTimeChanging; | |
| 71 | 删除: } | |
| 72 | 删除: | |
| 73 | 删除: private void _dateTimeObserver_OnDateTimeChanging(object sender, DateTime e) | |
| 74 | 删除: { | |
| 75 | 删除: SaveTime(false); | |
| 76 | 删除: } | |
| 77 | 删除: | |
| 78 | 删除: public void Stop() | |
| 79 | 删除: { | |
| 80 | 删除: _appObserver.OnAppActive -= AppObserver_OnAppActive; | |
| 81 | 删除: _sleepdiscover.SleepStatusChanged -= _sleepdiscover_SleepStatusChanged; | |
| 82 | 删除: _dateTimeObserver.OnDateTimeChanging -= _dateTimeObserver_OnDateTimeChanging; | |
| 83 | 删除: | |
| 84 | 删除: _isStart = false; | |
| 85 | 删除: StopWatch(); | |
| 86 | 删除: } | |
| 87 | 删除: | |
| 88 | 删除: private void _sleepdiscover_SleepStatusChanged(SleepStatus sleepStatus) | |
| 89 | 删除: { | |
| 90 | 删除: if (sleepStatus == SleepStatus.Sleep) | |
| 91 | 删除: { | |
| 92 | 删除: // 睡眠状态 | |
| 93 | 删除: Stop(); | |
| 94 | 删除: } | |
| 95 | 删除: else | |
| 96 | 删除: { | |
| 97 | 删除: // 唤醒 | |
| 98 | 删除: Start(); | |
| 99 | 删除: } | |
| 100 | 删除: } | |
| 101 | 删除: | |
| 102 | 删除: private void AppObserver_OnAppActive(Models.AppObserver.AppObserverEventArgs args) | |
| 103 | 删除: { | |
| 104 | 删除: switch (args.ProcessName) | |
| 105 | 删除: { | |
| 106 | 删除: case "chrome": | |
| 107 | 删除: StartWatch(BrowserType.Chrome, args.Handle); | |
| 108 | 删除: break; | |
| 109 | 删除: case "msedge": | |
| 110 | 删除: StartWatch(BrowserType.MSEdge, args.Handle); | |
| 111 | 删除: break; | |
| 112 | 删除: case "vivaldi": | |
| 113 | 删除: StartWatch(BrowserType.Vivaldi, args.Handle); | |
| 114 | 删除: break; | |
| 115 | 删除: default: | |
| 116 | 删除: StopWatch(); | |
| 117 | 删除: break; | |
| 118 | 删除: | |
| 119 | 删除: } | |
| 120 | 删除: } | |
| 121 | 删除: | |
| 122 | 删除: private void StartWatch(BrowserType browserType, IntPtr handle) | |
| 123 | 删除: { | |
| 124 | 删除: StopWatch(); | |
| 125 | 删除: | |
| 126 | 删除: switch (browserType) | |
| 127 | 删除: { | |
| 128 | 删除: case BrowserType.Chrome: | |
| 129 | 删除: _browserWatcher = new ChromeBrowserWatch(); | |
| 130 | 删除: break; | |
| 131 | 删除: case BrowserType.Vivaldi: | |
| 132 | 删除: _browserWatcher = new VivaldiBrowserWatch(); | |
| 133 | 删除: break; | |
| 134 | 删除: case BrowserType.MSEdge: | |
| 135 | 删除: _browserWatcher = new MSEdgeBrowserWatch(); | |
| 136 | 删除: break; | |
| 137 | 删除: } | |
| 138 | 删除: | |
| 139 | 删除: if (_browserWatcher == null) | |
| 140 | 删除: { | |
| 141 | 删除: Logger.Error("无法启动浏览器监听,浏览器类型:" + browserType.ToString()); | |
| 142 | 删除: return; | |
| 143 | 删除: } | |
| 144 | 删除: | |
| 145 | 删除: _browserWatcher.OnSiteChanged += BrowserWatcher_OnSiteChanged; ; | |
| 146 | 删除: _browserWatcher.StartWatch(handle); | |
| 147 | 删除: } | |
| 148 | 删除: | |
| 149 | 删除: private void BrowserWatcher_OnSiteChanged(BrowserType browserType, Models.WebPage.Site site) | |
| 150 | 删除: { | |
| 151 | 删除: Debug.WriteLine(site.ToString()); | |
| 152 | 删除: | |
| 153 | 删除: // 过滤URL | |
| 154 | 删除: if (_webFilter.IsIgnore(site.Url)) | |
| 155 | 删除: { | |
| 156 | 删除: Debug.WriteLine($"已被过滤的URL {site.Url}"); | |
| 157 | 删除: return; | |
| 158 | 删除: } | |
| 159 | 删除: //Debug.WriteLine($"域名:{UrlHelper.GetDomain(site.Url)}"); | |
| 160 | 删除: // 更新网页时间 | |
| 161 | 删除: SaveTime(); | |
| 162 | 删除: | |
| 163 | 删除: _activeSite = site; | |
| 164 | 删除: _activeStartTime = DateTime.Now; | |
| 165 | 删除: | |
| 166 | 删除: OnSiteChanged?.Invoke(browserType, site); | |
| 167 | 删除: | |
| 168 | 删除: // 更新网页图标 | |
| 169 | 删除: UpdateFavicon(browserType, site); | |
| 170 | 删除: } | |
| 171 | 删除: | |
| 172 | 删除: | |
| 173 | 删除: #region saveTime | |
| 174 | 删除: private void SaveTime(bool isReset_ = true) | |
| 175 | 删除: { | |
| 176 | 删除: if (_activeSite != null && _activeStartTime != DateTime.MinValue) | |
| 177 | 删除: { | |
| 178 | 删除: SaveTime(new Site(_activeSite), new DateTime(_activeStartTime.Ticks)); | |
| 179 | 删除: | |
| 180 | 删除: if (isReset_) | |
| 181 | 删除: { | |
| 182 | 删除: _activeStartTime = DateTime.MinValue; | |
| 183 | 删除: _activeSite = null; | |
| 184 | 删除: } | |
| 185 | 删除: else | |
| 186 | 删除: { | |
| 187 | 删除: _activeStartTime = DateTime.Now; | |
| 188 | 删除: } | |
| 189 | 删除: } | |
| 190 | 删除: } | |
| 191 | 删除: private void SaveTime(Site site_, DateTime startTime_) | |
| 192 | 删除: { | |
| 193 | 删除: Task.Run(() => | |
| 194 | 删除: { | |
| 195 | 删除: if (!IsTrueURL(site_.Url)) | |
| 196 | 删除: { | |
| 197 | 删除: return; | |
| 198 | 删除: } | |
| 199 | 删除: | |
| 200 | 删除: TimeSpan browseTime = DateTime.Now - startTime_; | |
| 201 | 删除: int seconds = (int)(browseTime.TotalSeconds == 0 ? 1 : browseTime.TotalSeconds); | |
| 202 | 删除: | |
| 203 | 删除: if (seconds > 0) | |
| 204 | 删除: { | |
| 205 | 删除: // 更新到数据库 | |
| 206 | 删除: _webData.AddUrlBrowseTime(site_, seconds, startTime_); | |
| 207 | 删除: Debug.WriteLine($"网页:{site_.Title} 浏览了:{seconds}秒。开始时间:{startTime_}"); | |
| 208 | 删除: } | |
| 209 | 删除: }); | |
| 210 | 删除: } | |
| 211 | 删除: | |
| 212 | 删除: #endregion | |
| 213 | 删除: | |
| 214 | 删除: #region updatefavicon | |
| 215 | 删除: /// <summary> | |
| 216 | 删除: /// 更新获取网页favicon到tai数据库中 | |
| 217 | 删除: /// </summary> | |
| 218 | 删除: /// <param name="browserType"></param> | |
| 219 | 删除: /// <param name="site"></param> | |
| 220 | 删除: private void UpdateFavicon(BrowserType browserType, Models.WebPage.Site site) | |
| 221 | 删除: { | |
| 222 | 删除: if (!IsTrueURL(site.Url)) | |
| 223 | 删除: { | |
| 224 | 删除: return; | |
| 225 | 删除: } | |
| 226 | 删除: | |
| 227 | 删除: if (_savedIconUrls.Contains(site.Url)) | |
| 228 | 删除: { | |
| 229 | 删除: // 已经缓存的链接不再重复获取 | |
| 230 | 删除: return; | |
| 231 | 删除: } | |
| 232 | 删除: | |
| 233 | 删除: if (_savedIconUrls.Count > 100) | |
| 234 | 删除: { | |
| 235 | 删除: // 限制缓存链接条数 | |
| 236 | 删除: _savedIconUrls.RemoveAt(0); | |
| 237 | 删除: } | |
| 238 | 删除: | |
| 239 | 删除: Task.Run(async () => | |
| 240 | 删除: { | |
| 241 | 删除: try | |
| 242 | 删除: { | |
| 243 | 删除: // 获取favicon | |
| 244 | 删除: IFaviconManager fm = null; | |
| 245 | 删除: switch (browserType) | |
| 246 | 删除: { | |
| 247 | 删除: // chrome内核的用同一个图标管理器 | |
| 248 | 删除: case BrowserType.Chrome: | |
| 249 | 删除: case BrowserType.MSEdge: | |
| 250 | 删除: case BrowserType.Vivaldi: | |
| 251 | 删除: fm = new ChromeFaviconManager(browserType); | |
| 252 | 删除: break; | |
| 253 | 删除: } | |
| 254 | 删除: if (fm == null) | |
| 255 | 删除: { | |
| 256 | 删除: throw new Exception("FaviconManager is null!"); | |
| 257 | 删除: } | |
| 258 | 删除: | |
| 259 | 删除: var data = await fm.GetIconDataAsync(site.Url); | |
| 260 | 删除: if (data == null) | |
| 261 | 删除: { | |
| 262 | 删除: // 浏览器可能还没更新缓存,延迟再获取一次 | |
| 263 | 删除: Thread.Sleep(3000); | |
| 264 | 删除: data = await fm.GetIconDataAsync(site.Url); | |
| 265 | 删除: } | |
| 266 | 删除: if (data != null) | |
| 267 | 删除: { | |
| 268 | 删除: // 保存到 tai目录下 | |
| 269 | 删除: string path = await fm.SaveToLocalIconAsync(data); | |
| 270 | 删除: | |
| 271 | 删除: // 更新到数据库 | |
| 272 | 删除: _webData.UpdateUrlFavicon(site, path); | |
| 273 | 删除: | |
| 274 | 删除: _savedIconUrls.Add(site.Url); | |
| 275 | 删除: } | |
| 276 | 删除: else | |
| 277 | 删除: { | |
| 278 | 删除: // 如果无法获取则使用站点图标 | |
| 279 | 删除: string domain = UrlHelper.GetDomain(site.Url); | |
| 280 | 删除: // 读取站点数据 | |
| 281 | 删除: var webSite = _webData.GetWebSite(domain); | |
| 282 | 删除: | |
| 283 | 删除: if (webSite != null) | |
| 284 | 删除: { | |
| 285 | 删除: _webData.UpdateUrlFavicon(site, webSite.IconFile); | |
| 286 | 删除: } | |
| 287 | 删除: } | |
| 288 | 删除: } | |
| 289 | 删除: catch (Exception ex) | |
| 290 | 删除: { | |
| 291 | 删除: Logger.Error(ex.ToString()); | |
| 292 | 删除: } | |
| 293 | 删除: }); | |
| 294 | 删除: | |
| 295 | 删除: | |
| 296 | 删除: } | |
| 297 | 删除: #endregion | |
| 298 | 删除: | |
| 299 | 删除: /// <summary> | |
| 300 | 删除: /// 指示URL是否正确 | |
| 301 | 删除: /// </summary> | |
| 302 | 删除: /// <param name="url"></param> | |
| 303 | 删除: /// <returns></returns> | |
| 304 | 删除: private bool IsTrueURL(string url) | |
| 305 | 删除: { | |
| 306 | 删除: return !string.IsNullOrEmpty(url) && !_ignoreURL.Contains(url); | |
| 307 | 删除: } | |
| 308 | 删除: private void StopWatch() | |
| 309 | 删除: { | |
| 310 | 删除: if (_browserWatcher != null) | |
| 311 | 删除: { | |
| 312 | 删除: _browserWatcher.OnSiteChanged -= BrowserWatcher_OnSiteChanged; | |
| 313 | 删除: _browserWatcher.StopWatch(); | |
| 314 | 删除: _browserWatcher = null; | |
| 315 | 删除: } | |
| 316 | 删除: | |
| 317 | 删除: // 保存时间 | |
| 318 | 删除: SaveTime(); | |
| 319 | 删除: } | |
| 320 | 删除: | |
| 321 | 删除: | |
| 322 | 删除: } | |
| 323 | 删除:} | |
| @@ -1,220 +0,0 @@ | ||
| 1 | 删除:using Core.Enums; | |
| 2 | 删除:using Core.Event; | |
| 3 | 删除:using Core.Librarys; | |
| 4 | 删除:using Core.Librarys.Browser.Favicon; | |
| 5 | 删除:using Core.Models.WebPage; | |
| 6 | 删除:using Core.Servicers.Interfaces; | |
| 7 | 删除:using NPOI.SS.Formula.Functions; | |
| 8 | 删除:using System; | |
| 9 | 删除:using System.Collections.Generic; | |
| 10 | 删除:using System.Data.SQLite; | |
| 11 | 删除:using System.Diagnostics; | |
| 12 | 删除:using System.IO; | |
| 13 | 删除:using System.Linq; | |
| 14 | 删除:using System.Security.Cryptography; | |
| 15 | 删除:using System.Text; | |
| 16 | 删除:using System.Threading.Tasks; | |
| 17 | 删除:using System.Windows.Automation; | |
| 18 | 删除:using System.Windows.Interop; | |
| 19 | 删除:using UIAutomationClient; | |
| 20 | 删除: | |
| 21 | 删除:namespace Core.Servicers.Instances | |
| 22 | 删除:{ | |
| 23 | 删除: public class ChromeBrowserWatch : IBrowserWatcher | |
| 24 | 删除: { | |
| 25 | 删除: public event BrowserObserverEventHandler OnSiteChanged; | |
| 26 | 删除: private string url, title; | |
| 27 | 删除: CUIAutomation automation; | |
| 28 | 删除: // 根元素(监听站点切换使用) | |
| 29 | 删除: IUIAutomationElement rootElement; | |
| 30 | 删除: // 主元素(寻找URL使用) | |
| 31 | 删除: IUIAutomationElement mainElement; | |
| 32 | 删除: // 站点切换事件 | |
| 33 | 删除: AutomationPropertyChangedEventHandler siteChangedEventHandler; | |
| 34 | 删除: | |
| 35 | 删除: public ChromeBrowserWatch() | |
| 36 | 删除: { | |
| 37 | 删除: automation = new CUIAutomation(); | |
| 38 | 删除: siteChangedEventHandler = new AutomationPropertyChangedEventHandler(OnNameChanged); | |
| 39 | 删除: } | |
| 40 | 删除: | |
| 41 | 删除: public void StartWatch(IntPtr handle) | |
| 42 | 删除: { | |
| 43 | 删除: try | |
| 44 | 删除: { | |
| 45 | 删除: if (handle == IntPtr.Zero) | |
| 46 | 删除: { | |
| 47 | 删除: throw new Exception("未传入浏览器句柄"); | |
| 48 | 删除: } | |
| 49 | 删除: | |
| 50 | 删除: Win32API.GetWindowThreadProcessId(handle, out int processID); | |
| 51 | 删除: Process process = Process.GetProcessById(processID); | |
| 52 | 删除: if (process == null) | |
| 53 | 删除: { | |
| 54 | 删除: return; | |
| 55 | 删除: } | |
| 56 | 删除: | |
| 57 | 删除: Debug.WriteLine("启动浏览器监听,目标:" + process.ProcessName); | |
| 58 | 删除: // 搜索根元素 | |
| 59 | 删除: rootElement = automation.ElementFromHandle(handle); | |
| 60 | 删除: if (rootElement == null) | |
| 61 | 删除: { | |
| 62 | 删除: throw new Exception("找不到根元素!"); | |
| 63 | 删除: } | |
| 64 | 删除: // 找到窗口 | |
| 65 | 删除: var condtionPanel = automation.CreatePropertyCondition(30003, 50033); | |
| 66 | 删除: var condtionName = automation.CreatePropertyCondition(30005, "Google Chrome"); | |
| 67 | 删除: var condtionFindWindow = automation.CreateAndCondition(condtionPanel, condtionName); | |
| 68 | 删除: var window = rootElement.FindFirst(TreeScope.TreeScope_Children, condtionFindWindow); | |
| 69 | 删除: if (window != null) | |
| 70 | 删除: { | |
| 71 | 删除: // 第二个窗口 | |
| 72 | 删除: mainElement = window.FindFirst(TreeScope.TreeScope_Children, automation.CreateTrueCondition()); | |
| 73 | 删除: } | |
| 74 | 删除: else | |
| 75 | 删除: { | |
| 76 | 删除: mainElement = rootElement; | |
| 77 | 删除: Debug.WriteLine("没有找到主窗口,使用根元素作为主元素"); | |
| 78 | 删除: } | |
| 79 | 删除: | |
| 80 | 删除: | |
| 81 | 删除: if (mainElement == null) | |
| 82 | 删除: { | |
| 83 | 删除: throw new Exception("找不到主元素!"); | |
| 84 | 删除: } | |
| 85 | 删除: | |
| 86 | 删除: // 注册事件 | |
| 87 | 删除: IUIAutomationCacheRequest cacheRequest = automation.CreateCacheRequest(); | |
| 88 | 删除: cacheRequest.AddProperty(30005); | |
| 89 | 删除: int[] props = { 30005 }; | |
| 90 | 删除: | |
| 91 | 删除: automation.AddPropertyChangedEventHandler(rootElement, TreeScope.TreeScope_Element, cacheRequest, siteChangedEventHandler, props); | |
| 92 | 删除: Debug.WriteLine("启动浏览器监听成功"); | |
| 93 | 删除: | |
| 94 | 删除: Handle(process.MainWindowTitle); | |
| 95 | 删除: } | |
| 96 | 删除: catch (Exception e) | |
| 97 | 删除: { | |
| 98 | 删除: Logger.Error(e.ToString()); | |
| 99 | 删除: } | |
| 100 | 删除: } | |
| 101 | 删除: | |
| 102 | 删除: private void OnNameChanged(IUIAutomationElement s, int p, object v) | |
| 103 | 删除: { | |
| 104 | 删除: Handle(v.ToString()); | |
| 105 | 删除: } | |
| 106 | 删除: | |
| 107 | 删除: #region AutomationPropertyChangedEventHandler | |
| 108 | 删除: private class AutomationPropertyChangedEventHandler : IUIAutomationPropertyChangedEventHandler | |
| 109 | 删除: { | |
| 110 | 删除: public AutomationPropertyChangedEventHandler(Action<IUIAutomationElement, int, object> action) | |
| 111 | 删除: { | |
| 112 | 删除: if (action == null) | |
| 113 | 删除: throw new ArgumentNullException(nameof(action)); | |
| 114 | 删除: | |
| 115 | 删除: Action = action; | |
| 116 | 删除: } | |
| 117 | 删除: | |
| 118 | 删除: public Action<IUIAutomationElement, int, object> Action { get; } | |
| 119 | 删除: public void HandlePropertyChangedEvent(IUIAutomationElement sender, int propertyId, object newValue) => Action(sender, propertyId, newValue); | |
| 120 | 删除: } | |
| 121 | 删除: #endregion | |
| 122 | 删除: | |
| 123 | 删除: public void StopWatch() | |
| 124 | 删除: { | |
| 125 | 删除: try | |
| 126 | 删除: { | |
| 127 | 删除: Debug.WriteLine("已停止浏览器监听"); | |
| 128 | 删除: automation.RemovePropertyChangedEventHandler(rootElement, siteChangedEventHandler); | |
| 129 | 删除: } | |
| 130 | 删除: catch (Exception e) | |
| 131 | 删除: { | |
| 132 | 删除: Logger.Error(e.ToString()); | |
| 133 | 删除: } | |
| 134 | 删除: } | |
| 135 | 删除: | |
| 136 | 删除: private string FormatTitle(string title) | |
| 137 | 删除: { | |
| 138 | 删除: if (string.IsNullOrEmpty(title)) | |
| 139 | 删除: { | |
| 140 | 删除: return title; | |
| 141 | 删除: } | |
| 142 | 删除: int length = title.LastIndexOf('-') - 1; | |
| 143 | 删除: if (length < 1) | |
| 144 | 删除: { | |
| 145 | 删除: length = 1; | |
| 146 | 删除: } | |
| 147 | 删除: | |
| 148 | 删除: return title.Substring(0, length); | |
| 149 | 删除: } | |
| 150 | 删除: | |
| 151 | 删除: private async void Handle(string title) | |
| 152 | 删除: { | |
| 153 | 删除: title = FormatTitle(title); | |
| 154 | 删除: //Debug.WriteLine($"切换标题 {title}"); | |
| 155 | 删除: Site site = null; | |
| 156 | 删除: if (!string.IsNullOrEmpty(title)) | |
| 157 | 删除: { | |
| 158 | 删除: site = SiteCache.Get(title); | |
| 159 | 删除: } | |
| 160 | 删除: | |
| 161 | 删除: if (site == null) | |
| 162 | 删除: { | |
| 163 | 删除: string url = await GetURLSync(); | |
| 164 | 删除: site = new Site() | |
| 165 | 删除: { | |
| 166 | 删除: Url = url, | |
| 167 | 删除: Title = title | |
| 168 | 删除: }; | |
| 169 | 删除: SiteCache.Set(title, url); | |
| 170 | 删除: } | |
| 171 | 删除: | |
| 172 | 删除: ResponseEvent(site.Url, site.Title); | |
| 173 | 删除: } | |
| 174 | 删除: | |
| 175 | 删除: #region 获取浏览器当前URL | |
| 176 | 删除: /// <summary> | |
| 177 | 删除: /// 获取浏览器当前URL | |
| 178 | 删除: /// </summary> | |
| 179 | 删除: /// <returns></returns> | |
| 180 | 删除: private async Task<string> GetURLSync() | |
| 181 | 删除: { | |
| 182 | 删除: return await Task.Run(() => | |
| 183 | 删除: { | |
| 184 | 删除: string result = string.Empty; | |
| 185 | 删除: try | |
| 186 | 删除: { | |
| 187 | 删除: var condtionEdit = automation.CreatePropertyCondition(30003, 50004); | |
| 188 | 删除: var condtionAccessKey = automation.CreatePropertyCondition(30007, "Ctrl+L"); | |
| 189 | 删除: var condtion = automation.CreateAndCondition(condtionEdit, condtionAccessKey); | |
| 190 | 删除: var addressElement = rootElement.FindFirst(TreeScope.TreeScope_Descendants, condtion); | |
| 191 | 删除: if (addressElement != null) | |
| 192 | 删除: { | |
| 193 | 删除: result = ((IUIAutomationValuePattern)addressElement.GetCurrentPattern(10002)).CurrentValue; | |
| 194 | 删除: } | |
| 195 | 删除: } | |
| 196 | 删除: catch (Exception e) | |
| 197 | 删除: { | |
| 198 | 删除: Logger.Error(e.ToString()); | |
| 199 | 删除: } | |
| 200 | 删除: return result; | |
| 201 | 删除: }); | |
| 202 | 删除: | |
| 203 | 删除: } | |
| 204 | 删除: #endregion | |
| 205 | 删除: | |
| 206 | 删除: private void ResponseEvent(string url, string title) | |
| 207 | 删除: { | |
| 208 | 删除: if (url != this.url) | |
| 209 | 删除: { | |
| 210 | 删除: this.url = url; | |
| 211 | 删除: this.title = title; | |
| 212 | 删除: OnSiteChanged?.Invoke(BrowserType.Chrome, new Models.WebPage.Site() | |
| 213 | 删除: { | |
| 214 | 删除: Url = url, | |
| 215 | 删除: Title = title | |
| 216 | 删除: }); | |
| 217 | 删除: } | |
| 218 | 删除: } | |
| 219 | 删除: } | |
| 220 | 删除:} | |
| @@ -1,243 +0,0 @@ | ||
| 1 | 删除:using Core.Enums; | |
| 2 | 删除:using Core.Event; | |
| 3 | 删除:using Core.Librarys; | |
| 4 | 删除:using Core.Librarys.Browser.Favicon; | |
| 5 | 删除:using Core.Models.WebPage; | |
| 6 | 删除:using Core.Servicers.Interfaces; | |
| 7 | 删除:using NPOI.SS.Formula.Functions; | |
| 8 | 删除:using System; | |
| 9 | 删除:using System.Collections.Generic; | |
| 10 | 删除:using System.Data.SQLite; | |
| 11 | 删除:using System.Diagnostics; | |
| 12 | 删除:using System.IO; | |
| 13 | 删除:using System.Linq; | |
| 14 | 删除:using System.Security.Cryptography; | |
| 15 | 删除:using System.Text; | |
| 16 | 删除:using System.Threading.Tasks; | |
| 17 | 删除:using System.Windows.Automation; | |
| 18 | 删除:using System.Windows.Interop; | |
| 19 | 删除:using UIAutomationClient; | |
| 20 | 删除: | |
| 21 | 删除:namespace Core.Servicers.Instances | |
| 22 | 删除:{ | |
| 23 | 删除: public class MSEdgeBrowserWatch : IBrowserWatcher | |
| 24 | 删除: { | |
| 25 | 删除: public event BrowserObserverEventHandler OnSiteChanged; | |
| 26 | 删除: private string url, title; | |
| 27 | 删除: CUIAutomation automation; | |
| 28 | 删除: // 根元素(监听站点切换使用) | |
| 29 | 删除: IUIAutomationElement rootElement; | |
| 30 | 删除: // 主元素(寻找URL使用) | |
| 31 | 删除: IUIAutomationElement mainElement; | |
| 32 | 删除: | |
| 33 | 删除: IntPtr hook; | |
| 34 | 删除: Win32API.WinEventDelegate winEventDelegate; | |
| 35 | 删除: public MSEdgeBrowserWatch() | |
| 36 | 删除: { | |
| 37 | 删除: automation = new CUIAutomation(); | |
| 38 | 删除: winEventDelegate = new Win32API.WinEventDelegate(WinEventProc); | |
| 39 | 删除: } | |
| 40 | 删除: | |
| 41 | 删除: private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) | |
| 42 | 删除: { | |
| 43 | 删除: //Debug.WriteLine("idObject:" + idObject + ",idChild:" + idChild); | |
| 44 | 删除: | |
| 45 | 删除: if (idObject == 0 && idChild == 0) | |
| 46 | 删除: { | |
| 47 | 删除: Debug.WriteLine("切换选项卡 -> " + dwmsEventTime); | |
| 48 | 删除: Handle(); | |
| 49 | 删除: } | |
| 50 | 删除: } | |
| 51 | 删除: | |
| 52 | 删除: public void StartWatch(IntPtr handle) | |
| 53 | 删除: { | |
| 54 | 删除: try | |
| 55 | 删除: { | |
| 56 | 删除: if (handle == IntPtr.Zero) | |
| 57 | 删除: { | |
| 58 | 删除: throw new Exception("未传入浏览器句柄"); | |
| 59 | 删除: } | |
| 60 | 删除: | |
| 61 | 删除: Win32API.GetWindowThreadProcessId(handle, out int processID); | |
| 62 | 删除: Process process = Process.GetProcessById(processID); | |
| 63 | 删除: if (process == null) | |
| 64 | 删除: { | |
| 65 | 删除: return; | |
| 66 | 删除: } | |
| 67 | 删除: | |
| 68 | 删除: Debug.WriteLine("启动浏览器监听,目标:" + process.ProcessName + "," + handle); | |
| 69 | 删除: // 搜索根元素 | |
| 70 | 删除: rootElement = automation.ElementFromHandle(handle); | |
| 71 | 删除: if (rootElement == null) | |
| 72 | 删除: { | |
| 73 | 删除: throw new Exception("找不到根元素!"); | |
| 74 | 删除: } | |
| 75 | 删除: // 找到窗口 | |
| 76 | 删除: var condtionPanel = automation.CreatePropertyCondition(30003, 50033); | |
| 77 | 删除: var condtionName = automation.CreatePropertyCondition(30012, "BrowserRootView"); | |
| 78 | 删除: var condtionFindWindow = automation.CreateAndCondition(condtionPanel, condtionName); | |
| 79 | 删除: var window = rootElement.FindFirst(TreeScope.TreeScope_Children, condtionFindWindow); | |
| 80 | 删除: if (window != null) | |
| 81 | 删除: { | |
| 82 | 删除: // 第二个窗口 | |
| 83 | 删除: mainElement = window.FindFirst(TreeScope.TreeScope_Children, automation.CreateTrueCondition()); | |
| 84 | 删除: } | |
| 85 | 删除: else | |
| 86 | 删除: { | |
| 87 | 删除: mainElement = rootElement; | |
| 88 | 删除: Debug.WriteLine("没有找到主窗口,使用根元素作为主元素"); | |
| 89 | 删除: } | |
| 90 | 删除: | |
| 91 | 删除: | |
| 92 | 删除: if (mainElement == null) | |
| 93 | 删除: { | |
| 94 | 删除: throw new Exception("找不到主元素!"); | |
| 95 | 删除: } | |
| 96 | 删除: | |
| 97 | 删除: // 注册事件 | |
| 98 | 删除: | |
| 99 | 删除: //// 找到窗口 | |
| 100 | 删除: //var condtionTab = automation.CreatePropertyCondition(30003, 50018); | |
| 101 | 删除: //var condtionClassName = automation.CreatePropertyCondition(30012, "TabStripRegionView"); | |
| 102 | 删除: //var tabElement = mainElement.FindFirst(TreeScope.TreeScope_Descendants, automation.CreateAndCondition(condtionTab, condtionClassName)); | |
| 103 | 删除: hook = Win32API.SetWinEventHook(0x800C, 0x800C, handle, winEventDelegate, 0, 0, 0); | |
| 104 | 删除: | |
| 105 | 删除: Debug.WriteLine("启动浏览器监听成功"); | |
| 106 | 删除: | |
| 107 | 删除: Handle(); | |
| 108 | 删除: } | |
| 109 | 删除: catch (Exception e) | |
| 110 | 删除: { | |
| 111 | 删除: Logger.Error(e.ToString()); | |
| 112 | 删除: } | |
| 113 | 删除: } | |
| 114 | 删除: | |
| 115 | 删除: public void StopWatch() | |
| 116 | 删除: { | |
| 117 | 删除: try | |
| 118 | 删除: { | |
| 119 | 删除: Win32API.UnhookWinEvent(hook); | |
| 120 | 删除: Debug.WriteLine("已停止浏览器监听"); | |
| 121 | 删除: } | |
| 122 | 删除: catch (Exception e) | |
| 123 | 删除: { | |
| 124 | 删除: Logger.Error(e.ToString()); | |
| 125 | 删除: } | |
| 126 | 删除: } | |
| 127 | 删除: | |
| 128 | 删除: private string FormatTitle(string title) | |
| 129 | 删除: { | |
| 130 | 删除: if (string.IsNullOrEmpty(title)) | |
| 131 | 删除: { | |
| 132 | 删除: return title; | |
| 133 | 删除: } | |
| 134 | 删除: int length = title.LastIndexOf('-') - 1; | |
| 135 | 删除: if (length < 1) | |
| 136 | 删除: { | |
| 137 | 删除: length = 1; | |
| 138 | 删除: } | |
| 139 | 删除: | |
| 140 | 删除: return title.Substring(0, length); | |
| 141 | 删除: } | |
| 142 | 删除: | |
| 143 | 删除: private async void Handle() | |
| 144 | 删除: { | |
| 145 | 删除: string title = await GetURLTitleSync(); | |
| 146 | 删除: title = FormatTitle(title); | |
| 147 | 删除: Site site = null; | |
| 148 | 删除: if (!string.IsNullOrEmpty(title)) | |
| 149 | 删除: { | |
| 150 | 删除: site = SiteCache.Get(title); | |
| 151 | 删除: } | |
| 152 | 删除: | |
| 153 | 删除: if (site == null) | |
| 154 | 删除: { | |
| 155 | 删除: string url = await GetURLSync(); | |
| 156 | 删除: site = new Site() | |
| 157 | 删除: { | |
| 158 | 删除: Url = url, | |
| 159 | 删除: Title = title | |
| 160 | 删除: }; | |
| 161 | 删除: SiteCache.Set(title, url); | |
| 162 | 删除: } | |
| 163 | 删除: | |
| 164 | 删除: ResponseEvent(site.Url, site.Title); | |
| 165 | 删除: } | |
| 166 | 删除: | |
| 167 | 删除: #region 获取浏览器当前URL | |
| 168 | 删除: /// <summary> | |
| 169 | 删除: /// 获取浏览器当前URL | |
| 170 | 删除: /// </summary> | |
| 171 | 删除: /// <returns></returns> | |
| 172 | 删除: private async Task<string> GetURLSync() | |
| 173 | 删除: { | |
| 174 | 删除: return await Task.Run(() => | |
| 175 | 删除: { | |
| 176 | 删除: string result = string.Empty; | |
| 177 | 删除: try | |
| 178 | 删除: { | |
| 179 | 删除: var condtionEdit = automation.CreatePropertyCondition(30003, 50004); | |
| 180 | 删除: var condtionAccessKey = automation.CreatePropertyCondition(30006, "Ctrl+L"); | |
| 181 | 删除: var condtion = automation.CreateAndCondition(condtionEdit, condtionAccessKey); | |
| 182 | 删除: var addressElement = rootElement.FindFirst(TreeScope.TreeScope_Descendants, condtion); | |
| 183 | 删除: if (addressElement != null) | |
| 184 | 删除: { | |
| 185 | 删除: result = ((IUIAutomationValuePattern)addressElement.GetCurrentPattern(10002)).CurrentValue; | |
| 186 | 删除: } | |
| 187 | 删除: } | |
| 188 | 删除: catch (Exception e) | |
| 189 | 删除: { | |
| 190 | 删除: Logger.Error(e.ToString()); | |
| 191 | 删除: } | |
| 192 | 删除: return result; | |
| 193 | 删除: }); | |
| 194 | 删除: | |
| 195 | 删除: } | |
| 196 | 删除: #endregion | |
| 197 | 删除: | |
| 198 | 删除: #region 获取浏览器当前网页标题 | |
| 199 | 删除: /// <summary> | |
| 200 | 删除: /// 获取浏览器当前网页标题 | |
| 201 | 删除: /// </summary> | |
| 202 | 删除: /// <returns></returns> | |
| 203 | 删除: private async Task<string> GetURLTitleSync() | |
| 204 | 删除: { | |
| 205 | 删除: return await Task.Run(() => | |
| 206 | 删除: { | |
| 207 | 删除: string result = string.Empty; | |
| 208 | 删除: try | |
| 209 | 删除: { | |
| 210 | 删除: var condtionEdit = automation.CreatePropertyCondition(30003, 50033); | |
| 211 | 删除: var condtionCN = automation.CreatePropertyCondition(30012, "BrowserRootView"); | |
| 212 | 删除: var condtion = automation.CreateAndCondition(condtionEdit, condtionCN); | |
| 213 | 删除: var element = rootElement.FindFirst(TreeScope.TreeScope_Descendants, condtion); | |
| 214 | 删除: if (element != null) | |
| 215 | 删除: { | |
| 216 | 删除: result = element.GetCurrentPropertyValue(30005); | |
| 217 | 删除: } | |
| 218 | 删除: } | |
| 219 | 删除: catch (Exception e) | |
| 220 | 删除: { | |
| 221 | 删除: Logger.Error(e.ToString()); | |
| 222 | 删除: } | |
| 223 | 删除: return result; | |
| 224 | 删除: }); | |
| 225 | 删除: | |
| 226 | 删除: } | |
| 227 | 删除: #endregion | |
| 228 | 删除: | |
| 229 | 删除: private void ResponseEvent(string url, string title) | |
| 230 | 删除: { | |
| 231 | 删除: if (url != this.url) | |
| 232 | 删除: { | |
| 233 | 删除: this.url = url; | |
| 234 | 删除: this.title = title; | |
| 235 | 删除: OnSiteChanged?.Invoke(BrowserType.MSEdge, new Models.WebPage.Site() | |
| 236 | 删除: { | |
| 237 | 删除: Url = url, | |
| 238 | 删除: Title = title | |
| 239 | 删除: }); | |
| 240 | 删除: } | |
| 241 | 删除: } | |
| 242 | 删除: } | |
| 243 | 删除:} | |
| @@ -1,6 +1,8 @@ | ||
| 1 | 1 | using Core.Enums; |
| 2 | 2 | using Core.Event; |
| 3 | 3 | using Core.Librarys; |
| 4 | 新增:using Core.Librarys.Browser; | |
| 5 | 新增:using Core.Librarys.Browser.Favicon; | |
| 4 | 6 | using Core.Librarys.SQLite; |
| 5 | 7 | using Core.Models; |
| 6 | 8 | using Core.Models.Config; |
| @@ -10,10 +12,13 @@ using System; | ||
| 10 | 12 | using System.Collections.Generic; |
| 11 | 13 | using System.Data.Entity; |
| 12 | 14 | using System.Diagnostics; |
| 15 | 新增:using System.Drawing; | |
| 13 | 16 | using System.IO; |
| 14 | 17 | using System.Linq; |
| 18 | 新增:using System.Security.Cryptography; | |
| 15 | 19 | using System.Text; |
| 16 | 20 | using System.Text.RegularExpressions; |
| 21 | 新增:using System.Threading; | |
| 17 | 22 | using System.Threading.Tasks; |
| 18 | 23 | using System.Timers; |
| 19 | 24 | using System.Windows.Threading; |
| @@ -31,6 +36,7 @@ namespace Core.Servicers.Instances | ||
| 31 | 36 | private readonly IWebFilter _webFilter; |
| 32 | 37 | private readonly IAppTimerServicer _appTimer; |
| 33 | 38 | private readonly IWebServer _webServer; |
| 39 | 新增: private readonly IWebData _webData; | |
| 34 | 40 | // 忽略的进程 |
| 35 | 41 | private readonly string[] DefaultIgnoreProcess = new string[] { |
| 36 | 42 | "Tai", |
| @@ -84,8 +90,9 @@ namespace Core.Servicers.Instances | ||
| 84 | 90 | IDateTimeObserver dateTimeObserver, |
| 85 | 91 | IAppData appData, ICategorys categories, |
| 86 | 92 | IWebFilter webFilter_, |
| 87 | 删除: IAppTimerServicer appTimer_, | |
| 88 | 删除: IWebServer webServer_) | |
| 93 | 新增: IAppTimerServicer appTimer_, | |
| 94 | 新增: IWebServer webServer_, | |
| 95 | 新增: IWebData webData_) | |
| 89 | 96 | { |
| 90 | 97 | this.appObserver = appObserver; |
| 91 | 98 | this.data = data; |
| @@ -96,6 +103,7 @@ namespace Core.Servicers.Instances | ||
| 96 | 103 | _webFilter = webFilter_; |
| 97 | 104 | _appTimer = appTimer_; |
| 98 | 105 | _webServer = webServer_; |
| 106 | 新增: _webData = webData_; | |
| 99 | 107 | |
| 100 | 108 | IgnoreProcessCacheList = new List<string>(); |
| 101 | 109 | ConfigIgnoreProcessRegxList = new List<string>(); |
| @@ -104,6 +112,7 @@ namespace Core.Servicers.Instances | ||
| 104 | 112 | sleepdiscover.SleepStatusChanged += Sleepdiscover_SleepStatusChanged; |
| 105 | 113 | appConfig.ConfigChanged += AppConfig_ConfigChanged; |
| 106 | 114 | _appTimer.OnAppDurationUpdated += _appTimer_OnAppDurationUpdated; |
| 115 | 新增: WebSocketEvent.OnWebLog += WebSocketEvent_OnWebLog; | |
| 107 | 116 | } |
| 108 | 117 | |
| 109 | 118 | private void AppConfig_ConfigChanged(ConfigModel oldConfig, ConfigModel newConfig) |
| @@ -167,7 +176,10 @@ namespace Core.Servicers.Instances | ||
| 167 | 176 | // appTimer必须比Observer先启动* |
| 168 | 177 | _appTimer.Start(); |
| 169 | 178 | appObserver.Start(); |
| 170 | 删除: _webServer.Start(); | |
| 179 | 新增: if (config.General.IsWebEnabled) | |
| 180 | 新增: { | |
| 181 | 新增: _webServer.Start(); | |
| 182 | 新增: } | |
| 171 | 183 | } |
| 172 | 184 | public void Stop() |
| 173 | 185 | { |
| @@ -218,6 +230,8 @@ namespace Core.Servicers.Instances | ||
| 218 | 230 | // 进入睡眠状态 |
| 219 | 231 | Debug.WriteLine("进入睡眠状态"); |
| 220 | 232 | |
| 233 | 新增: // 通知sokcet客户端 | |
| 234 | 新增: _webServer.SendMsg("sleep"); | |
| 221 | 235 | // 停止服务 |
| 222 | 236 | Stop(); |
| 223 | 237 | |
| @@ -228,6 +242,9 @@ namespace Core.Servicers.Instances | ||
| 228 | 242 | { |
| 229 | 243 | // 从睡眠状态唤醒 |
| 230 | 244 | Debug.WriteLine("从睡眠状态唤醒"); |
| 245 | 新增: | |
| 246 | 新增: _webServer.SendMsg("wake"); | |
| 247 | 新增: | |
| 231 | 248 | Start(); |
| 232 | 249 | } |
| 233 | 250 | } |
| @@ -369,6 +386,15 @@ namespace Core.Servicers.Instances | ||
| 369 | 386 | { |
| 370 | 387 | return; |
| 371 | 388 | } |
| 389 | 新增: | |
| 390 | 新增: if (config.General.IsWebEnabled) | |
| 391 | 新增: { | |
| 392 | 新增: _webServer.Start(); | |
| 393 | 新增: } | |
| 394 | 新增: else | |
| 395 | 新增: { | |
| 396 | 新增: _webServer.Stop(); | |
| 397 | 新增: } | |
| 372 | 398 | } |
| 373 | 399 | #endregion |
| 374 | 400 | |
| @@ -400,5 +426,33 @@ namespace Core.Servicers.Instances | ||
| 400 | 426 | } |
| 401 | 427 | } |
| 402 | 428 | |
| 429 | 新增: #region 浏览器记录 | |
| 430 | 新增: private void WebSocketEvent_OnWebLog(Models.WebPage.NotifyWeb args) | |
| 431 | 新增: { | |
| 432 | 新增: if (_webFilter.IsIgnore(args.Url)) | |
| 433 | 新增: { | |
| 434 | 新增: Debug.WriteLine($"URL已被过滤,{args.Url}"); | |
| 435 | 新增: return; | |
| 436 | 新增: } | |
| 437 | 新增: | |
| 438 | 新增: // 记录数据 | |
| 439 | 新增: var site = new Models.WebPage.Site() | |
| 440 | 新增: { | |
| 441 | 新增: Url = args.Url, | |
| 442 | 新增: Title = args.Title | |
| 443 | 新增: }; | |
| 444 | 新增: | |
| 445 | 新增: _webData.AddUrlBrowseTime(site, args.Duration, args.ActiveDateTime); | |
| 446 | 新增: | |
| 447 | 新增: // 处理图标 | |
| 448 | 新增: Task.Run(async () => | |
| 449 | 新增: { | |
| 450 | 新增: string saveName = UrlHelper.GetName(args.Url) + DateTime.Now.ToString("yyyyMM") + ".ico"; | |
| 451 | 新增: string path = await FaviconDownloader.DownloadAsync(args.Icon, saveName); | |
| 452 | 新增: _webData.UpdateUrlFavicon(site, path); | |
| 453 | 新增: }); | |
| 454 | 新增: | |
| 455 | 新增: } | |
| 456 | 新增: #endregion | |
| 403 | 457 | } |
| 404 | 458 | } |
| @@ -73,6 +73,7 @@ namespace Core.Servicers.Instances | ||
| 73 | 73 | StopTimer(); |
| 74 | 74 | timer = new DispatcherTimer(); |
| 75 | 75 | timer.Interval = new TimeSpan(0, 0, 10); |
| 76 | 新增: //timer.Interval = new TimeSpan(0, 5, 0); | |
| 76 | 77 | timer.Tick += Timer_Tick; |
| 77 | 78 | timer.Start(); |
| 78 | 79 | } |
| @@ -223,6 +224,7 @@ namespace Core.Servicers.Instances | ||
| 223 | 224 | |
| 224 | 225 | private async void Timer_Tick(object sender, EventArgs e) |
| 225 | 226 | { |
| 227 | 新增: Debug.WriteLine("检测"); | |
| 226 | 228 | timer.Stop(); |
| 227 | 229 | bool isSleep = await IsSleepAsync(); |
| 228 | 230 | if (isSleep) |
| @@ -369,7 +371,7 @@ namespace Core.Servicers.Instances | ||
| 369 | 371 | { |
| 370 | 372 | TimeSpan timeSpan = DateTime.Now - pressKeyboardLastTime; |
| 371 | 373 | #if DEBUG |
| 372 | 删除: //return timeSpan.TotalSeconds >= 10; | |
| 374 | 新增: return timeSpan.TotalSeconds >= 10; | |
| 373 | 375 | #endif |
| 374 | 376 | return timeSpan.TotalMinutes >= 10; |
| 375 | 377 | } |
| @@ -1,219 +0,0 @@ | ||
| 1 | 删除:using Core.Enums; | |
| 2 | 删除:using Core.Event; | |
| 3 | 删除:using Core.Librarys; | |
| 4 | 删除:using Core.Librarys.Browser.Favicon; | |
| 5 | 删除:using Core.Models.WebPage; | |
| 6 | 删除:using Core.Servicers.Interfaces; | |
| 7 | 删除:using NPOI.SS.Formula.Functions; | |
| 8 | 删除:using System; | |
| 9 | 删除:using System.Collections.Generic; | |
| 10 | 删除:using System.Data.SQLite; | |
| 11 | 删除:using System.Diagnostics; | |
| 12 | 删除:using System.IO; | |
| 13 | 删除:using System.Linq; | |
| 14 | 删除:using System.Security.Cryptography; | |
| 15 | 删除:using System.Text; | |
| 16 | 删除:using System.Threading.Tasks; | |
| 17 | 删除:using System.Windows.Automation; | |
| 18 | 删除:using System.Windows.Interop; | |
| 19 | 删除:using UIAutomationClient; | |
| 20 | 删除: | |
| 21 | 删除:namespace Core.Servicers.Instances | |
| 22 | 删除:{ | |
| 23 | 删除: public class VivaldiBrowserWatch : IBrowserWatcher | |
| 24 | 删除: { | |
| 25 | 删除: public event BrowserObserverEventHandler OnSiteChanged; | |
| 26 | 删除: private string url, title; | |
| 27 | 删除: CUIAutomation automation; | |
| 28 | 删除: // 根元素(监听站点切换使用) | |
| 29 | 删除: IUIAutomationElement rootElement; | |
| 30 | 删除: // 主元素(寻找URL使用) | |
| 31 | 删除: IUIAutomationElement mainElement; | |
| 32 | 删除: // 站点切换事件 | |
| 33 | 删除: AutomationPropertyChangedEventHandler siteChangedEventHandler; | |
| 34 | 删除: | |
| 35 | 删除: public VivaldiBrowserWatch() | |
| 36 | 删除: { | |
| 37 | 删除: automation = new CUIAutomation(); | |
| 38 | 删除: siteChangedEventHandler = new AutomationPropertyChangedEventHandler(OnNameChanged); | |
| 39 | 删除: } | |
| 40 | 删除: | |
| 41 | 删除: public void StartWatch(IntPtr handle) | |
| 42 | 删除: { | |
| 43 | 删除: try | |
| 44 | 删除: { | |
| 45 | 删除: if (handle == IntPtr.Zero) | |
| 46 | 删除: { | |
| 47 | 删除: throw new Exception("未传入浏览器句柄"); | |
| 48 | 删除: } | |
| 49 | 删除: | |
| 50 | 删除: Win32API.GetWindowThreadProcessId(handle, out int processID); | |
| 51 | 删除: Process process = Process.GetProcessById(processID); | |
| 52 | 删除: if (process == null) | |
| 53 | 删除: { | |
| 54 | 删除: return; | |
| 55 | 删除: } | |
| 56 | 删除: | |
| 57 | 删除: Debug.WriteLine("启动浏览器监听,目标:" + process.ProcessName); | |
| 58 | 删除: // 搜索根元素 | |
| 59 | 删除: rootElement = automation.ElementFromHandle(handle); | |
| 60 | 删除: if (rootElement == null) | |
| 61 | 删除: { | |
| 62 | 删除: throw new Exception("找不到根元素!"); | |
| 63 | 删除: } | |
| 64 | 删除: // 找到窗口 | |
| 65 | 删除: var condtionPanel = automation.CreatePropertyCondition(30003, 50033); | |
| 66 | 删除: var condtionName = automation.CreatePropertyCondition(30005, "Chrome_WidgetWin_1"); | |
| 67 | 删除: var condtionFindWindow = automation.CreateAndCondition(condtionPanel, condtionName); | |
| 68 | 删除: var window = rootElement.FindFirst(TreeScope.TreeScope_Children, condtionFindWindow); | |
| 69 | 删除: if (window != null) | |
| 70 | 删除: { | |
| 71 | 删除: // 第二个窗口 | |
| 72 | 删除: mainElement = window.FindFirst(TreeScope.TreeScope_Children, automation.CreateTrueCondition()); | |
| 73 | 删除: } | |
| 74 | 删除: else | |
| 75 | 删除: { | |
| 76 | 删除: mainElement = rootElement; | |
| 77 | 删除: Debug.WriteLine("没有找到主窗口,使用根元素作为主元素"); | |
| 78 | 删除: } | |
| 79 | 删除: | |
| 80 | 删除: | |
| 81 | 删除: if (mainElement == null) | |
| 82 | 删除: { | |
| 83 | 删除: throw new Exception("找不到主元素!"); | |
| 84 | 删除: } | |
| 85 | 删除: | |
| 86 | 删除: // 注册事件 | |
| 87 | 删除: IUIAutomationCacheRequest cacheRequest = automation.CreateCacheRequest(); | |
| 88 | 删除: cacheRequest.AddProperty(30005); | |
| 89 | 删除: int[] props = { 30005 }; | |
| 90 | 删除: | |
| 91 | 删除: automation.AddPropertyChangedEventHandler(rootElement, TreeScope.TreeScope_Element, cacheRequest, siteChangedEventHandler, props); | |
| 92 | 删除: Debug.WriteLine("启动浏览器监听成功"); | |
| 93 | 删除: | |
| 94 | 删除: Handle(process.MainWindowTitle); | |
| 95 | 删除: } | |
| 96 | 删除: catch (Exception e) | |
| 97 | 删除: { | |
| 98 | 删除: Logger.Error(e.ToString()); | |
| 99 | 删除: } | |
| 100 | 删除: } | |
| 101 | 删除: | |
| 102 | 删除: private void OnNameChanged(IUIAutomationElement s, int p, object v) | |
| 103 | 删除: { | |
| 104 | 删除: Handle(v.ToString()); | |
| 105 | 删除: } | |
| 106 | 删除: | |
| 107 | 删除: #region AutomationPropertyChangedEventHandler | |
| 108 | 删除: private class AutomationPropertyChangedEventHandler : IUIAutomationPropertyChangedEventHandler | |
| 109 | 删除: { | |
| 110 | 删除: public AutomationPropertyChangedEventHandler(Action<IUIAutomationElement, int, object> action) | |
| 111 | 删除: { | |
| 112 | 删除: if (action == null) | |
| 113 | 删除: throw new ArgumentNullException(nameof(action)); | |
| 114 | 删除: | |
| 115 | 删除: Action = action; | |
| 116 | 删除: } | |
| 117 | 删除: | |
| 118 | 删除: public Action<IUIAutomationElement, int, object> Action { get; } | |
| 119 | 删除: public void HandlePropertyChangedEvent(IUIAutomationElement sender, int propertyId, object newValue) => Action(sender, propertyId, newValue); | |
| 120 | 删除: } | |
| 121 | 删除: #endregion | |
| 122 | 删除: | |
| 123 | 删除: public void StopWatch() | |
| 124 | 删除: { | |
| 125 | 删除: try | |
| 126 | 删除: { | |
| 127 | 删除: Debug.WriteLine("已停止浏览器监听"); | |
| 128 | 删除: automation.RemovePropertyChangedEventHandler(rootElement, siteChangedEventHandler); | |
| 129 | 删除: } | |
| 130 | 删除: catch (Exception e) | |
| 131 | 删除: { | |
| 132 | 删除: Logger.Error(e.ToString()); | |
| 133 | 删除: } | |
| 134 | 删除: } | |
| 135 | 删除: | |
| 136 | 删除: private string FormatTitle(string title) | |
| 137 | 删除: { | |
| 138 | 删除: if (string.IsNullOrEmpty(title)) | |
| 139 | 删除: { | |
| 140 | 删除: return title; | |
| 141 | 删除: } | |
| 142 | 删除: int length = title.LastIndexOf('-') - 1; | |
| 143 | 删除: if (length < 1) | |
| 144 | 删除: { | |
| 145 | 删除: length = 1; | |
| 146 | 删除: } | |
| 147 | 删除: | |
| 148 | 删除: return title.Substring(0, length); | |
| 149 | 删除: } | |
| 150 | 删除: | |
| 151 | 删除: private async void Handle(string title) | |
| 152 | 删除: { | |
| 153 | 删除: title = FormatTitle(title); | |
| 154 | 删除: //Debug.WriteLine($"切换标题 {title}"); | |
| 155 | 删除: Site site = null; | |
| 156 | 删除: if (!string.IsNullOrEmpty(title)) | |
| 157 | 删除: { | |
| 158 | 删除: site = SiteCache.Get(title); | |
| 159 | 删除: } | |
| 160 | 删除: | |
| 161 | 删除: if (site == null) | |
| 162 | 删除: { | |
| 163 | 删除: string url = await GetURLSync(); | |
| 164 | 删除: site = new Site() | |
| 165 | 删除: { | |
| 166 | 删除: Url = url, | |
| 167 | 删除: Title = title | |
| 168 | 删除: }; | |
| 169 | 删除: SiteCache.Set(title, url); | |
| 170 | 删除: } | |
| 171 | 删除: | |
| 172 | 删除: ResponseEvent(site.Url, site.Title); | |
| 173 | 删除: } | |
| 174 | 删除: | |
| 175 | 删除: #region 获取浏览器当前URL | |
| 176 | 删除: /// <summary> | |
| 177 | 删除: /// 获取浏览器当前URL | |
| 178 | 删除: /// </summary> | |
| 179 | 删除: /// <returns></returns> | |
| 180 | 删除: private async Task<string> GetURLSync() | |
| 181 | 删除: { | |
| 182 | 删除: return await Task.Run(() => | |
| 183 | 删除: { | |
| 184 | 删除: string result = string.Empty; | |
| 185 | 删除: try | |
| 186 | 删除: { | |
| 187 | 删除: var condtionEdit = automation.CreatePropertyCondition(30003, 50004); | |
| 188 | 删除: var condtionName = automation.CreatePropertyCondition(30011, "urlFieldInput"); | |
| 189 | 删除: var addressElement = rootElement.FindFirst(TreeScope.TreeScope_Subtree, condtionName); | |
| 190 | 删除: if (addressElement != null) | |
| 191 | 删除: { | |
| 192 | 删除: result = ((IUIAutomationValuePattern)addressElement.GetCurrentPattern(10002)).CurrentValue; | |
| 193 | 删除: } | |
| 194 | 删除: } | |
| 195 | 删除: catch (Exception e) | |
| 196 | 删除: { | |
| 197 | 删除: Logger.Error(e.ToString()); | |
| 198 | 删除: } | |
| 199 | 删除: return result; | |
| 200 | 删除: }); | |
| 201 | 删除: | |
| 202 | 删除: } | |
| 203 | 删除: #endregion | |
| 204 | 删除: | |
| 205 | 删除: private void ResponseEvent(string url, string title) | |
| 206 | 删除: { | |
| 207 | 删除: if (url != this.url) | |
| 208 | 删除: { | |
| 209 | 删除: this.url = url; | |
| 210 | 删除: this.title = title; | |
| 211 | 删除: OnSiteChanged?.Invoke(BrowserType.Vivaldi, new Models.WebPage.Site() | |
| 212 | 删除: { | |
| 213 | 删除: Url = url, | |
| 214 | 删除: Title = title | |
| 215 | 删除: }); | |
| 216 | 删除: } | |
| 217 | 删除: } | |
| 218 | 删除: } | |
| 219 | 删除:} | |
| @@ -15,7 +15,7 @@ namespace Core.Servicers.Instances | ||
| 15 | 15 | private readonly IAppConfig _appConfig; |
| 16 | 16 | private List<string> _ignoreURLCache; |
| 17 | 17 | // 默认忽略的规则 |
| 18 | 删除: private readonly string[] _ignoreRegexArr = { "^chrome://(.*)", "^edge://(.*)" }; | |
| 18 | 新增: private readonly string[] _ignoreRegexArr = { "^chrome://(.*)", "^edge://(.*)", "^view-source:(.*)" }; | |
| 19 | 19 | public WebFilter(IAppConfig appConfig_) |
| 20 | 20 | { |
| 21 | 21 | _appConfig = appConfig_; |
| @@ -37,6 +37,11 @@ namespace Core.Servicers.Instances | ||
| 37 | 37 | |
| 38 | 38 | public bool IsIgnore(string url_) |
| 39 | 39 | { |
| 40 | 新增: if (string.IsNullOrEmpty(url_)) | |
| 41 | 新增: { | |
| 42 | 新增: return true; | |
| 43 | 新增: } | |
| 44 | 新增: | |
| 40 | 45 | if (_ignoreURLCache.Contains(url_)) |
| 41 | 46 | { |
| 42 | 47 | return true; |
| @@ -0,0 +1,58 @@ | ||
| 1 | 新增:using Core.Event; | |
| 2 | 新增:using Core.Librarys.Browser; | |
| 3 | 新增:using Core.Models.WebPage; | |
| 4 | 新增:using Core.Servicers.Interfaces; | |
| 5 | 新增:using Newtonsoft.Json; | |
| 6 | 新增:using System; | |
| 7 | 新增:using System.Collections.Generic; | |
| 8 | 新增:using System.Diagnostics; | |
| 9 | 新增:using System.Linq; | |
| 10 | 新增:using System.Net; | |
| 11 | 新增:using System.Text; | |
| 12 | 新增:using System.Threading.Tasks; | |
| 13 | 新增:using WebSocketSharp; | |
| 14 | 新增:using WebSocketSharp.Server; | |
| 15 | 新增: | |
| 16 | 新增:namespace Core.Servicers.Instances | |
| 17 | 新增:{ | |
| 18 | 新增: public class WebServer : WebSocketBehavior, IWebServer | |
| 19 | 新增: { | |
| 20 | 新增: private WebSocketServer _webSocket; | |
| 21 | 新增: private bool _isStart = false; | |
| 22 | 新增: | |
| 23 | 新增: public void Start() | |
| 24 | 新增: { | |
| 25 | 新增: if (_isStart) return; | |
| 26 | 新增: _webSocket = new WebSocketServer(8908, false); | |
| 27 | 新增: _webSocket.AddWebSocketService<WebServer>("/TaiWebSentry"); | |
| 28 | 新增: _webSocket.Start(); | |
| 29 | 新增: _isStart = true; | |
| 30 | 新增: } | |
| 31 | 新增: | |
| 32 | 新增: public void Stop() | |
| 33 | 新增: { | |
| 34 | 新增: if (!_isStart) return; | |
| 35 | 新增: _webSocket.Stop(); | |
| 36 | 新增: _isStart = false; | |
| 37 | 新增: } | |
| 38 | 新增: | |
| 39 | 新增: public void SendMsg(string msg_) | |
| 40 | 新增: { | |
| 41 | 新增: _webSocket.WebSocketServices.Broadcast(msg_); | |
| 42 | 新增: } | |
| 43 | 新增: | |
| 44 | 新增: | |
| 45 | 新增: protected override void OnMessage(MessageEventArgs e) | |
| 46 | 新增: { | |
| 47 | 新增: try | |
| 48 | 新增: { | |
| 49 | 新增: var log = JsonConvert.DeserializeObject<NotifyWeb>(e.Data); | |
| 50 | 新增: WebSocketEvent.Invoke(log); | |
| 51 | 新增: } | |
| 52 | 新增: catch | |
| 53 | 新增: { | |
| 54 | 新增: | |
| 55 | 新增: } | |
| 56 | 新增: } | |
| 57 | 新增: } | |
| 58 | 新增:} | |
| @@ -1,29 +0,0 @@ | ||
| 1 | 删除:using Core.Event; | |
| 2 | 删除:using System; | |
| 3 | 删除:using System.Collections.Generic; | |
| 4 | 删除:using System.Linq; | |
| 5 | 删除:using System.Text; | |
| 6 | 删除:using System.Threading.Tasks; | |
| 7 | 删除: | |
| 8 | 删除:namespace Core.Servicers.Interfaces | |
| 9 | 删除:{ | |
| 10 | 删除: /// <summary> | |
| 11 | 删除: /// 浏览器观察服务 | |
| 12 | 删除: /// </summary> | |
| 13 | 删除: public interface IBrowserObserver | |
| 14 | 删除: { | |
| 15 | 删除: /// <summary> | |
| 16 | 删除: /// 启动观察 | |
| 17 | 删除: /// </summary> | |
| 18 | 删除: void Start(); | |
| 19 | 删除: /// <summary> | |
| 20 | 删除: /// 停止观察 | |
| 21 | 删除: /// </summary> | |
| 22 | 删除: void Stop(); | |
| 23 | 删除: | |
| 24 | 删除: /// <summary> | |
| 25 | 删除: /// 站点切换时发生 | |
| 26 | 删除: /// </summary> | |
| 27 | 删除: event BrowserObserverEventHandler OnSiteChanged; | |
| 28 | 删除: } | |
| 29 | 删除:} | |
| @@ -7,10 +7,10 @@ using System.Threading.Tasks; | ||
| 7 | 7 | |
| 8 | 8 | namespace Core.Servicers.Interfaces |
| 9 | 9 | { |
| 10 | 删除: public interface IBrowserWatcher | |
| 10 | 新增: public interface IWebServer | |
| 11 | 11 | { |
| 12 | 删除: event BrowserObserverEventHandler OnSiteChanged; | |
| 13 | 删除: void StartWatch(IntPtr handle); | |
| 14 | 删除: void StopWatch(); | |
| 12 | 新增: void Start(); | |
| 13 | 新增: void Stop(); | |
| 14 | 新增: void SendMsg(string msg_); | |
| 15 | 15 | } |
| 16 | 16 | } |
| @@ -20,4 +20,5 @@ | ||
| 20 | 20 | <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net461" /> |
| 21 | 21 | <package id="System.ValueTuple" version="4.3.0" targetFramework="net461" /> |
| 22 | 22 | <package id="TaskScheduler" version="2.10.1" targetFramework="net461" /> |
| 23 | 新增: <package id="WebSocketSharp" version="1.0.3-rc11" targetFramework="net461" /> | |
| 23 | 24 | </packages> |
| 文件末尾没有换行 | ||
| @@ -1,6 +1,6 @@ | ||
| 1 | 删除:<?xml version="1.0" encoding="utf-8" ?> | |
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 2 | <configuration> |
| 3 | 3 | <startup> |
| 4 | 删除: <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> | |
| 4 | 新增: <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/> | |
| 5 | 5 | </startup> |
| 6 | 删除:</configuration> | |
| 文件末尾没有换行 | ||
| 6 | 新增:</configuration> | |
| @@ -1,69 +1,61 @@ | ||
| 1 | 1 | //------------------------------------------------------------------------------ |
| 2 | 2 | // <auto-generated> |
| 3 | 3 | // 此代码由工具生成。 |
| 4 | 删除:// 运行时版本: 4.0.30319.42000 | |
| 4 | 新增:// 运行时版本:4.0.30319.42000 | |
| 5 | 5 | // |
| 6 | 删除:// 对此文件的更改可能导致不正确的行为,如果 | |
| 7 | 删除:// 重新生成代码,则所做更改将丢失。 | |
| 6 | 新增:// 对此文件的更改可能会导致不正确的行为,并且如果 | |
| 7 | 新增:// 重新生成代码,这些更改将会丢失。 | |
| 8 | 8 | // </auto-generated> |
| 9 | 9 | //------------------------------------------------------------------------------ |
| 10 | 10 | |
| 11 | 删除:namespace TaiBug.Properties | |
| 12 | 删除:{ | |
| 13 | 删除: | |
| 14 | 删除: | |
| 11 | 新增:namespace TaiBug.Properties { | |
| 12 | 新增: using System; | |
| 13 | 新增: | |
| 14 | 新增: | |
| 15 | 15 | /// <summary> |
| 16 | 删除: /// 强类型资源类,用于查找本地化字符串等。 | |
| 16 | 新增: /// 一个强类型的资源类,用于查找本地化的字符串等。 | |
| 17 | 17 | /// </summary> |
| 18 | 18 | // 此类是由 StronglyTypedResourceBuilder |
| 19 | 19 | // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 |
| 20 | 删除: // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen | |
| 20 | 新增: // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen | |
| 21 | 21 | // (以 /str 作为命令选项),或重新生成 VS 项目。 |
| 22 | 删除: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] | |
| 22 | 新增: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] | |
| 23 | 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] |
| 24 | 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
| 25 | 删除: internal class Resources | |
| 26 | 删除: { | |
| 27 | 删除: | |
| 25 | 新增: internal class Resources { | |
| 26 | 新增: | |
| 28 | 27 | private static global::System.Resources.ResourceManager resourceMan; |
| 29 | 删除: | |
| 28 | 新增: | |
| 30 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; |
| 31 | 删除: | |
| 30 | 新增: | |
| 32 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] |
| 33 | 删除: internal Resources() | |
| 34 | 删除: { | |
| 32 | 新增: internal Resources() { | |
| 35 | 33 | } |
| 36 | 删除: | |
| 34 | 新增: | |
| 37 | 35 | /// <summary> |
| 38 | 删除: /// 返回此类使用的缓存 ResourceManager 实例。 | |
| 36 | 新增: /// 返回此类使用的缓存的 ResourceManager 实例。 | |
| 39 | 37 | /// </summary> |
| 40 | 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
| 41 | 删除: internal static global::System.Resources.ResourceManager ResourceManager | |
| 42 | 删除: { | |
| 43 | 删除: get | |
| 44 | 删除: { | |
| 45 | 删除: if ((resourceMan == null)) | |
| 46 | 删除: { | |
| 39 | 新增: internal static global::System.Resources.ResourceManager ResourceManager { | |
| 40 | 新增: get { | |
| 41 | 新增: if (object.ReferenceEquals(resourceMan, null)) { | |
| 47 | 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TaiBug.Properties.Resources", typeof(Resources).Assembly); |
| 48 | 43 | resourceMan = temp; |
| 49 | 44 | } |
| 50 | 45 | return resourceMan; |
| 51 | 46 | } |
| 52 | 47 | } |
| 53 | 删除: | |
| 48 | 新增: | |
| 54 | 49 | /// <summary> |
| 55 | 50 | /// 重写当前线程的 CurrentUICulture 属性,对 |
| 56 | 51 | /// 使用此强类型资源类的所有资源查找执行重写。 |
| 57 | 52 | /// </summary> |
| 58 | 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
| 59 | 删除: internal static global::System.Globalization.CultureInfo Culture | |
| 60 | 删除: { | |
| 61 | 删除: get | |
| 62 | 删除: { | |
| 54 | 新增: internal static global::System.Globalization.CultureInfo Culture { | |
| 55 | 新增: get { | |
| 63 | 56 | return resourceCulture; |
| 64 | 57 | } |
| 65 | 删除: set | |
| 66 | 删除: { | |
| 58 | 新增: set { | |
| 67 | 59 | resourceCulture = value; |
| 68 | 60 | } |
| 69 | 61 | } |
| @@ -1,28 +1,24 @@ | ||
| 1 | 1 | //------------------------------------------------------------------------------ |
| 2 | 2 | // <auto-generated> |
| 3 | 删除:// This code was generated by a tool. | |
| 4 | 删除:// Runtime Version:4.0.30319.42000 | |
| 3 | 新增:// 此代码由工具生成。 | |
| 4 | 新增:// 运行时版本:4.0.30319.42000 | |
| 5 | 5 | // |
| 6 | 删除:// Changes to this file may cause incorrect behavior and will be lost if | |
| 7 | 删除:// the code is regenerated. | |
| 6 | 新增:// 对此文件的更改可能会导致不正确的行为,并且如果 | |
| 7 | 新增:// 重新生成代码,这些更改将会丢失。 | |
| 8 | 8 | // </auto-generated> |
| 9 | 9 | //------------------------------------------------------------------------------ |
| 10 | 10 | |
| 11 | 删除:namespace TaiBug.Properties | |
| 12 | 删除:{ | |
| 13 | 删除: | |
| 14 | 删除: | |
| 11 | 新增:namespace TaiBug.Properties { | |
| 12 | 新增: | |
| 13 | 新增: | |
| 15 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
| 16 | 删除: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] | |
| 17 | 删除: internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase | |
| 18 | 删除: { | |
| 19 | 删除: | |
| 15 | 新增: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] | |
| 16 | 新增: internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { | |
| 17 | 新增: | |
| 20 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); |
| 21 | 删除: | |
| 22 | 删除: public static Settings Default | |
| 23 | 删除: { | |
| 24 | 删除: get | |
| 25 | 删除: { | |
| 19 | 新增: | |
| 20 | 新增: public static Settings Default { | |
| 21 | 新增: get { | |
| 26 | 22 | return defaultInstance; |
| 27 | 23 | } |
| 28 | 24 | } |
| @@ -8,11 +8,12 @@ | ||
| 8 | 8 | <OutputType>WinExe</OutputType> |
| 9 | 9 | <RootNamespace>TaiBug</RootNamespace> |
| 10 | 10 | <AssemblyName>TaiBug</AssemblyName> |
| 11 | 删除: <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> | |
| 11 | 新增: <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> | |
| 12 | 12 | <FileAlignment>512</FileAlignment> |
| 13 | 13 | <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> |
| 14 | 14 | <WarningLevel>4</WarningLevel> |
| 15 | 15 | <Deterministic>true</Deterministic> |
| 16 | 新增: <TargetFrameworkProfile /> | |
| 16 | 17 | </PropertyGroup> |
| 17 | 18 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
| 18 | 19 | <PlatformTarget>AnyCPU</PlatformTarget> |
| @@ -1,25 +1,25 @@ | ||
| 1 | 删除:<?xml version="1.0" encoding="utf-8"?> | |
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 2 | <configuration> |
| 3 | 3 | <startup> |
| 4 | 删除: <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> | |
| 4 | 新增: <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/> | |
| 5 | 5 | </startup> |
| 6 | 6 | <runtime> |
| 7 | 7 | <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> |
| 8 | 8 | <dependentAssembly> |
| 9 | 删除: <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> | |
| 10 | 删除: <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> | |
| 9 | 新增: <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> | |
| 10 | 新增: <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/> | |
| 11 | 11 | </dependentAssembly> |
| 12 | 12 | <dependentAssembly> |
| 13 | 删除: <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" /> | |
| 14 | 删除: <bindingRedirect oldVersion="0.0.0.0-1.0.115.5" newVersion="1.0.115.5" /> | |
| 13 | 新增: <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral"/> | |
| 14 | 新增: <bindingRedirect oldVersion="0.0.0.0-1.0.115.5" newVersion="1.0.115.5"/> | |
| 15 | 15 | </dependentAssembly> |
| 16 | 16 | <dependentAssembly> |
| 17 | 删除: <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> | |
| 18 | 删除: <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> | |
| 17 | 新增: <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/> | |
| 18 | 新增: <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/> | |
| 19 | 19 | </dependentAssembly> |
| 20 | 20 | <dependentAssembly> |
| 21 | 删除: <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> | |
| 22 | 删除: <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" /> | |
| 21 | 新增: <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/> | |
| 22 | 新增: <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1"/> | |
| 23 | 23 | </dependentAssembly> |
| 24 | 24 | </assemblyBinding> |
| 25 | 25 | </runtime> |
| @@ -12,7 +12,7 @@ namespace UI.Properties { | ||
| 12 | 12 | |
| 13 | 13 | |
| 14 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
| 15 | 删除: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")] | |
| 15 | 新增: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] | |
| 16 | 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { |
| 17 | 17 | |
| 18 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); |
| @@ -31,7 +31,7 @@ | ||
| 31 | 31 | |
| 32 | 32 | </StackPanel> |
| 33 | 33 | <base:View Value="{TemplateBinding Description}" Condition="not empty"> |
| 34 | 删除: <TextBlock Text="{TemplateBinding Description}" FontSize="12" Margin="0,4,0,0" Foreground="{DynamicResource SubTextBrush}" VerticalAlignment="Center"/> | |
| 34 | 新增: <TextBlock Text="{TemplateBinding Description}" FontSize="12" Margin="0,4,0,0" Foreground="{DynamicResource SubTextBrush}" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/> | |
| 35 | 35 | </base:View> |
| 36 | 36 | </StackPanel> |
| 37 | 37 | </Grid> |
| @@ -8,7 +8,7 @@ | ||
| 8 | 8 | <OutputType>WinExe</OutputType> |
| 9 | 9 | <RootNamespace>UI</RootNamespace> |
| 10 | 10 | <AssemblyName>Tai</AssemblyName> |
| 11 | 删除: <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> | |
| 11 | 新增: <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> | |
| 12 | 12 | <FileAlignment>512</FileAlignment> |
| 13 | 13 | <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> |
| 14 | 14 | <WarningLevel>4</WarningLevel> |
| @@ -117,6 +117,7 @@ | ||
| 117 | 117 | <Reference Include="System.Xaml"> |
| 118 | 118 | <RequiredTargetFramework>4.0</RequiredTargetFramework> |
| 119 | 119 | </Reference> |
| 120 | 新增: <Reference Include="websocket-sharp, Version=1.0.2.59611, Culture=neutral, PublicKeyToken=5660b08a1845a91e" /> | |
| 120 | 121 | <Reference Include="WindowsBase" /> |
| 121 | 122 | <Reference Include="PresentationCore" /> |
| 122 | 123 | <Reference Include="PresentationFramework" /> |
| @@ -1,6 +1,6 @@ | ||
| 1 | 删除:<?xml version="1.0" encoding="utf-8" ?> | |
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 2 | <configuration> |
| 3 | 3 | <startup> |
| 4 | 删除: <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> | |
| 4 | 新增: <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/> | |
| 5 | 5 | </startup> |
| 6 | 删除:</configuration> | |
| 文件末尾没有换行 | ||
| 6 | 新增:</configuration> | |
| @@ -1,69 +1,61 @@ | ||
| 1 | 1 | //------------------------------------------------------------------------------ |
| 2 | 2 | // <auto-generated> |
| 3 | 3 | // 此代码由工具生成。 |
| 4 | 删除:// 运行时版本: 4.0.30319.42000 | |
| 4 | 新增:// 运行时版本:4.0.30319.42000 | |
| 5 | 5 | // |
| 6 | 删除:// 对此文件的更改可能导致不正确的行为,如果 | |
| 7 | 删除:// 重新生成代码,则所做更改将丢失。 | |
| 6 | 新增:// 对此文件的更改可能会导致不正确的行为,并且如果 | |
| 7 | 新增:// 重新生成代码,这些更改将会丢失。 | |
| 8 | 8 | // </auto-generated> |
| 9 | 9 | //------------------------------------------------------------------------------ |
| 10 | 10 | |
| 11 | 删除:namespace Updater.Properties | |
| 12 | 删除:{ | |
| 13 | 删除: | |
| 14 | 删除: | |
| 11 | 新增:namespace Updater.Properties { | |
| 12 | 新增: using System; | |
| 13 | 新增: | |
| 14 | 新增: | |
| 15 | 15 | /// <summary> |
| 16 | 删除: /// 强类型资源类,用于查找本地化字符串等。 | |
| 16 | 新增: /// 一个强类型的资源类,用于查找本地化的字符串等。 | |
| 17 | 17 | /// </summary> |
| 18 | 18 | // 此类是由 StronglyTypedResourceBuilder |
| 19 | 19 | // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 |
| 20 | 删除: // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen | |
| 20 | 新增: // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen | |
| 21 | 21 | // (以 /str 作为命令选项),或重新生成 VS 项目。 |
| 22 | 删除: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] | |
| 22 | 新增: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] | |
| 23 | 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] |
| 24 | 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
| 25 | 删除: internal class Resources | |
| 26 | 删除: { | |
| 27 | 删除: | |
| 25 | 新增: internal class Resources { | |
| 26 | 新增: | |
| 28 | 27 | private static global::System.Resources.ResourceManager resourceMan; |
| 29 | 删除: | |
| 28 | 新增: | |
| 30 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; |
| 31 | 删除: | |
| 30 | 新增: | |
| 32 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] |
| 33 | 删除: internal Resources() | |
| 34 | 删除: { | |
| 32 | 新增: internal Resources() { | |
| 35 | 33 | } |
| 36 | 删除: | |
| 34 | 新增: | |
| 37 | 35 | /// <summary> |
| 38 | 删除: /// 返回此类使用的缓存 ResourceManager 实例。 | |
| 36 | 新增: /// 返回此类使用的缓存的 ResourceManager 实例。 | |
| 39 | 37 | /// </summary> |
| 40 | 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
| 41 | 删除: internal static global::System.Resources.ResourceManager ResourceManager | |
| 42 | 删除: { | |
| 43 | 删除: get | |
| 44 | 删除: { | |
| 45 | 删除: if ((resourceMan == null)) | |
| 46 | 删除: { | |
| 39 | 新增: internal static global::System.Resources.ResourceManager ResourceManager { | |
| 40 | 新增: get { | |
| 41 | 新增: if (object.ReferenceEquals(resourceMan, null)) { | |
| 47 | 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Updater.Properties.Resources", typeof(Resources).Assembly); |
| 48 | 43 | resourceMan = temp; |
| 49 | 44 | } |
| 50 | 45 | return resourceMan; |
| 51 | 46 | } |
| 52 | 47 | } |
| 53 | 删除: | |
| 48 | 新增: | |
| 54 | 49 | /// <summary> |
| 55 | 50 | /// 重写当前线程的 CurrentUICulture 属性,对 |
| 56 | 51 | /// 使用此强类型资源类的所有资源查找执行重写。 |
| 57 | 52 | /// </summary> |
| 58 | 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
| 59 | 删除: internal static global::System.Globalization.CultureInfo Culture | |
| 60 | 删除: { | |
| 61 | 删除: get | |
| 62 | 删除: { | |
| 54 | 新增: internal static global::System.Globalization.CultureInfo Culture { | |
| 55 | 新增: get { | |
| 63 | 56 | return resourceCulture; |
| 64 | 57 | } |
| 65 | 删除: set | |
| 66 | 删除: { | |
| 58 | 新增: set { | |
| 67 | 59 | resourceCulture = value; |
| 68 | 60 | } |
| 69 | 61 | } |
| @@ -1,28 +1,24 @@ | ||
| 1 | 1 | //------------------------------------------------------------------------------ |
| 2 | 2 | // <auto-generated> |
| 3 | 删除:// This code was generated by a tool. | |
| 4 | 删除:// Runtime Version:4.0.30319.42000 | |
| 3 | 新增:// 此代码由工具生成。 | |
| 4 | 新增:// 运行时版本:4.0.30319.42000 | |
| 5 | 5 | // |
| 6 | 删除:// Changes to this file may cause incorrect behavior and will be lost if | |
| 7 | 删除:// the code is regenerated. | |
| 6 | 新增:// 对此文件的更改可能会导致不正确的行为,并且如果 | |
| 7 | 新增:// 重新生成代码,这些更改将会丢失。 | |
| 8 | 8 | // </auto-generated> |
| 9 | 9 | //------------------------------------------------------------------------------ |
| 10 | 10 | |
| 11 | 删除:namespace Updater.Properties | |
| 12 | 删除:{ | |
| 13 | 删除: | |
| 14 | 删除: | |
| 11 | 新增:namespace Updater.Properties { | |
| 12 | 新增: | |
| 13 | 新增: | |
| 15 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
| 16 | 删除: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] | |
| 17 | 删除: internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase | |
| 18 | 删除: { | |
| 19 | 删除: | |
| 15 | 新增: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] | |
| 16 | 新增: internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { | |
| 17 | 新增: | |
| 20 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); |
| 21 | 删除: | |
| 22 | 删除: public static Settings Default | |
| 23 | 删除: { | |
| 24 | 删除: get | |
| 25 | 删除: { | |
| 19 | 新增: | |
| 20 | 新增: public static Settings Default { | |
| 21 | 新增: get { | |
| 26 | 22 | return defaultInstance; |
| 27 | 23 | } |
| 28 | 24 | } |
| @@ -8,11 +8,12 @@ | ||
| 8 | 8 | <OutputType>WinExe</OutputType> |
| 9 | 9 | <RootNamespace>Updater</RootNamespace> |
| 10 | 10 | <AssemblyName>Updater</AssemblyName> |
| 11 | 删除: <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> | |
| 11 | 新增: <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> | |
| 12 | 12 | <FileAlignment>512</FileAlignment> |
| 13 | 13 | <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> |
| 14 | 14 | <WarningLevel>4</WarningLevel> |
| 15 | 15 | <Deterministic>true</Deterministic> |
| 16 | 新增: <TargetFrameworkProfile /> | |
| 16 | 17 | </PropertyGroup> |
| 17 | 18 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
| 18 | 19 | <PlatformTarget>AnyCPU</PlatformTarget> |
二进制文件,不显示改动。
二进制文件,不显示改动。
| @@ -0,0 +1,17 @@ | ||
| 1 | 新增:{ | |
| 2 | 新增: "name": "Tai Sentry", | |
| 3 | 新增: "description": "Tai网页浏览数据统计拓展", | |
| 4 | 新增: "version": "0.1", | |
| 5 | 新增: "manifest_version": 3, | |
| 6 | 新增: "minimum_chrome_version": "116", | |
| 7 | 新增: "action": { | |
| 8 | 新增: "default_icon": "icons/socket-inactive.png" | |
| 9 | 新增: }, | |
| 10 | 新增: "background": { | |
| 11 | 新增: "service_worker": "service-worker.js", | |
| 12 | 新增: "type": "module" | |
| 13 | 新增: }, | |
| 14 | 新增: "permissions": [ | |
| 15 | 新增: "tabs" | |
| 16 | 新增: ] | |
| 17 | 新增:} | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,318 @@ | ||
| 1 | 新增:// ws心跳间隔 | |
| 2 | 新增:const TEN_SECONDS_MS = 10 * 1000; | |
| 3 | 新增:// 焦点检测间隔 | |
| 4 | 新增:const FOCUSED_CHECK_MS = 1000; | |
| 5 | 新增:// 自动重新通知间隔 | |
| 6 | 新增:const RENOTIFY_MS = 10 * 1000; | |
| 7 | 新增:// 重连失败次数进入睡眠状态 | |
| 8 | 新增:const RECONNECTFAIL_SLEEP = 5; | |
| 9 | 新增:// Tai WS服务器URL | |
| 10 | 新增:const WSURL = 'ws://127.0.0.1:8908/TaiWebSentry'; | |
| 11 | 新增: | |
| 12 | 新增:let webSocket = null; | |
| 13 | 新增:let isConnected = false; | |
| 14 | 新增:let isChromeFocused = true; | |
| 15 | 新增:let autoReConnectIntervalId = null; | |
| 16 | 新增:// 是否处于睡眠状态(来源Tai通知) | |
| 17 | 新增:let isSleep = false; | |
| 18 | 新增:// 焦点网页数据 | |
| 19 | 新增:let activePage = { | |
| 20 | 新增: url: '', | |
| 21 | 新增: title: '', | |
| 22 | 新增: icon: '', | |
| 23 | 新增: startTime: '', | |
| 24 | 新增: endTime: '', | |
| 25 | 新增: duration: 0 | |
| 26 | 新增:}; | |
| 27 | 新增:// 重连失败次数 | |
| 28 | 新增:let reconnectFail = 0; | |
| 29 | 新增: | |
| 30 | 新增:init(); | |
| 31 | 新增: | |
| 32 | 新增:/** | |
| 33 | 新增: * 初始化插件(入口 | |
| 34 | 新增: */ | |
| 35 | 新增:function init() { | |
| 36 | 新增: connect(); | |
| 37 | 新增: startWatchFocus(); | |
| 38 | 新增: startRenofity(); | |
| 39 | 新增:} | |
| 40 | 新增: | |
| 41 | 新增:/** | |
| 42 | 新增: * 连接Tai | |
| 43 | 新增: */ | |
| 44 | 新增:function connect() { | |
| 45 | 新增: webSocket = new WebSocket(WSURL); | |
| 46 | 新增: webSocket.onopen = (event) => { | |
| 47 | 新增: isConnected = true; | |
| 48 | 新增: isSleep = false; | |
| 49 | 新增: reconnectFail = 0; | |
| 50 | 新增: clearInterval(autoReConnectIntervalId); | |
| 51 | 新增: chrome.action.setIcon({ path: 'icons/socket-active.png' }); | |
| 52 | 新增: keepAlive(); | |
| 53 | 新增: console.log("已连接Tai!"); | |
| 54 | 新增: }; | |
| 55 | 新增: webSocket.onmessage = (event) => { | |
| 56 | 新增: console.log(event.data); | |
| 57 | 新增: if (event.data === 'sleep') { | |
| 58 | 新增: isSleep = true; | |
| 59 | 新增: calDuration(); | |
| 60 | 新增: console.log("睡眠"); | |
| 61 | 新增: } | |
| 62 | 新增: else if (event.data === 'wake') { | |
| 63 | 新增: isSleep = false; | |
| 64 | 新增: console.log("唤醒"); | |
| 65 | 新增: } | |
| 66 | 新增: | |
| 67 | 新增: }; | |
| 68 | 新增: webSocket.onclose = (event) => { | |
| 69 | 新增: isConnected = false; | |
| 70 | 新增: chrome.action.setIcon({ path: 'icons/socket-inactive.png' }); | |
| 71 | 新增: console.warn('与Tai失去连接...'); | |
| 72 | 新增: webSocket = null; | |
| 73 | 新增: startAutoReConnect(); | |
| 74 | 新增: }; | |
| 75 | 新增:} | |
| 76 | 新增: | |
| 77 | 新增:function disconnect() { | |
| 78 | 新增: if (isConnected && webSocket) { | |
| 79 | 新增: webSocket.close(); | |
| 80 | 新增: isConnected = false; | |
| 81 | 新增: } | |
| 82 | 新增:} | |
| 83 | 新增: | |
| 84 | 新增:function startAutoReConnect() { | |
| 85 | 新增: clearInterval(autoReConnectIntervalId); | |
| 86 | 新增: autoReConnectIntervalId = setInterval( | |
| 87 | 新增: () => { | |
| 88 | 新增: if (!isConnected) { | |
| 89 | 新增: console.log("尝试重新连接Tai...") | |
| 90 | 新增: connect(); | |
| 91 | 新增: reconnectFail++; | |
| 92 | 新增: // 达到重连失败阈值时进入睡眠状态 | |
| 93 | 新增: if (reconnectFail >= RECONNECTFAIL_SLEEP && !isSleep) { | |
| 94 | 新增: isSleep = true; | |
| 95 | 新增: } | |
| 96 | 新增: } | |
| 97 | 新增: }, | |
| 98 | 新增: TEN_SECONDS_MS | |
| 99 | 新增: ); | |
| 100 | 新增:} | |
| 101 | 新增: | |
| 102 | 新增:/** | |
| 103 | 新增: * 保持心跳,防止插件掉线 | |
| 104 | 新增: */ | |
| 105 | 新增:function keepAlive() { | |
| 106 | 新增: const keepAliveIntervalId = setInterval( | |
| 107 | 新增: () => { | |
| 108 | 新增: if (isConnected && webSocket) { | |
| 109 | 新增: console.log('ping'); | |
| 110 | 新增: webSocket.send('ping'); | |
| 111 | 新增: } else { | |
| 112 | 新增: clearInterval(keepAliveIntervalId); | |
| 113 | 新增: } | |
| 114 | 新增: }, | |
| 115 | 新增: // It's important to pick an interval that's shorter than 30s, to | |
| 116 | 新增: // avoid that the service worker becomes inactive. | |
| 117 | 新增: TEN_SECONDS_MS | |
| 118 | 新增: ); | |
| 119 | 新增:} | |
| 120 | 新增: | |
| 121 | 新增: | |
| 122 | 新增:// Chrome functions | |
| 123 | 新增: | |
| 124 | 新增:// 监听Chrome选项卡切换事件 | |
| 125 | 新增:chrome.tabs.onActivated.addListener(async function | |
| 126 | 新增: (e) { | |
| 127 | 新增: const tab = await getTab(e.tabId); | |
| 128 | 新增: onActivePage(tab); | |
| 129 | 新增:} | |
| 130 | 新增:); | |
| 131 | 新增: | |
| 132 | 新增:// 监听Chrome选项卡更新事件 | |
| 133 | 新增:chrome.tabs.onUpdated.addListener(function | |
| 134 | 新增: (tabId, changeInfo, tab) { | |
| 135 | 新增: if (changeInfo.status == 'complete' && tab.active) { | |
| 136 | 新增: onActivePage(tab); | |
| 137 | 新增: } | |
| 138 | 新增:} | |
| 139 | 新增:); | |
| 140 | 新增: | |
| 141 | 新增:/** | |
| 142 | 新增: * 通过TabId获取Tab | |
| 143 | 新增: * @param {Number} tabId TabId | |
| 144 | 新增: * @returns Tab | |
| 145 | 新增: */ | |
| 146 | 新增:function getTab(tabId) { | |
| 147 | 新增: return new Promise((resolve, reject) => { | |
| 148 | 新增: chrome.tabs.get( | |
| 149 | 新增: tabId, | |
| 150 | 新增: function (e) { | |
| 151 | 新增: resolve(e); | |
| 152 | 新增: } | |
| 153 | 新增: ) | |
| 154 | 新增: }); | |
| 155 | 新增:} | |
| 156 | 新增: | |
| 157 | 新增:/** | |
| 158 | 新增: * 指示当前浏览器是否处于焦点中 | |
| 159 | 新增: * @returns 焦点中返回true | |
| 160 | 新增: */ | |
| 161 | 新增:function isFocused() { | |
| 162 | 新增: return new Promise((resolve, reject) => { | |
| 163 | 新增: chrome.windows.getCurrent(function (w) { | |
| 164 | 新增: resolve(w.focused); | |
| 165 | 新增: }); | |
| 166 | 新增: }); | |
| 167 | 新增: | |
| 168 | 新增:} | |
| 169 | 新增: | |
| 170 | 新增:/** | |
| 171 | 新增: * 获取当前焦点Tab | |
| 172 | 新增: * @returns Tab Obj | |
| 173 | 新增: */ | |
| 174 | 新增:function getCurrentTab() { | |
| 175 | 新增: return new Promise((resolve, reject) => { | |
| 176 | 新增: chrome.tabs.query({ active: true }, function (tab) { | |
| 177 | 新增: if (tab && tab.length > 0) { | |
| 178 | 新增: resolve(tab[0]); | |
| 179 | 新增: } | |
| 180 | 新增: else { | |
| 181 | 新增: reject(tab); | |
| 182 | 新增: } | |
| 183 | 新增: }); | |
| 184 | 新增: }); | |
| 185 | 新增:} | |
| 186 | 新增: | |
| 187 | 新增: | |
| 188 | 新增:// Tai functions | |
| 189 | 新增: | |
| 190 | 新增:// 通知失败的集合 | |
| 191 | 新增:let notifyFailList = []; | |
| 192 | 新增: | |
| 193 | 新增:/** | |
| 194 | 新增: * 重新发送通知失败的数据(最早的一条) | |
| 195 | 新增: */ | |
| 196 | 新增:function renotify() { | |
| 197 | 新增: if (isConnected && webSocket && notifyFailList.length > 0) { | |
| 198 | 新增: const item = notifyFailList[0]; | |
| 199 | 新增: notifyFailList.splice(0, 1); | |
| 200 | 新增: notifyTai(item); | |
| 201 | 新增: } | |
| 202 | 新增:} | |
| 203 | 新增: | |
| 204 | 新增:/** | |
| 205 | 新增: * 通知Tai更新数据 | |
| 206 | 新增: * @param {*} data 统计数据 | |
| 207 | 新增: */ | |
| 208 | 新增:function notifyTai(data = { | |
| 209 | 新增: Url, | |
| 210 | 新增: Title, | |
| 211 | 新增: Icon, | |
| 212 | 新增: Duration, | |
| 213 | 新增: ActiveTime | |
| 214 | 新增:}) { | |
| 215 | 新增: console.log("notify", data); | |
| 216 | 新增: if (isConnected && webSocket) { | |
| 217 | 新增: webSocket.send(JSON.stringify(data)); | |
| 218 | 新增: } | |
| 219 | 新增: else { | |
| 220 | 新增: // let item = notifyFailList.find(s => s.Url === data.Url); | |
| 221 | 新增: // if (item) { | |
| 222 | 新增: // item.Duration += data.Duration; | |
| 223 | 新增: // } | |
| 224 | 新增: // else { | |
| 225 | 新增: notifyFailList.push(data); | |
| 226 | 新增: // } | |
| 227 | 新增: | |
| 228 | 新增: console.log("failList", notifyFailList) | |
| 229 | 新增: } | |
| 230 | 新增:} | |
| 231 | 新增: | |
| 232 | 新增:/** | |
| 233 | 新增: * 响应网页焦点切换 | |
| 234 | 新增: * @param {ChromeTab} tab Tab | |
| 235 | 新增: */ | |
| 236 | 新增:function onActivePage(tab) { | |
| 237 | 新增: // 睡眠状态不处理 | |
| 238 | 新增: if (isSleep) return; | |
| 239 | 新增: | |
| 240 | 新增: if (activePage && activePage.url) { | |
| 241 | 新增: if (activePage.url !== tab.url) { | |
| 242 | 新增: // 统计时间 | |
| 243 | 新增: calDuration(); | |
| 244 | 新增: setActive(tab); | |
| 245 | 新增: } | |
| 246 | 新增: } | |
| 247 | 新增: else { | |
| 248 | 新增: setActive(tab); | |
| 249 | 新增: } | |
| 250 | 新增:} | |
| 251 | 新增: | |
| 252 | 新增:/** | |
| 253 | 新增: * 设置当前焦点网页数据 | |
| 254 | 新增: * @param {*} tab Tab | |
| 255 | 新增: */ | |
| 256 | 新增:function setActive(tab) { | |
| 257 | 新增: const { url, title, favIconUrl: icon } = tab; | |
| 258 | 新增: if (url) { | |
| 259 | 新增: activePage = { | |
| 260 | 新增: url, title, icon, startTime: new Date().getTime() | |
| 261 | 新增: }; | |
| 262 | 新增: } | |
| 263 | 新增: else { | |
| 264 | 新增: activePage = null; | |
| 265 | 新增: } | |
| 266 | 新增:} | |
| 267 | 新增: | |
| 268 | 新增:/** | |
| 269 | 新增: * 计算并通知焦点网页浏览时长 | |
| 270 | 新增: */ | |
| 271 | 新增:function calDuration() { | |
| 272 | 新增: if (activePage && activePage.url) { | |
| 273 | 新增: let duration = parseInt((new Date().getTime() - activePage.startTime) / 1000); | |
| 274 | 新增: let activeTime = parseInt(activePage.startTime / 1000); | |
| 275 | 新增: const { url: Url, title: Title, icon: Icon } = activePage; | |
| 276 | 新增: activePage = null; | |
| 277 | 新增: notifyTai({ Url, Title, Icon, Duration: duration, ActiveTime: activeTime }); | |
| 278 | 新增: } | |
| 279 | 新增:} | |
| 280 | 新增: | |
| 281 | 新增:/** | |
| 282 | 新增: * 启动焦点监听(用于检测用户是否处于浏览器中 | |
| 283 | 新增: */ | |
| 284 | 新增:function startWatchFocus() { | |
| 285 | 新增: console.log("开始监听焦点"); | |
| 286 | 新增: setInterval( | |
| 287 | 新增: async () => { | |
| 288 | 新增: const focused = await isFocused(); | |
| 289 | 新增: if (focused) { | |
| 290 | 新增: if (!isChromeFocused) { | |
| 291 | 新增: isChromeFocused = true; | |
| 292 | 新增: // 重置统计 | |
| 293 | 新增: const tab = await getCurrentTab(); | |
| 294 | 新增: onActivePage(tab); | |
| 295 | 新增: console.warn("重置统计") | |
| 296 | 新增: } | |
| 297 | 新增: } | |
| 298 | 新增: else { | |
| 299 | 新增: if (isChromeFocused) { | |
| 300 | 新增: isChromeFocused = false; | |
| 301 | 新增: // 更新时间 | |
| 302 | 新增: calDuration(); | |
| 303 | 新增: console.warn("更新时间") | |
| 304 | 新增: } | |
| 305 | 新增: } | |
| 306 | 新增: }, | |
| 307 | 新增: FOCUSED_CHECK_MS | |
| 308 | 新增: ); | |
| 309 | 新增:} | |
| 310 | 新增: | |
| 311 | 新增:/** | |
| 312 | 新增: * 启动定时重新发送失败的数据通知 | |
| 313 | 新增: */ | |
| 314 | 新增:function startRenofity() { | |
| 315 | 新增: setInterval(() => { | |
| 316 | 新增: renotify(); | |
| 317 | 新增: }, RENOTIFY_MS); | |
| 318 | 新增:} | |
| 文件末尾没有换行 | ||

