未验证 提交 38f83f7a 编写于 作者: R Richasy 提交者: GitHub

添加日志记录模块 (#54)

* 添加日志模块

* 调整 issue 模板
上级 be46b615
---
name: Bug 报告
about: 提交 Bug 以帮助我们提高应用体验
title: ''
title: '[Bug]'
labels: bug, 待分配
assignees: Richasy
......@@ -69,6 +69,12 @@ Visual Studio 版本:
- [ ] 2019 (16.{版本号})
- [ ] 2022 (17.{版本号})
## 日志记录
<!-- 应用会记录一些网络请求错误和运行时错误的日志,
请在应用设置中打开 日志记录 面板,打开日志文件夹,选取问题发生当日的日志记录作为 Issue 的附件上传。
上传就是将日志文件拖拽到当前的输入框内即可 -->
## 备注
<!-- 添加你认为有必要的信息 -->
---
name: 文档
about: 我有关于文档的建议或问题
title: '[Doc]'
labels: 文档, 待分配
assignees: Richasy
---
## 关联文档
<!-- 请取消下方的注释,并使用这样的方式插入与该问题有关的文档链接,如果你的问题与某个具体文档无关,请忽略 -->
<!-- - ![文档名称](文档链接)-->
## 描述
<!-- 在这里描述你对文档的建议或者问题 -->
## 预期的内容
<!-- 请描述你希望文档进行修改的内容,并说明符合预期的内容是怎样的 -->
## 备注
<!-- 添加你觉得有必要的信息 -->
\ No newline at end of file
---
name: 功能需求
about: 给项目提供建议或点子
title: ''
title: '[Feature]'
labels: 功能, 待分配
assignees: Richasy
......
......@@ -42,4 +42,8 @@
## 🌏 路线图
哔哩会逐步完善,请查看 [哔哩里程碑](https://github.com/Richasy/Bili.Uwp/milestones) 来了解哔哩下一步打算做的事情。于此同时,欢迎各位开发者加入,让我们一起打造哔哩的未来。
\ No newline at end of file
哔哩会逐步完善,请查看 [哔哩里程碑](https://github.com/Richasy/Bili.Uwp/milestones) 来了解哔哩下一步打算做的事情。于此同时,欢迎各位开发者加入,让我们一起打造哔哩的未来。
## 🧩 截图
![截图](./assets/image/guide/screenshot.png)
\ No newline at end of file
......@@ -16,6 +16,9 @@
<Use64BitCompiler>true</Use64BitCompiler>
<ShortcutGenericAnalysis>true</ShortcutGenericAnalysis>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(SolutionDir)\src\Shared\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
......
// Copyright (c) Richasy. All rights reserved.
using System;
using Richasy.Bili.Controller.Uwp.Interfaces;
using Richasy.Bili.Locator.Uwp;
using Richasy.Bili.Models.App.Constants;
using Richasy.Bili.Toolkit.Interfaces;
......@@ -153,7 +154,8 @@ namespace Richasy.Bili.App
{
e.Handled = true;
// TODO: Handle e.Exception
var logger = ServiceLocator.Instance.GetService<ILoggerModule>();
logger.LogError(e.Exception);
}
}
}
......@@ -37,7 +37,7 @@
<Button
x:Name="OpenLoggerFolderButton"
MinWidth="120"
Click="OnOpenLoggerFolderButtonClick"
Click="OnOpenLoggerFolderButtonClickAsync"
Content="{loc:LocaleLocator Name=OpenFolder}" />
</uwp:ExpanderExWrapper.WrapContent>
</uwp:ExpanderExWrapper>
......@@ -53,7 +53,7 @@
<Button
x:Name="CleanLoggerButton"
MinWidth="120"
Click="OnCleanLoggerButtonClick"
Click="OnCleanLoggerButtonClickAsync"
Content="{loc:LocaleLocator Name=Clean}" />
</uwp:ExpanderExWrapper.WrapContent>
</uwp:ExpanderExWrapper>
......
// Copyright (c) Richasy. All rights reserved.
using System;
using Richasy.Bili.Controller.Uwp.Interfaces;
using Richasy.Bili.Locator.Uwp;
using Richasy.Bili.Models.App.Constants;
using Richasy.Bili.Models.Enums.App;
using Richasy.Bili.Toolkit.Interfaces;
using Richasy.Bili.ViewModels.Uwp;
using Windows.Storage;
using Windows.System;
namespace Richasy.Bili.App.Controls
{
/// <summary>
......@@ -15,12 +25,29 @@ namespace Richasy.Bili.App.Controls
this.InitializeComponent();
}
private void OnOpenLoggerFolderButtonClick(object sender, Windows.UI.Xaml.RoutedEventArgs e)
private async void OnOpenLoggerFolderButtonClickAsync(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(ControllerConstants.Names.LoggerFolder, CreationCollisionOption.OpenIfExists).AsTask();
await Launcher.LaunchFolderAsync(folder);
}
private void OnCleanLoggerButtonClick(object sender, Windows.UI.Xaml.RoutedEventArgs e)
private async void OnCleanLoggerButtonClickAsync(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(ControllerConstants.Names.LoggerFolder, CreationCollisionOption.OpenIfExists).AsTask();
var resourceToolkit = ServiceLocator.Instance.GetService<IResourceToolkit>();
try
{
var logger = ServiceLocator.Instance.GetService<ILoggerModule>();
await folder.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask();
await ApplicationData.Current.LocalFolder.CreateFolderAsync(ControllerConstants.Names.LoggerFolder, CreationCollisionOption.OpenIfExists).AsTask();
}
catch (Exception)
{
}
finally
{
AppViewModel.Instance.ShowTip(resourceToolkit.GetLocaleString(Models.Enums.LanguageNames.LogEmptied), InfoType.Success);
}
}
}
}
......@@ -340,6 +340,9 @@
<data name="FailedToClearHisotry" xml:space="preserve">
<value>尝试清空历史记录失败,请稍后重试</value>
</data>
<data name="FailedToClearLog" xml:space="preserve">
<value>清除日志失败,请稍后重试</value>
</data>
<data name="FailedToClearViewLater" xml:space="preserve">
<value>清除稍后再看列表失败,请稍后重试</value>
</data>
......@@ -500,6 +503,9 @@
<data name="Location" xml:space="preserve">
<value>位置</value>
</data>
<data name="LogEmptied" xml:space="preserve">
<value>已清除日志记录</value>
</data>
<data name="LoggerFolder" xml:space="preserve">
<value>日志文件夹</value>
</data>
......
......@@ -44,10 +44,12 @@ namespace Richasy.Bili.Controller.Uwp
{
var profile = await _accountProvider.GetMyInformationAsync();
this.MyInfo = profile;
_loggerModule.LogError(new Exception("测试一下"));
_loggerModule.LogError(new Exception("测试一下2"), true);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
_loggerModule.LogError(ex);
}
}
}
......@@ -59,8 +61,17 @@ namespace Richasy.Bili.Controller.Uwp
public async Task<Mine> GetMyDataAsync()
{
ThrowWhenNetworkUnavaliable();
var data = await _accountProvider.GetMyDataAsync();
return data;
try
{
var data = await _accountProvider.GetMyDataAsync();
return data;
}
catch (Exception ex)
{
_loggerModule.LogError(ex, true);
throw;
}
}
/// <summary>
......@@ -91,8 +102,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new HistoryVideoIterationEventArgs(data);
HistoryVideoIteration?.Invoke(this, args);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, cursor.Max > 0);
if (cursor.Max == 0)
{
throw;
......@@ -112,8 +124,9 @@ namespace Richasy.Bili.Controller.Uwp
{
return await _accountProvider.RemoveHistoryItemAsync("archive", historyId);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -129,8 +142,9 @@ namespace Richasy.Bili.Controller.Uwp
{
return await _accountProvider.ClearHistoryAsync("archive");
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -143,14 +157,23 @@ namespace Richasy.Bili.Controller.Uwp
public async Task<UserSpaceInformation> RequestUserSpaceInformationAsync(int userId)
{
ThrowWhenNetworkUnavaliable();
var data = await _accountProvider.GetUserSpaceInformationAsync(userId);
if (data.VideoSet != null)
try
{
var args = new UserSpaceVideoIterationEventArgs(data.VideoSet, userId);
UserSpaceVideoIteration?.Invoke(this, args);
}
var data = await _accountProvider.GetUserSpaceInformationAsync(userId);
if (data.VideoSet != null)
{
var args = new UserSpaceVideoIterationEventArgs(data.VideoSet, userId);
UserSpaceVideoIteration?.Invoke(this, args);
}
return data.User;
return data.User;
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -162,9 +185,18 @@ namespace Richasy.Bili.Controller.Uwp
public async Task RequestUserSpaceVideoSetAsync(int userId, string offsetId)
{
ThrowWhenNetworkUnavaliable();
var data = await _accountProvider.GetUserSpaceVideoSetAsync(userId, offsetId);
var args = new UserSpaceVideoIterationEventArgs(data, userId);
UserSpaceVideoIteration?.Invoke(this, args);
try
{
var data = await _accountProvider.GetUserSpaceVideoSetAsync(userId, offsetId);
var args = new UserSpaceVideoIterationEventArgs(data, userId);
UserSpaceVideoIteration?.Invoke(this, args);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -176,8 +208,17 @@ namespace Richasy.Bili.Controller.Uwp
public async Task<bool> ModifyUserRelationAsync(int userId, bool isFollow)
{
ThrowWhenNetworkUnavaliable();
var result = await _accountProvider.ModifyUserRelationAsync(userId, isFollow);
return result;
try
{
var result = await _accountProvider.ModifyUserRelationAsync(userId, isFollow);
return result;
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -196,8 +237,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new RelatedUserIterationEventArgs(result, pageNumber, userId);
FansIteration?.Invoke(this, args);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber <= 1)
{
throw;
......@@ -221,8 +263,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new RelatedUserIterationEventArgs(result, pageNumber, userId);
FollowsIteration?.Invoke(this, args);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber <= 1)
{
throw;
......@@ -245,8 +288,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new ViewLaterVideoIterationEventArgs(result, pageNumber);
ViewLaterVideoIteration?.Invoke(this, args);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber <= 1)
{
throw;
......@@ -267,8 +311,9 @@ namespace Richasy.Bili.Controller.Uwp
var result = await _accountProvider.ClearViewLaterAsync();
return result;
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -287,8 +332,9 @@ namespace Richasy.Bili.Controller.Uwp
var result = await _accountProvider.AddVideoToViewLaterAsync(videoId);
return result;
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -307,8 +353,9 @@ namespace Richasy.Bili.Controller.Uwp
var result = await _accountProvider.RemoveVideoFromViewLaterAsync(videoIds);
return result;
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -323,8 +370,16 @@ namespace Richasy.Bili.Controller.Uwp
{
ThrowWhenNetworkUnavaliable();
var list = await _accountProvider.GetFavoriteListAsync(userId, videoId);
return list.List;
try
{
var list = await _accountProvider.GetFavoriteListAsync(userId, videoId);
return list.List;
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -336,8 +391,16 @@ namespace Richasy.Bili.Controller.Uwp
{
ThrowWhenNetworkUnavaliable();
var response = await _accountProvider.GetFavoriteVideoGalleryAsync(userId);
return response;
try
{
var response = await _accountProvider.GetFavoriteVideoGalleryAsync(userId);
return response;
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -350,8 +413,16 @@ namespace Richasy.Bili.Controller.Uwp
{
ThrowWhenNetworkUnavaliable();
var response = await _accountProvider.GetFavoriteFolderListAsync(userId, pageNumber);
return response;
try
{
var response = await _accountProvider.GetFavoriteFolderListAsync(userId, pageNumber);
return response;
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -369,8 +440,9 @@ namespace Richasy.Bili.Controller.Uwp
var response = await _accountProvider.GetFavoriteVideoListAsync(favoriteId, pageNumber);
return response;
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber <= 1)
{
throw;
......@@ -405,8 +477,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new FavoritePgcIterationEventArgs(response, pageNumber, type);
PgcFavoriteIteration?.Invoke(this, args);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber <= 1)
{
throw;
......@@ -429,8 +502,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new FavoriteArticleIterationEventArgs(response, pageNumber);
ArticleFavoriteIteration?.Invoke(this, args);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber <= 1)
{
throw;
......
......@@ -39,6 +39,7 @@ namespace Richasy.Bili.Controller.Uwp
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
LoggedFailed?.Invoke(this, ex);
}
}
......
......@@ -29,8 +29,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new ReplyIterationEventArgs(response, targetId);
ReplyIteration?.Invoke(this, args);
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, cursor.Next > 0);
if (cursor.Next == 0)
{
throw;
......@@ -56,8 +57,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new ReplyIterationEventArgs(response, targetId);
ReplyDetailIteration?.Invoke(this, args);
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, cursor.Next > 0);
if (cursor.Next == 0)
{
throw;
......@@ -81,8 +83,9 @@ namespace Richasy.Bili.Controller.Uwp
{
return await _communityProvider.LikeReplyAsync(isLike, replyId, targetId, type);
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -102,8 +105,9 @@ namespace Richasy.Bili.Controller.Uwp
{
return await _communityProvider.AddReplyAsync(message, targetId, type, rootId, parentId);
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -123,8 +127,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new DynamicVideoIterationEventArgs(reply);
DynamicVideoIteration?.Invoke(this, args);
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, !string.IsNullOrEmpty(offset));
if (string.IsNullOrEmpty(offset))
{
throw;
......
......@@ -49,8 +49,9 @@ namespace Richasy.Bili.Controller.Uwp
LiveFeedRoomIteration?.Invoke(this, new LiveFeedRoomIterationEventArgs(data, pageNumber + 1));
}
catch (ServiceException)
catch (ServiceException ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -63,10 +64,8 @@ namespace Richasy.Bili.Controller.Uwp
/// </summary>
/// <param name="roomId">直播间Id.</param>
/// <returns><see cref="LiveRoomDetail"/>.</returns>
public async Task<LiveRoomDetail> GetLiveRoomDetailAsync(int roomId)
{
return await _liveProvider.GetLiveRoomDetailAsync(roomId);
}
public Task<LiveRoomDetail> GetLiveRoomDetailAsync(int roomId)
=> _liveProvider.GetLiveRoomDetailAsync(roomId);
/// <summary>
/// 获取直播间播放信息.
......@@ -74,11 +73,8 @@ namespace Richasy.Bili.Controller.Uwp
/// <param name="roomId">直播间Id.</param>
/// <param name="quality">清晰度.</param>
/// <returns>播放信息.</returns>
public async Task<LivePlayInformation> GetLivePlayInformationAsync(int roomId, int quality = 4)
{
var result = await _liveProvider.GetLivePlayInformationAsync(roomId, quality);
return result;
}
public Task<LivePlayInformation> GetLivePlayInformationAsync(int roomId, int quality = 4)
=> _liveProvider.GetLivePlayInformationAsync(roomId, quality);
/// <summary>
/// 连接到直播间.
......@@ -180,13 +176,14 @@ namespace Richasy.Bili.Controller.Uwp
}
else if (result.IsFaulted)
{
_loggerModule.LogError(result.Exception);
throw result.Exception;
}
}
catch (Exception)
catch (Exception ex)
{
// Log.
}
_loggerModule.LogError(ex);
}
});
}
......@@ -431,9 +428,9 @@ namespace Richasy.Bili.Controller.Uwp
// 暂不支持.
}
}
catch (Exception)
catch (Exception ex)
{
// 记录日志.
_loggerModule.LogError(ex);
}
}
......
......@@ -25,7 +25,7 @@ namespace Richasy.Bili.Controller.Uwp
{
var cacheData = await _fileToolkit.ReadLocalDataAsync<LocalCache<List<Partition>>>(Names.PartitionIndex, folderName: Names.ServerFolder);
var needRequest = true;
List<Partition> data;
List<Partition> data = null;
if (cacheData != null)
{
needRequest = cacheData.ExpiryTime < DateTimeOffset.Now;
......@@ -34,10 +34,18 @@ namespace Richasy.Bili.Controller.Uwp
if (needRequest)
{
ThrowWhenNetworkUnavaliable();
var webResult = await _partitionProvider.GetPartitionIndexAsync();
data = webResult.ToList();
var localCache = new LocalCache<List<Partition>>(DateTimeOffset.Now.AddDays(1), data);
await _fileToolkit.WriteLocalDataAsync(Names.PartitionIndex, localCache, Names.ServerFolder);
try
{
var webResult = await _partitionProvider.GetPartitionIndexAsync();
data = webResult.ToList();
var localCache = new LocalCache<List<Partition>>(DateTimeOffset.Now.AddDays(1), data);
await _fileToolkit.WriteLocalDataAsync(Names.PartitionIndex, localCache, Names.ServerFolder);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
}
}
else
{
......@@ -63,9 +71,9 @@ namespace Richasy.Bili.Controller.Uwp
/// <returns><see cref="Task"/>.</returns>
public async Task RequestSubPartitionDataAsync(int subPartitionId, bool isRecommend, int offsetId = 0, VideoSortType sortType = VideoSortType.Default, int pageNumber = 1)
{
ThrowWhenNetworkUnavaliable();
try
{
ThrowWhenNetworkUnavaliable();
var requestDateTime = DateTimeOffset.Now;
var data = await _partitionProvider.GetSubPartitionDataAsync(subPartitionId, isRecommend, offsetId, sortType, pageNumber);
pageNumber = !isRecommend && sortType != VideoSortType.Default ? pageNumber + 1 : 1;
......@@ -90,8 +98,9 @@ namespace Richasy.Bili.Controller.Uwp
tagList: defaultData.TopTags));
}
}
catch
catch (Exception ex)
{
_loggerModule.LogError(ex, offsetId > 0);
if (offsetId == 0)
{
throw;
......
......@@ -40,10 +40,18 @@ namespace Richasy.Bili.Controller.Uwp
if (needRequest)
{
ThrowWhenNetworkUnavaliable();
var webResult = await _pgcProvider.GetTabAsync(type);
data = webResult;
var localCache = new LocalCache<List<PgcTab>>(DateTimeOffset.Now.AddDays(1), data);
await _fileToolkit.WriteLocalDataAsync($"{type}Tab.json", localCache, Names.ServerFolder);
try
{
var webResult = await _pgcProvider.GetTabAsync(type);
data = webResult;
var localCache = new LocalCache<List<PgcTab>>(DateTimeOffset.Now.AddDays(1), data);
await _fileToolkit.WriteLocalDataAsync($"{type}Tab.json", localCache, Names.ServerFolder);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
else
{
......@@ -62,9 +70,9 @@ namespace Richasy.Bili.Controller.Uwp
/// <returns><see cref="Task"/>.</returns>
public async Task RequestPgcPageDetailAsync(int tabId)
{
ThrowWhenNetworkUnavaliable();
try
{
ThrowWhenNetworkUnavaliable();
var response = await _pgcProvider.GetPageDetailAsync(tabId);
var additionalArgs = PgcModuleAdditionalDataChangedEventArgs.Create(response, tabId);
......@@ -76,8 +84,9 @@ namespace Richasy.Bili.Controller.Uwp
var iterationArgs = PgcModuleIterationEventArgs.Create(response, tabId);
PgcModuleIteration?.Invoke(this, iterationArgs);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
......@@ -90,9 +99,9 @@ namespace Richasy.Bili.Controller.Uwp
/// <returns><see cref="Task"/>.</returns>
public async Task RequestPgcPageDetailAsync(PgcType type, string cursor = null)
{
ThrowWhenNetworkUnavaliable();
try
{
ThrowWhenNetworkUnavaliable();
var response = await _pgcProvider.GetPageDetailAsync(type, cursor);
if (string.IsNullOrEmpty(cursor))
......@@ -107,8 +116,9 @@ namespace Richasy.Bili.Controller.Uwp
var iterationArgs = PgcModuleIterationEventArgs.Create(response, type);
PgcModuleIteration?.Invoke(this, iterationArgs);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, !string.IsNullOrEmpty(cursor));
if (string.IsNullOrEmpty(cursor))
{
throw;
......@@ -124,15 +134,16 @@ namespace Richasy.Bili.Controller.Uwp
/// <returns><see cref="Task"/>.</returns>
public async Task RequestSubPartitionDataAsync(int partitionId, int offsetId = 0)
{
ThrowWhenNetworkUnavaliable();
try
{
ThrowWhenNetworkUnavaliable();
var requestDateTime = DateTimeOffset.Now;
var data = await _pgcProvider.GetPartitionRecommendVideoAsync(partitionId, offsetId);
SubPartitionVideoIteration?.Invoke(this, new PartitionVideoIterationEventArgs(partitionId, requestDateTime, data, 1));
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, offsetId > 0);
if (offsetId == 0)
{
throw;
......@@ -158,7 +169,15 @@ namespace Richasy.Bili.Controller.Uwp
throw new ArgumentException("无效的参数");
}
return await _pgcProvider.GetDisplayInformationAsync(episodeId, seasonId);
try
{
return await _pgcProvider.GetDisplayInformationAsync(episodeId, seasonId);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -167,9 +186,7 @@ namespace Richasy.Bili.Controller.Uwp
/// <param name="episodeId">分集Id.</param>
/// <returns>分集交互信息.</returns>
public async Task<EpisodeInteraction> GetPgcEpisodeInteractionAsync(int episodeId)
{
return await _pgcProvider.GetEpisodeInteractionAsync(episodeId);
}
=> await _pgcProvider.GetEpisodeInteractionAsync(episodeId);
/// <summary>
/// 追番/取消追番.
......@@ -185,8 +202,9 @@ namespace Richasy.Bili.Controller.Uwp
var result = await _pgcProvider.FollowAsync(seasonId, isFollow);
return result;
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, true);
return false;
}
}
......@@ -197,10 +215,7 @@ namespace Richasy.Bili.Controller.Uwp
/// <param name="type">PGC类型.</param>
/// <returns>索引结果.</returns>
public async Task<PgcIndexConditionResponse> GetPgcIndexConditionsAsync(PgcType type)
{
ThrowWhenNetworkUnavaliable();
return await _pgcProvider.GetPgcIndexConditionsAsync(type);
}
=> await _pgcProvider.GetPgcIndexConditionsAsync(type);
/// <summary>
/// 请求PGC索引内容.
......@@ -219,8 +234,9 @@ namespace Richasy.Bili.Controller.Uwp
var args = new PgcIndexResultIterationEventArgs(data, type);
PgcIndexResultIteration?.Invoke(this, args);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber <= 1);
if (pageNumber > 1)
{
throw;
......@@ -236,7 +252,16 @@ namespace Richasy.Bili.Controller.Uwp
public Task<PgcTimeLineResponse> GetPgcTimeLineAsync(PgcType type)
{
ThrowWhenNetworkUnavaliable();
return _pgcProvider.GetPgcTimeLineAsync(type);
try
{
return _pgcProvider.GetPgcTimeLineAsync(type);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -247,7 +272,16 @@ namespace Richasy.Bili.Controller.Uwp
public Task<PgcPlayListResponse> GetPgcPlayListAsync(int listId)
{
ThrowWhenNetworkUnavaliable();
return _pgcProvider.GetPgcPlayListAsync(listId);
try
{
return _pgcProvider.GetPgcPlayListAsync(listId);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
}
}
......@@ -118,11 +118,11 @@ namespace Richasy.Bili.Controller.Uwp
isSuccess = await _playerProvider.ReportProgressAsync(videoId, partId, Convert.ToInt64(progress.TotalSeconds));
}
// Record.
_loggerModule.LogInformation("播放历史记录" + (isSuccess ? "成功" : "失败"));
}
catch (Exception)
catch (Exception ex)
{
// Record.
_loggerModule.LogError(ex);
}
}
}
......
// Copyright (c) Richasy. All rights reserved.
using System;
using System.Linq;
using System.Threading.Tasks;
......@@ -28,8 +29,9 @@ namespace Richasy.Bili.Controller.Uwp
.ToList();
PopularVideoIteration?.Invoke(this, new Models.App.Args.PopularVideoIterationEventArgs(cards));
}
catch
catch (Exception ex)
{
_loggerModule.LogError(ex, offsetIndex > 0);
if (offsetIndex == 0)
{
throw;
......
......@@ -19,8 +19,16 @@ namespace Richasy.Bili.Controller.Uwp
public async Task<List<Item>> GetRankAsync(int partitionId)
{
ThrowWhenNetworkUnavaliable();
var rank = await _rankProvider.GetRankDetailAsync(partitionId);
return rank;
try
{
return await _rankProvider.GetRankDetailAsync(partitionId);
}
catch (System.Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
}
}
// Copyright (c) Richasy. All rights reserved.
using System;
using System.Linq;
using System.Threading.Tasks;
using static Richasy.Bili.Models.App.Constants.ServiceConstants;
......@@ -26,8 +27,9 @@ namespace Richasy.Bili.Controller.Uwp
RecommendVideoIteration?.Invoke(this, new Models.App.Args.RecommendVideoIterationEventArgs(result));
}
catch
catch (Exception ex)
{
_loggerModule.LogError(ex, offsetIndex > 0);
if (offsetIndex == 0)
{
throw;
......
......@@ -21,7 +21,15 @@ namespace Richasy.Bili.Controller.Uwp
/// <returns>热搜列表.</returns>
public async Task<List<SearchRecommendItem>> GetHotSearchListAsync()
{
return await _searchProvider.GetHotSearchListAsync();
try
{
return await _searchProvider.GetHotSearchListAsync();
}
catch (System.Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
/// <summary>
......@@ -50,8 +58,9 @@ namespace Richasy.Bili.Controller.Uwp
VideoSearchIteration?.Invoke(this, new VideoSearchIterationEventArgs(videoData, pageNumber));
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -66,8 +75,9 @@ namespace Richasy.Bili.Controller.Uwp
var bangumiData = await _searchProvider.GetBangumiSearchResultAsync(keyword, TotalRank, pageNumber);
BangumiSearchIteration?.Invoke(this, new PgcSearchIterationEventArgs(bangumiData, pageNumber, keyword));
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -81,8 +91,9 @@ namespace Richasy.Bili.Controller.Uwp
var movieData = await _searchProvider.GetMovieSearchResultAsync(keyword, TotalRank, pageNumber);
MovieSearchIteration?.Invoke(this, new PgcSearchIterationEventArgs(movieData, pageNumber, keyword));
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -96,8 +107,9 @@ namespace Richasy.Bili.Controller.Uwp
var liveData = await _searchProvider.GetLiveSearchResultAsync(keyword, pageNumber);
LiveSearchIteration?.Invoke(this, new LiveSearchIterationEventArgs(liveData, keyword, pageNumber));
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -114,8 +126,9 @@ namespace Richasy.Bili.Controller.Uwp
var userData = await _searchProvider.GetUserSearchResultAsync(keyword, u_orderType, u_orderSort, u_userType, pageNumber);
UserSearchIteration?.Invoke(this, new UserSearchIterationEventArgs(userData, pageNumber, keyword));
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -131,8 +144,9 @@ namespace Richasy.Bili.Controller.Uwp
var articleData = await _searchProvider.GetArticleSearchResultAsync(keyword, a_orderType, a_partitionId, pageNumber);
ArticleSearchIteration?.Invoke(this, new ArticleSearchIterationEventArgs(articleData, pageNumber, keyword));
}
catch (System.Exception)
catch (System.Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......
......@@ -33,9 +33,17 @@ namespace Richasy.Bili.Controller.Uwp
if (needRequest)
{
ThrowWhenNetworkUnavaliable();
data = await _specialColumnProvider.GetCategoriesAsync();
var localCache = new LocalCache<List<ArticleCategory>>(DateTimeOffset.Now.AddDays(1), data);
await _fileToolkit.WriteLocalDataAsync(Names.DocumentaryCategories, localCache, Names.ServerFolder);
try
{
data = await _specialColumnProvider.GetCategoriesAsync();
var localCache = new LocalCache<List<ArticleCategory>>(DateTimeOffset.Now.AddDays(1), data);
await _fileToolkit.WriteLocalDataAsync(Names.DocumentaryCategories, localCache, Names.ServerFolder);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
else
{
......@@ -54,15 +62,16 @@ namespace Richasy.Bili.Controller.Uwp
/// <returns><see cref="Task"/>.</returns>
public async Task RequestCategoryArticlesAsync(int categoryId, int pageNumber, ArticleSortType sortType)
{
ThrowWhenNetworkUnavaliable();
try
{
ThrowWhenNetworkUnavaliable();
var data = await _specialColumnProvider.GetCategoryArticlesAsync(categoryId, pageNumber, sortType);
var iterationArgs = SpecialColumnArticleIterationEventArgs.Create(data, categoryId, pageNumber + 1);
SpecialColumnArticleIteration?.Invoke(this, iterationArgs);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -77,9 +86,9 @@ namespace Richasy.Bili.Controller.Uwp
/// <returns><see cref="Task"/>.</returns>
public async Task RequestRecommendArticlesAsync(int pageNumber)
{
ThrowWhenNetworkUnavaliable();
try
{
ThrowWhenNetworkUnavaliable();
var data = await _specialColumnProvider.GetRecommendArticlesAsync(pageNumber);
var additionalArgs = SpecialColumnAdditionalDataChangedEventArgs.Create(data);
if (additionalArgs != null && pageNumber == 1)
......@@ -90,8 +99,9 @@ namespace Richasy.Bili.Controller.Uwp
var iterationArgs = SpecialColumnArticleIterationEventArgs.Create(data, pageNumber + 1);
SpecialColumnArticleIteration?.Invoke(this, iterationArgs);
}
catch (Exception)
catch (Exception ex)
{
_loggerModule.LogError(ex, pageNumber > 1);
if (pageNumber == 1)
{
throw;
......@@ -107,8 +117,16 @@ namespace Richasy.Bili.Controller.Uwp
public async Task<string> GetArticleContentAsync(int articleId)
{
ThrowWhenNetworkUnavaliable();
var content = await _specialColumnProvider.GetArticleContentAsync(articleId);
return content;
try
{
return await _specialColumnProvider.GetArticleContentAsync(articleId);
}
catch (Exception ex)
{
_loggerModule.LogError(ex);
throw;
}
}
}
}
......@@ -22,7 +22,6 @@ namespace Richasy.Bili.Controller.Uwp
/// </summary>
public partial class BiliController
{
private readonly ISettingsToolkit _settingsToolkit;
private readonly IFileToolkit _fileToolkit;
private readonly IAuthorizeProvider _authorizeProvider;
......@@ -39,6 +38,7 @@ namespace Richasy.Bili.Controller.Uwp
private readonly ICommunityProvider _communityProvider;
private readonly INetworkModule _networkModule;
private readonly ILoggerModule _loggerModule;
/// <summary>
/// 直播间套接字.
......@@ -54,9 +54,9 @@ namespace Richasy.Bili.Controller.Uwp
internal BiliController()
{
RegisterToolkitServices();
ServiceLocator.Instance.LoadService(out _settingsToolkit)
.LoadService(out _fileToolkit)
ServiceLocator.Instance.LoadService(out _fileToolkit)
.LoadService(out _networkModule)
.LoadService(out _loggerModule)
.LoadService(out _authorizeProvider)
.LoadService(out _accountProvider)
.LoadService(out _partitionProvider)
......@@ -72,6 +72,7 @@ namespace Richasy.Bili.Controller.Uwp
InitializeLiveSocket();
RegisterEvents();
_loggerModule.LogInformation("控制器加载完成");
}
/// <summary>
......@@ -275,6 +276,7 @@ namespace Richasy.Bili.Controller.Uwp
private void RegisterToolkitServices()
{
var serviceCollection = new ServiceCollection()
.AddLogging()
.AddSingleton<IAppToolkit, AppToolkit>()
.AddSingleton<IFileToolkit, FileToolkit>()
.AddSingleton<IResourceToolkit, ResourceToolkit>()
......@@ -283,6 +285,7 @@ namespace Richasy.Bili.Controller.Uwp
.AddSingleton<IMD5Toolkit, MD5Toolkit>()
.AddSingleton<IFontToolkit, FontToolkit>()
.AddSingleton<INetworkModule, NetworkModule>()
.AddSingleton<ILoggerModule, LoggerModule>()
.AddSingleton<IAuthorizeProvider, AuthorizeProvider>()
.AddSingleton<IHttpProvider, HttpProvider>()
.AddSingleton<IAccountProvider, AccountProvider>()
......@@ -296,6 +299,7 @@ namespace Richasy.Bili.Controller.Uwp
.AddSingleton<IPlayerProvider, PlayerProvider>()
.AddSingleton<ISearchProvider, SearchProvider>()
.AddSingleton<ICommunityProvider, CommunityProvider>();
_ = new ServiceLocator(serviceCollection);
}
......@@ -303,7 +307,9 @@ namespace Richasy.Bili.Controller.Uwp
{
if (!IsNetworkAvailable)
{
throw new InvalidOperationException("网络连接异常");
var ex = new InvalidOperationException("网络连接异常");
_loggerModule.LogError(ex, true);
throw ex;
}
}
}
......
......@@ -8,6 +8,11 @@
<AssemblyName>Richasy.Bili.Controller.Uwp</AssemblyName>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<SuppressXamlWarnings>
</SuppressXamlWarnings>
</PropertyGroup>
<ItemGroup>
<Compile Include="BiliController.Auth.cs" />
<Compile Include="BiliController.Community.cs" />
......@@ -22,7 +27,9 @@
<Compile Include="BiliController.Popular.cs" />
<Compile Include="BiliController.Rank.cs" />
<Compile Include="BiliController.Player.cs" />
<Compile Include="Interfaces\ILoggerModule.cs" />
<Compile Include="Interfaces\INetworkModule.cs" />
<Compile Include="Modules\LoggerModule.cs" />
<Compile Include="Modules\NetworkModule.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="$(SolutionDir)\src\Shared\SharedAssemblyInfo.cs">
......@@ -32,9 +39,15 @@
<Content Include="Properties\Controller.Uwp.rd.xml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging">
<Version>5.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.12</Version>
</PackageReference>
<PackageReference Include="Serilog.Extensions.Logging.File">
<Version>2.0.0</Version>
</PackageReference>
<PackageReference Include="Websocket.Client">
<Version>4.3.36</Version>
</PackageReference>
......
// Copyright (c) Richasy. All rights reserved.
using System;
using Microsoft.Extensions.Logging;
namespace Richasy.Bili.Controller.Uwp.Interfaces
{
/// <summary>
/// 日志记录模块.
/// </summary>
public interface ILoggerModule
{
/// <summary>
/// 日志记录工厂.
/// </summary>
ILoggerFactory LoggerFactory { get; }
/// <summary>
/// 记录信息.
/// </summary>
/// <param name="message">消息.</param>
void LogInformation(string message);
/// <summary>
/// 记录信息.
/// </summary>
/// <param name="ex">错误.</param>
/// <param name="isWarning">是否为警告.</param>
void LogError(Exception ex, bool isWarning = false);
}
}
......@@ -6,22 +6,22 @@ using Richasy.Bili.Controller.Uwp.Utilities;
namespace Richasy.Bili.Controller.Uwp.Interfaces
{
/// <summary>
/// Definition of network module.
/// 网络连接检测模块的定义.
/// </summary>
public interface INetworkModule
{
/// <summary>
/// Event raised when the network changes.
/// 当网络改变时发生.
/// </summary>
event EventHandler NetworkChanged;
/// <summary>
/// Gets instance of <see cref="Utilities.ConnectionInformation"/>.
/// <see cref="Utilities.ConnectionInformation"/> 的实例.
/// </summary>
ConnectionInformation ConnectionInformation { get; }
/// <summary>
/// Gets a value indicating whether internet is available across all connections.
/// 获取网络是否可用.
/// </summary>
bool IsNetworkAvaliable { get; }
}
......
// Copyright (c) Richasy. All rights reserved.
using System;
using System.Globalization;
using System.Linq;
using System.Text;
using Microsoft.Extensions.Logging;
using Richasy.Bili.Controller.Uwp.Interfaces;
using Richasy.Bili.Models.App.Constants;
using Windows.ApplicationModel;
using Windows.Storage;
using Windows.System.Profile;
using Windows.System.UserProfile;
namespace Richasy.Bili.Controller.Uwp.Modules
{
/// <summary>
/// 应用日志记录模块.
/// </summary>
public class LoggerModule : ILoggerModule
{
private PackageVersion _appVersion;
private PackageVersion _systemVersion;
private CultureInfo _culture;
private string _deviceFamily;
private string _architecture;
private ILogger _logger;
/// <summary>
/// Initializes a new instance of the <see cref="LoggerModule"/> class.
/// </summary>
/// <param name="factory">日志构造工厂.</param>
public LoggerModule(ILoggerFactory factory)
{
LoggerFactory = factory;
Initialize();
}
/// <inheritdoc/>
public ILoggerFactory LoggerFactory { get; private set; }
/// <inheritdoc/>
public void LogInformation(string message)
{
var header = GetHeader();
_logger.LogInformation(header + message + "\n");
}
/// <inheritdoc/>
public void LogError(Exception ex, bool isWarning = false)
{
var header = GetHeader();
if (isWarning)
{
_logger.LogWarning(header + ex.Message + "\n");
_logger.LogTrace(ex, "Warning 堆栈");
}
else
{
_logger.LogError(ex, header);
}
}
private void Initialize()
{
_appVersion = Package.Current.Id.Version;
_culture = GlobalizationPreferences.Languages.Count > 0 ? new CultureInfo(GlobalizationPreferences.Languages.First()) : null;
_deviceFamily = AnalyticsInfo.VersionInfo.DeviceFamily;
var sysVersion = ulong.Parse(AnalyticsInfo.VersionInfo.DeviceFamilyVersion);
_systemVersion = new PackageVersion
{
Major = (ushort)((sysVersion & 0xFFFF000000000000L) >> 48),
Minor = (ushort)((sysVersion & 0x0000FFFF00000000L) >> 32),
Build = (ushort)((sysVersion & 0x00000000FFFF0000L) >> 16),
Revision = (ushort)(sysVersion & 0x000000000000FFFFL),
};
_architecture = Package.Current.Id.Architecture.ToString();
var rootFolder = ApplicationData.Current.LocalFolder;
var logFolderName = ControllerConstants.Names.LoggerFolder;
var logFileName = ControllerConstants.Names.LoggerName;
var fullPath = $"{rootFolder.Path}\\{logFolderName}\\{logFileName}";
LoggerFactory.AddFile(fullPath);
_logger = LoggerFactory.CreateLogger("Richasy.Bili");
}
private string GetHeader()
{
var sysVersion = $"{_systemVersion.Major}.{_systemVersion.Minor}.{_systemVersion.Build}.{_systemVersion.Revision}";
var appVersion = $"{_appVersion.Major}.{_appVersion.Minor}.{_appVersion.Build}.{_appVersion.Revision}";
var builder = new StringBuilder();
builder.AppendLine();
builder.AppendLine($"系统信息:{sysVersion} | {_deviceFamily} | {_architecture}");
builder.AppendLine($"应用信息:{appVersion} | {_culture.DisplayName}");
builder.AppendLine("--------");
return builder.ToString();
}
}
}
......@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Bilibili.App.Interfaces.V1;
using Richasy.Bili.Lib.Interfaces;
......
......@@ -14,6 +14,8 @@ namespace Richasy.Bili.Models.App.Constants
public const string PartitionIndex = "partitionIndex.json";
public const string DocumentaryCategories = "documentaryCategories.json";
public const string ServerFolder = "Server";
public const string LoggerFolder = "Logger";
public const string LoggerName = "AppLog.log";
}
public static class Search
......
......@@ -28,7 +28,7 @@ namespace Richasy.Bili.Models.App.Other
/// <param name="responseHeaders">The HTTP response headers from the response.</param>
/// <param name="statusCode">The HTTP status code from the response.</param>
public ServiceException(ServerResponse error, System.Net.Http.Headers.HttpResponseHeaders responseHeaders, System.Net.HttpStatusCode statusCode, Exception innerException = null)
: base(error?.ToString(), innerException)
: base(error?.Message, innerException)
{
this.Error = error;
this.ResponseHeaders = responseHeaders;
......
......@@ -326,6 +326,8 @@ namespace Richasy.Bili.Models.Enums
FollowRoom,
FailedToGetUserRelation,
NoRoomDescription,
LogEmptied,
FailedToClearLog,
#pragma warning restore SA1602 // Enumeration items should be documented
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册