From 6487df776a3ede23ea2ba40dde1c459da02e9621 Mon Sep 17 00:00:00 2001
From: Natrium <1583803226@qq.com>
Date: Tue, 23 Apr 2024 00:57:34 +0800
Subject: [PATCH 1/5] Fix Announcement time display
---
.../Resource/Localization/SH.en.resx | 12 ++++++--
.../Resource/Localization/SH.id.resx | 12 ++++++--
.../Resource/Localization/SH.ja.resx | 14 ++++++---
.../Resource/Localization/SH.ko.resx | 12 ++++++--
.../Resource/Localization/SH.pt.resx | 12 ++++++--
.../Snap.Hutao/Resource/Localization/SH.resx | 12 ++++++--
.../Resource/Localization/SH.ru.resx | 12 ++++++--
.../Resource/Localization/SH.zh-Hant.resx | 12 ++++++--
.../Announcement/AnnouncementService.cs | 29 ++++++++++++++-----
.../Common/Announcement/AnnouncementRegex.cs | 6 ++++
10 files changed, 101 insertions(+), 32 deletions(-)
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx
index 1f7ec92f..5a42562f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx
@@ -2922,13 +2922,19 @@
Weapon WIKI
- (?:〓Event Duration〓|〓Quest Start Time〓).*?\d\.\dthe Version update(?:after|)Permanently available
+ (?:〓Event Duration〓|〓Quest Start Time〓).*?Permanently.*?Version.*?(\d\.\d).*?update
- 〓Event Duration〓.*?\d\.\d Available throughout the entirety of Version
+ 〓Event Duration〓.*?Available throughout the entirety of Version (\d\.\d)
- (?:〓Event Duration〓|Event Wish Duration|【Availability Duration】|〓Discount Period〓).*?(\d\.\dAfter the Version update).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓Event Duration〓|Event Wish Duration|【Availability Duration】|〓Discount Period〓).*?After.*?(\d\.\d).*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ Dear.*?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
+
+
+ Version \d\.\d Update Maintenance Preview
〓Update Maintenance Duration〓.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.id.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.id.resx
index e80e0912..1602838c 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.id.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.id.resx
@@ -2922,13 +2922,19 @@
Senjata WIKI
- (?:〓Durasi Event〓|〓Waktu Mulai Misi〓).*?\d\.\dthe Version update(?:after|)Selamanya Tersedia
+ (?:〓Durasi Event〓|〓Waktu Mulai Misi〓).*?(\d\.\d)the Version update(?:after|)Selamanya Tersedia
- 〓Durasi Event〓.*?\d\.\d Tersedia selama versi ini
+ 〓Durasi Event〓.*?(\d\.\d) Tersedia selama versi ini
- (?:〓Waktu Acara〓|Waktu Menginginkan|【Waktu Peluncuran】|〓Waktu Diskon〓).*?(\d\.\d Setelah Pembaruan Versi).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓Waktu Acara〓|Waktu Menginginkan|【Waktu Peluncuran】|〓Waktu Diskon〓).*?(\d\.\d) Setelah Pembaruan Versi.*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ 将于<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>进行版本更新维护
+
+
+ \d\.\d版本更新维护预告
〓Durasi Pemeliharaan Pembaruan.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ja.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ja.resx
index 75a9737e..ac931807 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ja.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ja.resx
@@ -2922,19 +2922,25 @@
武器一覧
- (?:〓イベント期間〓|〓任務開始時間〓).*?\d\.\dバージョンアップ(?:完了|)後常設オープン
+ (?:〓イベント期間〓|〓任務開(?:始|放)時間〓).*?(\d\.\d).*?開放
- 〓イベント期間〓.*?\d\.\d当バージョン期間オープン
+ 〓イベント期間〓.*?(\d\.\d)バージョン
- (?:〓イベント期間〓|祈願期間|【開始日時】).*?(\d\.\dバージョンアップ完了後).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓イベント期間〓|祈願期間|【開始日時】).*?(\d\.\d)バージョンアップ.*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ 親愛.*?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
+
+
+ Ver\.\d\.\dバージョンアップのお知らせ
〓メンテナンス時間〓.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
- Ver.\d\.\d.+正式リリース
+ Ver\.\d\.\d.*?正式リリース
{0} 日後に開始
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ko.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ko.resx
index a902c876..b388c318 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ko.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ko.resx
@@ -2922,13 +2922,19 @@
무기 자료
- (?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放
+ (?:〓活动时间〓|〓任务开放时间〓).*?(\d\.\d)版本更新(?:完成|)后永久开放
- 〓活动时间〓.*?\d\.\d版本期间持续开放
+ 〓活动时间〓.*?(\d\.\d)版本期间持续开放
- (?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓活动时间〓|祈愿时间|【上架时间】|〓折扣时间〓).*?(\d\.\d)版本更新后.*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ 将于<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>进行版本更新维护
+
+
+ \d\.\d版本更新维护预告
〓更新时间〓.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.pt.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.pt.resx
index 8ea53d63..b3d00aca 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.pt.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.pt.resx
@@ -2922,13 +2922,19 @@
Wiki de armas
- (?:〓Duração do evento〓|〓Hora de início da missão〓).*?\d\.\da atualização da versão(?:after|)Disponível permanentemente
+ (?:〓Duração do evento〓|〓Hora de início da missão〓).*?(\d\.\d)a atualização da versão(?:after|)Disponível permanentemente
- 〓Duração do evento〓.*?\d\.\d Disponível em toda as versões
+ 〓Duração do evento〓.*?(\d\.\d) Disponível em toda as versões
- (?:〓Duração do evento〓|Duração da oração do evento|【Duração da disponibilidade】).*?(\d\.\dApós a atualização da versão).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓Duração do evento〓|Duração da oração do evento|【Duração da disponibilidade】).*?(\d\.\d)Após a atualização da versão.*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ 将于<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>进行版本更新维护
+
+
+ \d\.\d版本更新维护预告
〓Duração da manutenção da atualização.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
index 6bec3145..49fdaf68 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
@@ -2991,13 +2991,19 @@
武器资料
- (?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放
+ (?:〓活动时间〓|〓任务开放时间〓).*?(\d\.\d)版本更新(?:完成|)后永久开放
- 〓活动时间〓.*?\d\.\d版本期间持续开放
+ 〓活动时间〓.*?(\d\.\d)版本期间持续开放
- (?:〓活动时间〓|祈愿时间|【上架时间】|〓折扣时间〓).*?(\d\.\d版本更新后).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓活动时间〓|祈愿时间|【上架时间】|〓折扣时间〓).*?(\d\.\d)版本更新后.*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ 将于<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>进行版本更新维护
+
+
+ \d\.\d版本更新维护预告
〓更新时间〓.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ru.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ru.resx
index a28ab4ff..394ac05f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ru.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.ru.resx
@@ -2922,13 +2922,19 @@
武器资料
- (?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放
+ (?:〓活动时间〓|〓任务开放时间〓).*?(\d\.\d)版本更新(?:完成|)后永久开放
- 〓活动时间〓.*?\d\.\d版本期间持续开放
+ 〓活动时间〓.*?(\d\.\d)版本期间持续开放
- (?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓活动时间〓|祈愿时间|【上架时间】|〓折扣时间〓).*?(\d\.\d)版本更新后.*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ 将于<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>进行版本更新维护
+
+
+ \d\.\d版本更新维护预告
〓更新时间〓.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.zh-Hant.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.zh-Hant.resx
index b4a9a3fb..26b503f8 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.zh-Hant.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.zh-Hant.resx
@@ -2922,13 +2922,19 @@
武器資料
- (?:〓活動時間〓|〓任務開放時間〓).*?\d\.\d版本更新(?:完成|)後永久開放
+ (?:〓活動時間〓|〓任務開放時間〓).*?(\d\.\d)版本更新(?:完成|)後永久開放
- 〓活動時間〓.*?\d\.\d版本期間持續開放
+ 〓活動時間〓.*?(\d\.\d)版本期間持續開放
- (?:〓活動時間〓|祈願時間|【上架時間】|〓折扣時間〓).*?(\d\.\d版本更新後).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+ (?:〓活動時間〓|祈願時間|【上架時間】|〓折扣時間〓).*?(\d\.\d).*?版本更新後.*?<t class="t_(?:gl|lc)".*?>(.*?)</t>
+
+
+ 親愛.*?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
+
+
+ \d\.\d版本更新維護預告
〓更新時間〓.+?<t class=\"t_(?:gl|lc)\".*?>(.*?)</t>
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
index b2d79bb1..eef346f9 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
@@ -110,37 +110,52 @@ internal sealed partial class AnnouncementService : IAnnouncementService
.Single(wrapper => wrapper.TypeId == 1)
.List;
- // 更新公告
+ // x.x版本更新说明
WebAnnouncement versionUpdate = announcementListWrappers
.Single(wrapper => wrapper.TypeId == 2)
.List
.Single(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
- if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionMatch)
+ if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
{
return;
}
- DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionMatch.Groups[1].ValueSpan, offset);
+ // x.x版本更新维护预告
+ WebAnnouncement versionUpdatePreview = announcementListWrappers
+ .Single(wrapper => wrapper.TypeId == 2)
+ .List
+ .Single(ann => AnnouncementRegex.VersionUpdatePreviewTitleRegex.IsMatch(ann.Title));
+
+ if (AnnouncementRegex.VersionUpdatePreviewTimeRegex.Match(versionUpdatePreview.Content) is not { Success: true } versionUpdatePreviewMatch)
+ {
+ return;
+ }
+
+ Dictionary versionStartTimeDict = new Dictionary();
+ DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
+ DateTimeOffset versionUpdatePreviewTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdatePreviewMatch.Groups[1].ValueSpan, offset);
+ versionStartTimeDict.Add(new Regex("(\\d\\.\\d)").Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
+ versionStartTimeDict.TryAdd(new Regex("(\\d\\.\\d)").Match(versionUpdatePreview.Title).Groups[1].Value, versionUpdatePreviewTime);
foreach (ref readonly WebAnnouncement announcement in CollectionsMarshal.AsSpan(activities))
{
if (AnnouncementRegex.PermanentActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } permanent)
{
- announcement.StartTime = versionUpdateTime;
+ announcement.StartTime = versionStartTimeDict[permanent.Groups[1].Value];
continue;
}
if (AnnouncementRegex.PersistentActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } persistent)
{
- announcement.StartTime = versionUpdateTime;
- announcement.EndTime = versionUpdateTime + TimeSpan.FromDays(42);
+ announcement.StartTime = versionStartTimeDict[persistent.Groups[1].Value];
+ announcement.EndTime = versionStartTimeDict[persistent.Groups[1].Value] + TimeSpan.FromDays(42);
continue;
}
if (AnnouncementRegex.TransientActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } transient)
{
- announcement.StartTime = versionUpdateTime;
+ announcement.StartTime = versionStartTimeDict[transient.Groups[1].Value];
announcement.EndTime = UnsafeDateTimeOffset.ParseDateTime(transient.Groups[2].ValueSpan, offset);
continue;
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementRegex.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementRegex.cs
index eb73d9aa..8ead9877 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementRegex.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementRegex.cs
@@ -13,6 +13,12 @@ internal static partial class AnnouncementRegex
///
public static readonly Regex VersionUpdateTimeRegex = new(SH.WebAnnouncementMatchVersionUpdateTime, RegexOptions.Compiled);
+ ///
+ public static readonly Regex VersionUpdatePreviewTitleRegex = new(SH.WebAnnouncementMatchVersionUpdatePreviewTitle, RegexOptions.Compiled);
+
+ ///
+ public static readonly Regex VersionUpdatePreviewTimeRegex = new(SH.WebAnnouncementMatchVersionUpdatePreviewTime, RegexOptions.Compiled);
+
///
public static readonly Regex TransientActivityAfterUpdateTimeRegex = new(SH.WebAnnouncementMatchTransientActivityTime, RegexOptions.Compiled);
From 09448b71372872278ac95b3698837ae2b4e5ed0d Mon Sep 17 00:00:00 2001
From: Natrium <1583803226@qq.com>
Date: Tue, 23 Apr 2024 11:15:21 +0800
Subject: [PATCH 2/5] fix empty announcement
---
.../Announcement/AnnouncementService.cs | 81 ++++++++++++-------
1 file changed, 53 insertions(+), 28 deletions(-)
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
index eef346f9..153881e9 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
@@ -110,54 +110,79 @@ internal sealed partial class AnnouncementService : IAnnouncementService
.Single(wrapper => wrapper.TypeId == 1)
.List;
- // x.x版本更新说明
- WebAnnouncement versionUpdate = announcementListWrappers
- .Single(wrapper => wrapper.TypeId == 2)
- .List
- .Single(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
+ Dictionary versionStartTimeDict = new Dictionary();
- if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
+ // x.x版本更新说明
+ try
+ {
+ WebAnnouncement versionUpdate = announcementListWrappers
+ .Single(wrapper => wrapper.TypeId == 2)
+ .List
+ .Single(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
+
+ if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
+ {
+ return;
+ }
+
+ DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
+ versionStartTimeDict.Add(new Regex("(\\d\\.\\d)").Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
+ }
+ catch (Exception)
{
- return;
}
// x.x版本更新维护预告
- WebAnnouncement versionUpdatePreview = announcementListWrappers
- .Single(wrapper => wrapper.TypeId == 2)
- .List
- .Single(ann => AnnouncementRegex.VersionUpdatePreviewTitleRegex.IsMatch(ann.Title));
-
- if (AnnouncementRegex.VersionUpdatePreviewTimeRegex.Match(versionUpdatePreview.Content) is not { Success: true } versionUpdatePreviewMatch)
+ try
{
- return;
- }
+ WebAnnouncement versionUpdatePreview = announcementListWrappers
+ .Single(wrapper => wrapper.TypeId == 2)
+ .List
+ .Single(ann => AnnouncementRegex.VersionUpdatePreviewTitleRegex.IsMatch(ann.Title));
- Dictionary versionStartTimeDict = new Dictionary();
- DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
- DateTimeOffset versionUpdatePreviewTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdatePreviewMatch.Groups[1].ValueSpan, offset);
- versionStartTimeDict.Add(new Regex("(\\d\\.\\d)").Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
- versionStartTimeDict.TryAdd(new Regex("(\\d\\.\\d)").Match(versionUpdatePreview.Title).Groups[1].Value, versionUpdatePreviewTime);
+ if (AnnouncementRegex.VersionUpdatePreviewTimeRegex.Match(versionUpdatePreview.Content) is not { Success: true } versionUpdatePreviewMatch)
+ {
+ return;
+ }
+
+ DateTimeOffset versionUpdatePreviewTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdatePreviewMatch.Groups[1].ValueSpan, offset);
+ versionStartTimeDict.TryAdd(new Regex("(\\d\\.\\d)").Match(versionUpdatePreview.Title).Groups[1].Value, versionUpdatePreviewTime);
+ }
+ catch (Exception)
+ {
+ }
foreach (ref readonly WebAnnouncement announcement in CollectionsMarshal.AsSpan(activities))
{
+ DateTimeOffset versionStartTime;
+
if (AnnouncementRegex.PermanentActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } permanent)
{
- announcement.StartTime = versionStartTimeDict[permanent.Groups[1].Value];
- continue;
+ if (versionStartTimeDict.TryGetValue(permanent.Groups[1].Value, out versionStartTime))
+ {
+ announcement.StartTime = versionStartTime;
+ continue;
+ }
}
if (AnnouncementRegex.PersistentActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } persistent)
{
- announcement.StartTime = versionStartTimeDict[persistent.Groups[1].Value];
- announcement.EndTime = versionStartTimeDict[persistent.Groups[1].Value] + TimeSpan.FromDays(42);
- continue;
+ if (versionStartTimeDict.TryGetValue(persistent.Groups[1].Value, out versionStartTime))
+ {
+ announcement.StartTime = versionStartTime;
+ announcement.EndTime = versionStartTime + TimeSpan.FromDays(42);
+ continue;
+ }
}
if (AnnouncementRegex.TransientActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } transient)
{
- announcement.StartTime = versionStartTimeDict[transient.Groups[1].Value];
- announcement.EndTime = UnsafeDateTimeOffset.ParseDateTime(transient.Groups[2].ValueSpan, offset);
- continue;
+ if (versionStartTimeDict.TryGetValue(transient.Groups[1].Value, out versionStartTime))
+ {
+ announcement.StartTime = versionStartTime;
+ announcement.EndTime = UnsafeDateTimeOffset.ParseDateTime(transient.Groups[2].ValueSpan, offset);
+ continue;
+ }
}
MatchCollection matches = AnnouncementRegex.XmlTimeTagRegex().Matches(announcement.Content);
From e02985926dd55eef5963964346dec74d1c3ee6fc Mon Sep 17 00:00:00 2001
From: qhy040404
Date: Tue, 23 Apr 2024 11:33:54 +0800
Subject: [PATCH 3/5] code style
---
.../Announcement/AnnouncementService.cs | 48 ++++++++-----------
1 file changed, 21 insertions(+), 27 deletions(-)
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
index 153881e9..2b0c44d4 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
@@ -112,44 +112,35 @@ internal sealed partial class AnnouncementService : IAnnouncementService
Dictionary versionStartTimeDict = new Dictionary();
- // x.x版本更新说明
- try
- {
- WebAnnouncement versionUpdate = announcementListWrappers
- .Single(wrapper => wrapper.TypeId == 2)
- .List
- .Single(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
+ // 更新公告
+ WebAnnouncement versionUpdate = announcementListWrappers
+ .Single(wrapper => wrapper.TypeId == 2)
+ .List
+ .Single(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
- if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
- {
- return;
- }
-
- DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
- versionStartTimeDict.Add(new Regex("(\\d\\.\\d)").Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
- }
- catch (Exception)
+ if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
{
+ return;
}
- // x.x版本更新维护预告
- try
- {
- WebAnnouncement versionUpdatePreview = announcementListWrappers
- .Single(wrapper => wrapper.TypeId == 2)
- .List
- .Single(ann => AnnouncementRegex.VersionUpdatePreviewTitleRegex.IsMatch(ann.Title));
+ DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
+ versionStartTimeDict.Add(VersionRegex().Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
+ // 更新预告
+ WebAnnouncement? versionUpdatePreview = announcementListWrappers
+ .Single(wrapper => wrapper.TypeId == 2)
+ .List
+ .SingleOrDefault(ann => AnnouncementRegex.VersionUpdatePreviewTitleRegex.IsMatch(ann.Title));
+
+ if (versionUpdatePreview is not null)
+ {
if (AnnouncementRegex.VersionUpdatePreviewTimeRegex.Match(versionUpdatePreview.Content) is not { Success: true } versionUpdatePreviewMatch)
{
return;
}
DateTimeOffset versionUpdatePreviewTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdatePreviewMatch.Groups[1].ValueSpan, offset);
- versionStartTimeDict.TryAdd(new Regex("(\\d\\.\\d)").Match(versionUpdatePreview.Title).Groups[1].Value, versionUpdatePreviewTime);
- }
- catch (Exception)
- {
+ versionStartTimeDict.TryAdd(VersionRegex().Match(versionUpdatePreview.Title).Groups[1].Value, versionUpdatePreviewTime);
}
foreach (ref readonly WebAnnouncement announcement in CollectionsMarshal.AsSpan(activities))
@@ -217,4 +208,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService
announcement.EndTime = max;
}
}
+
+ [GeneratedRegex("(\\d\\.\\d)")]
+ private static partial Regex VersionRegex();
}
\ No newline at end of file
From a60c4bff08e1731993c4746407a865990b417d2c Mon Sep 17 00:00:00 2001
From: Natrium <1583803226@qq.com>
Date: Tue, 23 Apr 2024 11:52:44 +0800
Subject: [PATCH 4/5] fix empty announcement when localized regex not match
---
.../Service/Announcement/AnnouncementService.cs | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
index 2b0c44d4..f2b361bf 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
@@ -113,18 +113,21 @@ internal sealed partial class AnnouncementService : IAnnouncementService
Dictionary versionStartTimeDict = new Dictionary();
// 更新公告
- WebAnnouncement versionUpdate = announcementListWrappers
+ WebAnnouncement? versionUpdate = announcementListWrappers
.Single(wrapper => wrapper.TypeId == 2)
.List
- .Single(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
+ .SingleOrDefault(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
- if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
+ if (versionUpdate is not null)
{
- return;
- }
+ if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
+ {
+ return;
+ }
- DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
- versionStartTimeDict.Add(VersionRegex().Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
+ DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
+ versionStartTimeDict.Add(VersionRegex().Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
+ }
// 更新预告
WebAnnouncement? versionUpdatePreview = announcementListWrappers
From 15212d8f21a918a87f5b1458b285cb2dab2d55bc Mon Sep 17 00:00:00 2001
From: Lightczx <1686188646@qq.com>
Date: Tue, 23 Apr 2024 15:55:53 +0800
Subject: [PATCH 5/5] code style
---
.../Announcement/AnnouncementService.cs | 32 ++++++++-----------
1 file changed, 14 insertions(+), 18 deletions(-)
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
index f2b361bf..63507a2f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Announcement/AnnouncementService.cs
@@ -7,6 +7,7 @@ using Snap.Hutao.Service.Announcement;
using Snap.Hutao.Web.Hoyolab;
using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement;
using Snap.Hutao.Web.Response;
+using System.Collections.Specialized;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
@@ -110,15 +111,15 @@ internal sealed partial class AnnouncementService : IAnnouncementService
.Single(wrapper => wrapper.TypeId == 1)
.List;
- Dictionary versionStartTimeDict = new Dictionary();
+ // 游戏公告
+ List announcements = announcementListWrappers
+ .Single(wrapper => wrapper.TypeId == 2)
+ .List;
+
+ Dictionary versionStartTimes = [];
// 更新公告
- WebAnnouncement? versionUpdate = announcementListWrappers
- .Single(wrapper => wrapper.TypeId == 2)
- .List
- .SingleOrDefault(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title));
-
- if (versionUpdate is not null)
+ if (announcements.SingleOrDefault(ann => AnnouncementRegex.VersionUpdateTitleRegex.IsMatch(ann.Title)) is { } versionUpdate)
{
if (AnnouncementRegex.VersionUpdateTimeRegex.Match(versionUpdate.Content) is not { Success: true } versionUpdateMatch)
{
@@ -126,16 +127,11 @@ internal sealed partial class AnnouncementService : IAnnouncementService
}
DateTimeOffset versionUpdateTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdateMatch.Groups[1].ValueSpan, offset);
- versionStartTimeDict.Add(VersionRegex().Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
+ versionStartTimes.TryAdd(VersionRegex().Match(versionUpdate.Title).Groups[1].Value, versionUpdateTime);
}
// 更新预告
- WebAnnouncement? versionUpdatePreview = announcementListWrappers
- .Single(wrapper => wrapper.TypeId == 2)
- .List
- .SingleOrDefault(ann => AnnouncementRegex.VersionUpdatePreviewTitleRegex.IsMatch(ann.Title));
-
- if (versionUpdatePreview is not null)
+ if (announcements.SingleOrDefault(ann => AnnouncementRegex.VersionUpdatePreviewTitleRegex.IsMatch(ann.Title)) is { } versionUpdatePreview)
{
if (AnnouncementRegex.VersionUpdatePreviewTimeRegex.Match(versionUpdatePreview.Content) is not { Success: true } versionUpdatePreviewMatch)
{
@@ -143,7 +139,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService
}
DateTimeOffset versionUpdatePreviewTime = UnsafeDateTimeOffset.ParseDateTime(versionUpdatePreviewMatch.Groups[1].ValueSpan, offset);
- versionStartTimeDict.TryAdd(VersionRegex().Match(versionUpdatePreview.Title).Groups[1].Value, versionUpdatePreviewTime);
+ versionStartTimes.TryAdd(VersionRegex().Match(versionUpdatePreview.Title).Groups[1].Value, versionUpdatePreviewTime);
}
foreach (ref readonly WebAnnouncement announcement in CollectionsMarshal.AsSpan(activities))
@@ -152,7 +148,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService
if (AnnouncementRegex.PermanentActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } permanent)
{
- if (versionStartTimeDict.TryGetValue(permanent.Groups[1].Value, out versionStartTime))
+ if (versionStartTimes.TryGetValue(permanent.Groups[1].Value, out versionStartTime))
{
announcement.StartTime = versionStartTime;
continue;
@@ -161,7 +157,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService
if (AnnouncementRegex.PersistentActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } persistent)
{
- if (versionStartTimeDict.TryGetValue(persistent.Groups[1].Value, out versionStartTime))
+ if (versionStartTimes.TryGetValue(persistent.Groups[1].Value, out versionStartTime))
{
announcement.StartTime = versionStartTime;
announcement.EndTime = versionStartTime + TimeSpan.FromDays(42);
@@ -171,7 +167,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService
if (AnnouncementRegex.TransientActivityAfterUpdateTimeRegex.Match(announcement.Content) is { Success: true } transient)
{
- if (versionStartTimeDict.TryGetValue(transient.Groups[1].Value, out versionStartTime))
+ if (versionStartTimes.TryGetValue(transient.Groups[1].Value, out versionStartTime))
{
announcement.StartTime = versionStartTime;
announcement.EndTime = UnsafeDateTimeOffset.ParseDateTime(transient.Groups[2].ValueSpan, offset);