yukieiji / ExtremeRoles

AmongUs Mod for Advanced User(+90 roles, +1300 options, and Cosmic addon)
GNU General Public License v3.0
59 stars 29 forks source link

日付と時刻の表示形式を変更しているとExtremeRolesのアナウンスが表示されない場合がある #351

Closed aoirint closed 8 months ago

aoirint commented 8 months ago

期待される動作 / Your Expectation

Among Usのタイトル画面から「ニュース」を開き、ExtremeRolesのアナウンス(ExtremeRoles.Announce)を確認しようとした。

スクリーンショット: 正常に表示された場合のExtremeRoles.Announce ![945360_20231224004650_1](https://github.com/yukieiji/ExtremeRoles/assets/27213639/502db4ec-85d4-4102-894f-e10f8a28580a)

実際の動作 / The Reality

ExtremeRolesのAnnounceが表示されず、AmongUs公式のアナウンスだけが表示された。

スクリーンショット: AmongUs公式のアナウンスだけが表示される ![945360_20231224010037_1](https://github.com/yukieiji/ExtremeRoles/assets/27213639/3f7f2478-459f-49dc-adf0-095d66526405)

Windows 10での再現手順

  1. ファイル名を指定して実行(Windows+R)等からintl.cpl(Windowsの設定プログラム「地域」)を実行する
  2. 「追加の設定」ボタンをクリック、「日付」タブを開く
  3. データ形式の「短い形式」をyyyy/MM/dd等からyyyy/MM/dd dddに変更する(タスクバーの時計に曜日が表示されるようになる)
  4. ExtremeRolesを導入したAmong Usを起動する
  5. ExtremeRolesのアナウンスが表示されない
スクリーンショット: 「地域」と「追加の設定」ボタン ![intl_001](https://github.com/yukieiji/ExtremeRoles/assets/27213639/82ccf336-e3ba-4f07-abc9-f762aae837f4)
スクリーンショット: 「日付」タブとデータ形式の「短い形式」 ![intl_002](https://github.com/yukieiji/ExtremeRoles/assets/27213639/febfb5de-baa3-4de2-847f-1c2ba667ec08)

日時データ形式の「短い形式」をyyyy/MM/ddに変更すると、ExtremeRolesのアナウンスが表示されるようになりました。

あなたの意見 / Your Proposal

Windowsの日付と時刻の表示形式の設定によらず、ExtremeRolesのアナウンスが表示されるようにしてほしい。

SavedAnnounceからAnnouncementに変換する処理で、SavedAnnounce.OpenTimeDateTime.ToString()で文字列にされたあとDateTime.Parse()でパースされる流れになっていますが、DateTime.ToString()はロケール設定に基づいて日時を文字列化するようで、DateTime.Parse()が対応していない書式で文字列化された場合に動作しないようです。

SavedAnnounce.Convert()が返すAnnouncement.Dateをタイムゾーン付きのISO 8601文字列にできるとよさそうです。

https://github.com/yukieiji/ExtremeRoles/blob/27687709581e1db0a12f4c41f6f0bc1e24c3270b/ExtremeRoles/Module/ModAnnounce.cs#L41-L52

https://github.com/yukieiji/ExtremeRoles/blob/27687709581e1db0a12f4c41f6f0bc1e24c3270b/ExtremeRoles/Module/ModAnnounce.cs#L113-L116

Visual Studio 2022上でデバッグ実行した際のエラーメッセージ ![image](https://github.com/yukieiji/ExtremeRoles/assets/27213639/18881fe5-f8dc-45a6-a55a-7bea87bec7f5)

バグ発生時のログやエラー / log when issue occur

ExtremeRolesDumpedLogs 2023-12-24T01-09-30.zip

Among Usバージョン/ Among Us Version

Among Us v2023.11.28s

Modバージョン / Mod Version

Extreme Roles v9.2.0.3

リージョン/Region

プレイヤー人数/Player Num

1

使用したオプション/Use Option

option.csv

yukieiji commented 8 months ago

タイムゾーン入れて治るんですかね?この不具合

aoirint commented 8 months ago

ExtremeRoles.Announceリポジトリでのタイムゾーン情報の有無ではなく、DateTime.ToString()の戻り値がロケール設定に依存した文字列になることが本件の原因なので、DateTime.ToString("u")にすれば暫定直りそうとは思っています(ドキュメントを見る限り、これを実行するにはDateTime.ToUniversalTime()でUTCタイムゾーンにする必要があるかもしれません)。

ただ別件で、SavedAnnounce.Convert()から作成されたAnnouncement.Dateは、現状タイムゾーン情報(末尾Zか、末尾+09:00か)を持たない日時文字列なので、DateTime.ParseがJSTではないシステムのタイムゾーンとしてパースした場合、アナウンスのソート順にずれが出る不具合がある可能性はあるかも、と思いました。 このあたりの挙動は、C#のDateTimeがタイムゾーン情報を持たない日時/日時文字列をどう扱うかによりそうで、それはまだよくわかっていません。 Among Us上での公開時刻の制御については、JsonSerializer.Deserializeの仕様にも依存しそうなので、同様にJST以外のタイムゾーンにおける挙動がよくわかっていません。

yukieiji commented 8 months ago

下手にタイムゾーン入れて元々入ってたデータとの整合性が取れなくなっても困る気がするので、曜日とかのデータをドロップしてToString出来るようにするかL256の実装のようにyyyyMMddTHHmmssでToStringするのがいい気がします

yukieiji commented 8 months ago

v9.2.0.5にて修正済み