9 Commits

Author SHA1 Message Date
4758b65159 build: Update project version 2025-06-17 01:16:22 +08:00
de3196d38a fix: Revise the tag of a log point 2025-06-17 01:16:11 +08:00
c2311fb7a4 feat: Add new event sources 2025-06-17 01:15:25 +08:00
7562be2c09 ci: Update plugins 2025-06-17 01:12:55 +08:00
a8f46113d4 build: Update project version 2025-06-06 19:33:15 +08:00
99736f114d style: Code cleanup 2025-06-06 19:32:42 +08:00
4d1a008106 feat: Add logs 2025-06-06 19:32:31 +08:00
9318cbca4e feat: Add new event sources 2025-06-06 19:31:27 +08:00
a162f345c4 ci: Update plugins 2025-06-06 19:30:21 +08:00
100 changed files with 1141 additions and 54 deletions

View File

@@ -1,19 +1,60 @@
using Cryville.Common.Font; using Cryville.Common.Font;
using Cryville.Common.Logging;
using Cryville.Common.Unity.UI; using Cryville.Common.Unity.UI;
using Cryville.Culture; using Cryville.Culture;
using System;
using System.Globalization;
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
using UnityEngine; using UnityEngine;
using Logger = Cryville.Common.Logging.Logger;
namespace Cryville.EEW.Unity { namespace Cryville.EEW.Unity {
class App { class App {
public static string AppDataPath { get; private set; }
public static Logger MainLogger { get; private set; }
static FileStream _logFileStream;
static StreamLoggerListener _logWriter;
static bool _init; static bool _init;
public static void Init() { public static void Init() {
if (_init) return; if (_init) return;
_init = true; _init = true;
AppDataPath = Application.persistentDataPath;
var logPath = Directory.CreateDirectory(Path.Combine(AppDataPath, "logs"));
_logFileStream = new FileStream(
Path.Combine(
logPath.FullName,
string.Format(
CultureInfo.InvariantCulture,
"{0}.log",
DateTimeOffset.UtcNow.ToString("yyyyMMddHHmmssfff", CultureInfo.InvariantCulture)
)
),
FileMode.Create, FileAccess.Write, FileShare.Read
);
_logWriter = new StreamLoggerListener(_logFileStream) { AutoFlush = true };
MainLogger = new Logger();
var listener = new InstantLoggerListener();
listener.Log += MainLogger.Log;
MainLogger.AddListener(_logWriter);
Application.logMessageReceivedThreaded += OnInternalLog;
MainLogger.Log(1, "App", null, "App Version: {0}", Application.version);
MainLogger.Log(1, "App", null, "Unity Version: {0}", Application.unityVersion);
MainLogger.Log(1, "App", null, "Operating System: {0}, Unity = {1}, Family = {2}", Environment.OSVersion, SystemInfo.operatingSystem, SystemInfo.operatingSystemFamily);
MainLogger.Log(1, "App", null, "Platform: Build = {0}, Unity = {1}", PlatformConfig.Name, Application.platform);
MainLogger.Log(1, "App", null, "Culture: {0}, UI = {1}, Unity = {2}", SharedCultures.CurrentCulture, SharedCultures.CurrentUICulture, Application.systemLanguage);
MainLogger.Log(1, "App", null, "Device: Model = {0}, Type = {1}", SystemInfo.deviceModel, SystemInfo.deviceType);
MainLogger.Log(1, "App", null, "Graphics: Name = {0}, Type = {1}, Vendor = {2}, Version = {3}", SystemInfo.graphicsDeviceName, SystemInfo.graphicsDeviceType, SystemInfo.graphicsDeviceVendor, SystemInfo.graphicsDeviceVersion);
MainLogger.Log(1, "App", null, "Processor: Count = {0}, Frequency = {1}MHz, Type = {2}", SystemInfo.processorCount, SystemInfo.processorFrequency, SystemInfo.processorType);
MainLogger.Log(1, "App", null, "Initializing font manager");
foreach (var res in Resources.LoadAll<TextAsset>("cldr/common/validity")) { foreach (var res in Resources.LoadAll<TextAsset>("cldr/common/validity")) {
IdValidity.Load(LoadXmlDocument(res)); IdValidity.Load(LoadXmlDocument(res));
} }
@@ -25,7 +66,10 @@ namespace Cryville.EEW.Unity {
}; };
TMPLocalizedText.DefaultShader = Resources.Load<Shader>(PlatformConfig.TextShader); TMPLocalizedText.DefaultShader = Resources.Load<Shader>(PlatformConfig.TextShader);
MainLogger.Log(1, "App", null, "Loading config");
SharedSettings.Instance.Init(); SharedSettings.Instance.Init();
MainLogger.Log(1, "App", null, "Initialized");
} }
static readonly Encoding _encoding = new UTF8Encoding(false, true); static readonly Encoding _encoding = new UTF8Encoding(false, true);
@@ -40,5 +84,16 @@ namespace Cryville.EEW.Unity {
using var reader = XmlReader.Create(stream, _xmlSettings); using var reader = XmlReader.Create(stream, _xmlSettings);
return XDocument.Load(reader); return XDocument.Load(reader);
} }
static void OnInternalLog(string condition, string stackTrace, LogType type) {
var l = type switch {
LogType.Log => 1,
LogType.Assert => 2,
LogType.Warning => 3,
LogType.Error or LogType.Exception => 4,
_ => 1,
};
MainLogger.Log(l, "Internal", null, "{0}\n{1}", condition, stackTrace);
}
} }
} }

View File

@@ -1,3 +1,3 @@
using System.Reflection; using System.Reflection;
[assembly: AssemblyVersion("0.0.6")] [assembly: AssemblyVersion("0.0.8")]

View File

@@ -55,23 +55,25 @@ namespace Cryville.EEW.Unity {
[JsonDerivedType(typeof(BMKGOpenDataEventSourceConfig), "BMKGOpenData")] [JsonDerivedType(typeof(BMKGOpenDataEventSourceConfig), "BMKGOpenData")]
[JsonDerivedType(typeof(CWAOpenDataEventSourceConfig), "CWAOpenData")] [JsonDerivedType(typeof(CWAOpenDataEventSourceConfig), "CWAOpenData")]
[JsonDerivedType(typeof(EMSCRealTimeEventSourceConfig), "EMSCRealTime")] [JsonDerivedType(typeof(EMSCRealTimeEventSourceConfig), "EMSCRealTime")]
[JsonDerivedType(typeof(GeoNetEventSourceConfig), "GeoNet")]
[JsonDerivedType(typeof(GlobalQuakeServerEventSourceConfig), "GlobalQuakeServer")] [JsonDerivedType(typeof(GlobalQuakeServerEventSourceConfig), "GlobalQuakeServer")]
[JsonDerivedType(typeof(GlobalQuakeServer15EventSourceConfig), "GlobalQuakeServer15")] [JsonDerivedType(typeof(GlobalQuakeServer15EventSourceConfig), "GlobalQuakeServer15")]
[JsonDerivedType(typeof(JMAAtomEventSourceConfig), "JMAAtom")] [JsonDerivedType(typeof(JMAAtomEventSourceConfig), "JMAAtom")]
[JsonDerivedType(typeof(NOAAEventSourceConfig), "NOAA")] [JsonDerivedType(typeof(NOAAEventSourceConfig), "NOAA")]
[JsonDerivedType(typeof(UpdateCheckerEventSourceConfig), "UpdateChecker")] [JsonDerivedType(typeof(UpdateCheckerEventSourceConfig), "UpdateChecker")]
[JsonDerivedType(typeof(USGSQuakeMLEventSourceConfig), "USGSQuakeML")] [JsonDerivedType(typeof(USGSEventSourceConfig), "USGSQuakeML")]
[JsonDerivedType(typeof(WolfxEventSourceConfig), "Wolfx")] [JsonDerivedType(typeof(WolfxEventSourceConfig), "Wolfx")]
abstract record EventSourceConfig(); abstract record EventSourceConfig();
record BMKGOpenDataEventSourceConfig([property: JsonRequired] string[] Subtypes) : EventSourceConfig; record BMKGOpenDataEventSourceConfig([property: JsonRequired] string[] Subtypes) : EventSourceConfig;
record CWAOpenDataEventSourceConfig([property: JsonRequired] string Subtype, [property: JsonRequired] string Token) : EventSourceConfig; record CWAOpenDataEventSourceConfig([property: JsonRequired] string Subtype, [property: JsonRequired] string Token) : EventSourceConfig;
record EMSCRealTimeEventSourceConfig() : EventSourceConfig; record EMSCRealTimeEventSourceConfig() : EventSourceConfig;
record GeoNetEventSourceConfig(int MinimumMMI = 3, bool DoGetFullHistory = false, bool DoGetStrongMotionInfo = true) : EventSourceConfig;
record GlobalQuakeServerEventSourceConfig([property: JsonRequired] string Host, int Port = 38000) : EventSourceConfig; record GlobalQuakeServerEventSourceConfig([property: JsonRequired] string Host, int Port = 38000) : EventSourceConfig;
record GlobalQuakeServer15EventSourceConfig(string Host, int Port = 38000) : GlobalQuakeServerEventSourceConfig(Host, Port); record GlobalQuakeServer15EventSourceConfig(string Host, int Port = 38000) : GlobalQuakeServerEventSourceConfig(Host, Port);
record JMAAtomEventSourceConfig(IReadOnlyCollection<string> Filter = null, bool IsFilterWhitelist = false) : EventSourceConfig; record JMAAtomEventSourceConfig(IReadOnlyCollection<string> Filter = null, bool IsFilterWhitelist = false) : EventSourceConfig;
record NOAAEventSourceConfig([property: JsonRequired] string Subtype) : EventSourceConfig; record NOAAEventSourceConfig([property: JsonRequired] string Subtype) : EventSourceConfig;
record UpdateCheckerEventSourceConfig : EventSourceConfig; record UpdateCheckerEventSourceConfig : EventSourceConfig;
record USGSQuakeMLEventSourceConfig([property: JsonRequired] string Subtype) : EventSourceConfig; record USGSEventSourceConfig([property: JsonRequired] string Subtype, bool UseGeoJSONFeeds, string[] Products) : EventSourceConfig;
record WolfxEventSourceConfig(IReadOnlyCollection<string> Filter = null, bool IsFilterWhitelist = false, bool UseRawCENCLocationName = false) : EventSourceConfig; record WolfxEventSourceConfig(IReadOnlyCollection<string> Filter = null, bool IsFilterWhitelist = false, bool UseRawCENCLocationName = false) : EventSourceConfig;
[JsonSerializable(typeof(Config))] [JsonSerializable(typeof(Config))]

View File

@@ -2,12 +2,14 @@ using Cryville.EEW.BMKGOpenData.Map;
using Cryville.EEW.Core; using Cryville.EEW.Core;
using Cryville.EEW.CWAOpenData.Map; using Cryville.EEW.CWAOpenData.Map;
using Cryville.EEW.EMSC.Map; using Cryville.EEW.EMSC.Map;
using Cryville.EEW.GeoNet.Map;
using Cryville.EEW.GlobalQuake.Map; using Cryville.EEW.GlobalQuake.Map;
using Cryville.EEW.JMAAtom.Map; using Cryville.EEW.JMAAtom.Map;
using Cryville.EEW.Map; using Cryville.EEW.Map;
using Cryville.EEW.NOAA.Map; using Cryville.EEW.NOAA.Map;
using Cryville.EEW.QuakeML.Map; using Cryville.EEW.QuakeML.Map;
using Cryville.EEW.Report; using Cryville.EEW.Report;
using Cryville.EEW.USGS.Map;
using Cryville.EEW.Wolfx.Map; using Cryville.EEW.Wolfx.Map;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
@@ -135,12 +137,16 @@ namespace Cryville.EEW.Unity.Map {
new CWATsunamiMapGenerator(), new CWATsunamiMapGenerator(),
new EMSCRealTimeEventMapGenerator(), new EMSCRealTimeEventMapGenerator(),
new FujianEEWMapGenerator(), new FujianEEWMapGenerator(),
new GeoNetQuakeHistoryMapGenerator(),
new GeoNetQuakeMapGenerator(),
new GeoNetStrongMapGenerator(),
new GlobalQuakeMapViewGenerator(), new GlobalQuakeMapViewGenerator(),
new JMAAtomMapGenerator(), new JMAAtomMapGenerator(),
new JMAEEWMapGenerator(), new JMAEEWMapGenerator(),
new NOAAMapGenerator(), new NOAAMapGenerator(),
new QuakeMLEventMapGenerator(), new QuakeMLEventMapGenerator(),
new SichuanEEWMapGenerator(), new SichuanEEWMapGenerator(),
new USGSContoursMapGenerator(),
}); });
public UnityMapElement Build(object e, out CultureInfo culture, out int order) { public UnityMapElement Build(object e, out CultureInfo culture, out int order) {
culture = CultureInfo.InvariantCulture; culture = CultureInfo.InvariantCulture;

View File

@@ -40,7 +40,7 @@ namespace Cryville.EEW.Unity.Map {
_req.SendWebRequest(); _req.SendWebRequest();
} }
catch (Exception ex) { catch (Exception ex) {
Debug.LogException(ex); App.MainLogger.Log(4, "Map", null, "An error occurred when loading map tile {0}: {1}", _localFile, ex);
} }
_isReady = false; _isReady = false;
} }
@@ -51,7 +51,7 @@ namespace Cryville.EEW.Unity.Map {
_sprite = Sprite.Create(_tex, new Rect(0, 0, _tex.width, _tex.height), Vector2.zero, _tex.height, 0, SpriteMeshType.FullRect, Vector4.zero, false); _sprite = Sprite.Create(_tex, new Rect(0, 0, _tex.width, _tex.height), Vector2.zero, _tex.height, 0, SpriteMeshType.FullRect, Vector4.zero, false);
} }
else { else {
Debug.LogError(_texHandler.error); App.MainLogger.Log(4, "Map", null, "An error occurred when loading map tile {0}: {1}", _localFile, _texHandler.error);
_localFile.Delete(); _localFile.Delete();
} }
_req.Dispose(); _req.Dispose();

View File

@@ -13,6 +13,7 @@ namespace Cryville.EEW.Unity {
}; };
protected override Stream Open(string path) { protected override Stream Open(string path) {
App.MainLogger.Log(0, "Audio", null, "Opening audio file {0}", path);
path = Path.Combine(Application.streamingAssetsPath, "Sounds", path + ".ogg"); path = Path.Combine(Application.streamingAssetsPath, "Sounds", path + ".ogg");
if (!File.Exists(path)) return null; if (!File.Exists(path)) return null;
return new FileStream(path, FileMode.Open, FileAccess.Read); return new FileStream(path, FileMode.Open, FileAccess.Read);

View File

@@ -9,6 +9,7 @@ namespace Cryville.EEW.Unity {
readonly ISpVoice _voice; readonly ISpVoice _voice;
public TTSWorker() : base(CreateSoundPlayer()) { public TTSWorker() : base(CreateSoundPlayer()) {
App.MainLogger.Log(1, "Audio", null, "Initializing TTS worker");
try { try {
_voice = new SpVoiceClass(); _voice = new SpVoiceClass();
} }
@@ -16,10 +17,12 @@ namespace Cryville.EEW.Unity {
} }
static SoundPlayer CreateSoundPlayer() { static SoundPlayer CreateSoundPlayer() {
App.MainLogger.Log(1, "Audio", null, "Creating sound player");
try { try {
return new SoundPlayer(); return new SoundPlayer();
} }
catch (InvalidOperationException) { catch (InvalidOperationException ex) {
App.MainLogger.Log(3, "Audio", null, "An error occurred when creating sound player: {0}", ex);
return null; return null;
} }
} }
@@ -37,11 +40,13 @@ namespace Cryville.EEW.Unity {
(uint)(SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak), (uint)(SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak),
out _ out _
); );
App.MainLogger.Log(0, "Audio", null, "TTS ({0}): {1}", culture, content);
return Task.CompletedTask; return Task.CompletedTask;
} }
protected override void StopCurrent() { protected override void StopCurrent() {
if (_voice == null) return; if (_voice == null) return;
App.MainLogger.Log(0, "Audio", null, "TTS stopping current");
_voice.Skip("SENTENCE", int.MaxValue, out _); _voice.Skip("SENTENCE", int.MaxValue, out _);
} }
} }

View File

@@ -5,6 +5,8 @@ using Cryville.EEW.CWAOpenData;
using Cryville.EEW.CWAOpenData.Model; using Cryville.EEW.CWAOpenData.Model;
using Cryville.EEW.CWAOpenData.TTS; using Cryville.EEW.CWAOpenData.TTS;
using Cryville.EEW.EMSC; using Cryville.EEW.EMSC;
using Cryville.EEW.GeoNet;
using Cryville.EEW.GeoNet.TTS;
using Cryville.EEW.GlobalQuake; using Cryville.EEW.GlobalQuake;
using Cryville.EEW.JMAAtom; using Cryville.EEW.JMAAtom;
using Cryville.EEW.JMAAtom.TTS; using Cryville.EEW.JMAAtom.TTS;
@@ -58,6 +60,7 @@ namespace Cryville.EEW.Unity {
} }
void Start() { void Start() {
App.MainLogger.Log(1, "App", null, "Initializing localized resources manager");
LocalizedResources.Init(new LocalizedResourcesManager()); LocalizedResources.Init(new LocalizedResourcesManager());
RegisterViewModelGenerators(_worker); RegisterViewModelGenerators(_worker);
RegisterTTSMessageGenerators(_worker); RegisterTTSMessageGenerators(_worker);
@@ -71,6 +74,7 @@ namespace Cryville.EEW.Unity {
_worker.Reported += OnReported; _worker.Reported += OnReported;
_grouper.GroupUpdated += OnGroupUpdated; _grouper.GroupUpdated += OnGroupUpdated;
_grouper.GroupRemoved += OnGroupRemoved; _grouper.GroupRemoved += OnGroupRemoved;
App.MainLogger.Log(1, "App", null, "Worker ready");
Task.Run(() => GatewayVerify(_cancellationTokenSource.Token)).ContinueWith(task => { Task.Run(() => GatewayVerify(_cancellationTokenSource.Token)).ContinueWith(task => {
if (task.IsFaulted) { if (task.IsFaulted) {
OnReported(this, new() { Title = task.Exception.Message }); OnReported(this, new() { Title = task.Exception.Message });
@@ -100,12 +104,18 @@ namespace Cryville.EEW.Unity {
worker.RegisterViewModelGenerator(new CWATsunamiRVMGenerator()); worker.RegisterViewModelGenerator(new CWATsunamiRVMGenerator());
worker.RegisterViewModelGenerator(new EMSCRealTimeEventRVMGenerator()); worker.RegisterViewModelGenerator(new EMSCRealTimeEventRVMGenerator());
worker.RegisterViewModelGenerator(new FujianEEWRVMGenerator()); worker.RegisterViewModelGenerator(new FujianEEWRVMGenerator());
worker.RegisterViewModelGenerator(new GeoNetQuakeHistoryRVMGenerator());
worker.RegisterViewModelGenerator(new GeoNetQuakeRVMGenerator());
worker.RegisterViewModelGenerator(new GeoNetStrongRVMGenerator());
worker.RegisterViewModelGenerator(new GlobalQuakeRVMGenerator()); worker.RegisterViewModelGenerator(new GlobalQuakeRVMGenerator());
worker.RegisterViewModelGenerator(new JMAAtomRVMGenerator()); worker.RegisterViewModelGenerator(new JMAAtomRVMGenerator());
worker.RegisterViewModelGenerator(new JMAEEWRVMGenerator()); worker.RegisterViewModelGenerator(new JMAEEWRVMGenerator());
worker.RegisterViewModelGenerator(new NOAAAtomRVMGenerator()); worker.RegisterViewModelGenerator(new NOAAAtomRVMGenerator());
worker.RegisterViewModelGenerator(new QuakeMLEventRVMGenerator()); var quakemlEventRVMGenerator = new QuakeMLEventRVMGenerator();
quakemlEventRVMGenerator.AddExtension(new USGSQuakeMLExtension());
worker.RegisterViewModelGenerator(quakemlEventRVMGenerator);
worker.RegisterViewModelGenerator(new SichuanEEWRVMGenerator()); worker.RegisterViewModelGenerator(new SichuanEEWRVMGenerator());
worker.RegisterViewModelGenerator(new USGSContoursRVMGenerator());
worker.RegisterViewModelGenerator(new VersionRVMGenerator()); worker.RegisterViewModelGenerator(new VersionRVMGenerator());
} }
CENCEarthquakeTTSMessageGenerator _cencEarthquakeTTSMessageGenerator; CENCEarthquakeTTSMessageGenerator _cencEarthquakeTTSMessageGenerator;
@@ -117,6 +127,9 @@ namespace Cryville.EEW.Unity {
worker.RegisterTTSMessageGenerator(new CWAEEWTTSMessageGenerator()); worker.RegisterTTSMessageGenerator(new CWAEEWTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new CWATsunamiTTSMessageGenerator()); worker.RegisterTTSMessageGenerator(new CWATsunamiTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new FujianEEWTTSMessageGenerator()); worker.RegisterTTSMessageGenerator(new FujianEEWTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new GeoNetQuakeHistoryTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new GeoNetQuakeTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new GeoNetStrongTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new JMAAtomTTSMessageGenerator()); worker.RegisterTTSMessageGenerator(new JMAAtomTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new JMAEEWTTSMessageGenerator()); worker.RegisterTTSMessageGenerator(new JMAEEWTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new NOAATTSMessageGenerator()); worker.RegisterTTSMessageGenerator(new NOAATTSMessageGenerator());
@@ -125,6 +138,7 @@ namespace Cryville.EEW.Unity {
bool _verified; bool _verified;
void BuildWorkers() { void BuildWorkers() {
App.MainLogger.Log(1, "App", null, "Building workers");
#if UNITY_EDITOR #if UNITY_EDITOR
_worker.AddWorker(new WolfxWorker(new Uri("ws://localhost:9995/wolfx"))); _worker.AddWorker(new WolfxWorker(new Uri("ws://localhost:9995/wolfx")));
_worker.AddWorker(new JMAAtomWorker(new Uri("http://localhost:9095/eqvol.xml"))); _worker.AddWorker(new JMAAtomWorker(new Uri("http://localhost:9095/eqvol.xml")));
@@ -139,25 +153,29 @@ namespace Cryville.EEW.Unity {
#else #else
foreach (var source in SharedSettings.Instance.EventSources) { foreach (var source in SharedSettings.Instance.EventSources) {
_worker.AddWorker(source switch { _worker.AddWorker(source switch {
BMKGOpenDataEventSourceConfig bmkgOpenData => BuildBMKGOpenDataWorkerUris(new BMKGOpenDataWorker(new("https://data.bmkg.go.id/DataMKG/TEWS/autogempa.json")), bmkgOpenData), BMKGOpenDataEventSourceConfig bmkgOpenData => BuildBMKGOpenDataWorkerUris(new(new("https://data.bmkg.go.id/DataMKG/TEWS/autogempa.json")), bmkgOpenData),
CWAOpenDataEventSourceConfig cwaOpenData => cwaOpenData.Subtype switch { CWAOpenDataEventSourceConfig cwaOpenData => cwaOpenData.Subtype switch {
"E-A0014-001" => new CWAReportWorker<Tsunami>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0014-001"), cwaOpenData.Token, 1440, 17280), "E-A0014-001" => new CWAReportWorker<Tsunami>(new("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0014-001"), cwaOpenData.Token, 1440, 17280),
"E-A0015-001" => new CWAReportWorker<Earthquake>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001"), cwaOpenData.Token), "E-A0015-001" => new CWAReportWorker<Earthquake>(new("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001"), cwaOpenData.Token),
"E-A0016-001" => new CWAReportWorker<Earthquake>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0016-001"), cwaOpenData.Token), "E-A0016-001" => new CWAReportWorker<Earthquake>(new("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0016-001"), cwaOpenData.Token),
_ => throw new InvalidOperationException("Unknown CWA open data sub-type."), _ => throw new InvalidOperationException("Unknown CWA open data sub-type."),
}, },
EMSCRealTimeEventSourceConfig => new EMSCRealTimeWorker(new("wss://www.seismicportal.eu/standing_order/websocket")), EMSCRealTimeEventSourceConfig => new EMSCRealTimeWorker(new("wss://www.seismicportal.eu/standing_order/websocket")),
GeoNetEventSourceConfig geoNet => BuildGeoNetWorker(new(new("https://api.geonet.org.nz/quake"), new("https://api.geonet.org.nz/quake/history/index"), new("https://api.geonet.org.nz/intensity/strong/processed/index")), geoNet),
GlobalQuakeServer15EventSourceConfig gq => new GlobalQuakeWorker15(gq.Host, gq.Port), GlobalQuakeServer15EventSourceConfig gq => new GlobalQuakeWorker15(gq.Host, gq.Port),
GlobalQuakeServerEventSourceConfig gq => new GlobalQuakeWorker(gq.Host, gq.Port), GlobalQuakeServerEventSourceConfig gq => new GlobalQuakeWorker(gq.Host, gq.Port),
JMAAtomEventSourceConfig jmaAtom => BuildJMAAtomWorkerFilter(new JMAAtomWorker(new("https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml")), jmaAtom), JMAAtomEventSourceConfig jmaAtom => BuildJMAAtomWorkerFilter(new(new("https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml")), jmaAtom),
NOAAEventSourceConfig noaaAtom => noaaAtom.Subtype switch { NOAAEventSourceConfig noaaAtom => noaaAtom.Subtype switch {
"PAAQ" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PAAQAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PAAQ"), "PAAQ" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PAAQAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PAAQ"),
"PHEB" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PHEBAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PHEB"), "PHEB" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PHEBAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PHEB"),
_ => throw new InvalidOperationException("Unknown NOAA sub-type."), _ => throw new InvalidOperationException("Unknown NOAA sub-type."),
}, },
UpdateCheckerEventSourceConfig => new UpdateCheckerWorker(typeof(Worker).Assembly.GetName().Version?.ToString(3) ?? "", "unity"), UpdateCheckerEventSourceConfig => new UpdateCheckerWorker(typeof(Worker).Assembly.GetName().Version?.ToString(3) ?? "", "unity"),
USGSQuakeMLEventSourceConfig usgsQuakeML => BuildUSGSQuakeMLWorkerUri(new USGSQuakeMLWorker(new Uri("https://earthquake.usgs.gov/earthquakes/feed/v1.0/quakeml.php")), usgsQuakeML), USGSEventSourceConfig usgs => BuildUSGSWorker(usgs.UseGeoJSONFeeds
WolfxEventSourceConfig wolfx => BuildWolfxWorkerFilter(new WolfxWorker(new Uri("wss://ws-api.wolfx.jp/all_eew")), wolfx), ? new USGSGeoJSONWorker(new Uri("https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php"))
: new USGSQuakeMLWorker(new Uri("https://earthquake.usgs.gov/earthquakes/feed/v1.0/quakeml.php"))
, usgs),
WolfxEventSourceConfig wolfx => BuildWolfxWorkerFilter(new WolfxWorker(new("wss://ws-api.wolfx.jp/all_eew")), wolfx),
_ => throw new InvalidOperationException("Unknown event source type."), _ => throw new InvalidOperationException("Unknown event source type."),
}); });
} }
@@ -190,8 +208,22 @@ namespace Cryville.EEW.Unity {
worker.SetDataUris(config.Subtypes.Select(i => new Uri(string.Format(CultureInfo.InvariantCulture, "https://data.bmkg.go.id/DataMKG/TEWS/{0}.json", i)))); worker.SetDataUris(config.Subtypes.Select(i => new Uri(string.Format(CultureInfo.InvariantCulture, "https://data.bmkg.go.id/DataMKG/TEWS/{0}.json", i))));
return worker; return worker;
} }
static USGSQuakeMLWorker BuildUSGSQuakeMLWorkerUri(USGSQuakeMLWorker worker, USGSQuakeMLEventSourceConfig config) { static GeoNetWorker BuildGeoNetWorker(GeoNetWorker worker, GeoNetEventSourceConfig pref) {
worker.SetFeedRelativeUri(new(string.Format(CultureInfo.InvariantCulture, "/earthquakes/feed/v1.0/summary/{0}.quakeml", config.Subtype), UriKind.Relative)); worker.MinimumMMI = pref.MinimumMMI;
worker.DoGetFullHistory = pref.DoGetFullHistory;
worker.DoGetStrongMotionInfo = pref.DoGetStrongMotionInfo;
return worker;
}
static USGSWorker BuildUSGSWorker(USGSWorker worker, USGSEventSourceConfig config) {
worker.SetFeedRelativeUri(new(string.Format(CultureInfo.InvariantCulture, "/earthquakes/feed/v1.0/summary/{0}{1}", config.Subtype, config.UseGeoJSONFeeds ? ".geojson" : ".quakeml"), UriKind.Relative));
if (worker is USGSGeoJSONWorker geojsonWorker) {
geojsonWorker.SetFilter(
config.Products
.Select(i => i.Split('/', 2))
.GroupBy(i => i[0])
.ToDictionary(g => g.Key, g => g.Select(i => i[1]))
);
}
return worker; return worker;
} }
@@ -200,7 +232,7 @@ namespace Cryville.EEW.Unity {
ReportViewModel _latestHistoryReport; ReportViewModel _latestHistoryReport;
void OnReported(object sender, ReportViewModel e) { void OnReported(object sender, ReportViewModel e) {
if (e.Model is Exception && e.Model is not SourceWorkerNetworkException) if (e.Model is Exception && e.Model is not SourceWorkerNetworkException)
Debug.LogError(e); App.MainLogger.Log(4, "App", null, "Received an error from {0}: {1}", sender.GetType(), e.Model);
_grouper.Report(e); _grouper.Report(e);
_ongoingReportManager.Report(e); _ongoingReportManager.Report(e);
_uiActionQueue.Enqueue(() => { _uiActionQueue.Enqueue(() => {

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 7aa0c56ccfdaf9443b58f26bf40eed01
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,185 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Cryville.Common.Logging</name>
</assembly>
<members>
<member name="T:Cryville.Common.Logging.Logger">
<summary>
A logger.
</summary>
</member>
<member name="M:Cryville.Common.Logging.Logger.AddListener(Cryville.Common.Logging.LoggerListener)">
<summary>
Attaches a listener to the logger.
</summary>
<param name="listener">The logger listener.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.RemoveListener(Cryville.Common.Logging.LoggerListener)">
<summary>
Detaches a listener from the logger.
</summary>
<param name="listener">The logger listener.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.String,System.Object[])">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="format">The format string.</param>
<param name="args">The arguments for formatting.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.IFormatProvider,System.String,System.Object[])">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="provider">The format provider.</param>
<param name="format">The format string.</param>
<param name="args">The arguments for formatting.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.String)">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">The message.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.Char[])">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">An array of <see cref="T:System.Char" /> containing the message.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.Char[],System.Int32,System.Int32)">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">An array of <see cref="T:System.Char" /> containing the message.</param>
<param name="index">A zero-based index of the first character of the message within <paramref name="message" />.</param>
<param name="length">The length of the message.</param>
</member>
<member name="M:Cryville.Common.Logging.Logger.Log(System.Int32,System.String,System.Char*,System.Int32)">
<summary>
Logs to the logger.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">A pointer to the first character of the message.</param>
<param name="length">The length of the message.</param>
</member>
<member name="T:Cryville.Common.Logging.LoggerListener">
<summary>
A logger listener.
</summary>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.Dispose(System.Boolean)">
<summary>
Closes the logger listener and cleans up all the resources.
</summary>
<param name="disposing">Whether to clean up managed resources.</param>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.Dispose">
<summary>
Closes the logger listener.
</summary>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.OnLog(System.Int32,System.String,System.String)">
<summary>
Handles an incoming log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">The message.</param>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.OnLog(System.Int32,System.String,System.Char[],System.Int32,System.Int32)">
<summary>
Handles an incoming log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">An array of <see cref="T:System.Char" /> containing the message.</param>
<param name="index">A zero-based index of the first character of the message within <paramref name="message" />.</param>
<param name="length">The length of the message.</param>
</member>
<member name="M:Cryville.Common.Logging.LoggerListener.OnLog(System.Int32,System.String,System.Char*,System.Int32)">
<summary>
Handles an incoming log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">A pointer to the first character of the message.</param>
<param name="length">The length of the message.</param>
</member>
<member name="T:Cryville.Common.Logging.InstantLoggerListener">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that calls a callback function on log.
</summary>
</member>
<member name="E:Cryville.Common.Logging.InstantLoggerListener.Log">
<summary>
Occurs when a log is logged to the logger.
</summary>
</member>
<member name="M:Cryville.Common.Logging.InstantLoggerListener.OnLog(System.Int32,System.String,System.String)">
<inheritdoc />
</member>
<member name="T:Cryville.Common.Logging.BufferedLoggerListener">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that buffers the logs for enumeration.
</summary>
</member>
<member name="M:Cryville.Common.Logging.BufferedLoggerListener.OnLog(System.Int32,System.String,System.String)">
<inheritdoc />
</member>
<member name="M:Cryville.Common.Logging.BufferedLoggerListener.Enumerate(Cryville.Common.Logging.LogHandler)">
<summary>
Enumerates the buffered logs.
</summary>
<param name="callback">The callback function to receive the logs.</param>
</member>
<member name="T:Cryville.Common.Logging.StreamLoggerListener">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that writes logs into a stream.
</summary>
<param name="stream">The stream.</param>
<param name="encoding">The encoding.</param>
</member>
<member name="M:Cryville.Common.Logging.StreamLoggerListener.#ctor(System.IO.Stream,System.Text.Encoding)">
<summary>
A <see cref="T:Cryville.Common.Logging.LoggerListener" /> that writes logs into a stream.
</summary>
<param name="stream">The stream.</param>
<param name="encoding">The encoding.</param>
</member>
<member name="M:Cryville.Common.Logging.StreamLoggerListener.#ctor(System.IO.Stream)">
<summary>
Creates an instance of the <see cref="T:Cryville.Common.Logging.StreamLoggerListener" /> class.
</summary>
<param name="stream">The stream.</param>
</member>
<member name="P:Cryville.Common.Logging.StreamLoggerListener.AutoFlush">
<summary>
Whether to flush the stream every time a log is written.
</summary>
</member>
<member name="M:Cryville.Common.Logging.StreamLoggerListener.OnLog(System.Int32,System.String,System.String)">
<inheritdoc />
</member>
<member name="T:Cryville.Common.Logging.LogHandler">
<summary>
Represents the method that will handle a log.
</summary>
<param name="level">The severity level.</param>
<param name="category">The category.</param>
<param name="message">The message.</param>
</member>
</members>
</doc>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 72ded0675457e0348809193a9c1092b5
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 9add703a85e306e41a5f1f424b9e5980
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 1fa7d6d104052f447b49fc53f65d55cd
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 590f9955e3e1e36458e2f7b807a05188
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 123d46d01924a434fbe65219e8baba1e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

View File

@@ -76,6 +76,20 @@
The shared instance of the <see cref="T:Cryville.EEW.Heartbeat" /> class. The shared instance of the <see cref="T:Cryville.EEW.Heartbeat" /> class.
</summary> </summary>
</member> </member>
<member name="T:Cryville.EEW.HttpExtensions">
<summary>
Provides a set of <see langword="static" /> methods related to HTTP.
</summary>
</member>
<member name="M:Cryville.EEW.HttpExtensions.EnsureNonErrorStatusCode(System.Net.Http.HttpResponseMessage)">
<summary>
Throws an exception if the HTTP response has a client error status code (400~499) or a server error status code (500~599).
</summary>
<param name="response">The response message.</param>
<returns>The response message if there is no error.</returns>
<exception cref="T:System.InvalidOperationException">The response has a client error status code (400~499).</exception>
<exception cref="T:System.Net.Http.HttpRequestException">The response has a server error status code (500~599).</exception>
</member>
<member name="T:Cryville.EEW.HttpPullWorker"> <member name="T:Cryville.EEW.HttpPullWorker">
<summary> <summary>
A source worker that pulls events with HTTP GET requests. A source worker that pulls events with HTTP GET requests.
@@ -117,6 +131,34 @@
<returns>The task.</returns> <returns>The task.</returns>
<exception cref="T:System.InvalidOperationException">The server responses with an unhandled status code.</exception> <exception cref="T:System.InvalidOperationException">The server responses with an unhandled status code.</exception>
</member> </member>
<member name="M:Cryville.EEW.HttpPullWorker.HandleRawResponse(System.Net.Http.HttpResponseMessage,System.Threading.CancellationToken)">
<summary>
Handles a raw response message.
</summary>
<param name="response">The response message.</param>
<param name="cancellationToken">A cancellation token.</param>
<returns>A task.</returns>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.TryGetAsync(System.Uri,System.Threading.CancellationToken,System.Boolean,System.Int32)">
<summary>
Try to send a GET request to the specified URI.
</summary>
<param name="uri">The URI.</param>
<param name="cancellationToken">The cancellation token.</param>
<param name="retryOnErrorStatusCode">Whether to retry if the server responses with an error status code.</param>
<param name="retries">Times to retry before the request fails.</param>
<returns>The response message, or <see langword="null" /> if the request fails.</returns>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.TrySendAsync(System.Func{System.Net.Http.HttpRequestMessage},System.Threading.CancellationToken,System.Boolean,System.Int32)">
<summary>
Try to send a request to the specified URI.
</summary>
<param name="msgFactory">A function that creates the request message.</param>
<param name="cancellationToken">The cancellation token.</param>
<param name="retryOnErrorStatusCode">Whether to retry if the server responses with an error status code.</param>
<param name="retries">Times to retry before the request fails.</param>
<returns>The response message, or <see langword="null" /> if the request fails.</returns>
</member>
<member name="M:Cryville.EEW.HttpPullWorker.GetUri"> <member name="M:Cryville.EEW.HttpPullWorker.GetUri">
<summary> <summary>
Gets the URI of the next request, usually based on <see cref="P:Cryville.EEW.HttpPullWorker.BaseUri" />. Gets the URI of the next request, usually based on <see cref="P:Cryville.EEW.HttpPullWorker.BaseUri" />.
@@ -128,7 +170,7 @@
</member> </member>
<member name="M:Cryville.EEW.HttpPullWorker.AfterHandled(System.Threading.CancellationToken)"> <member name="M:Cryville.EEW.HttpPullWorker.AfterHandled(System.Threading.CancellationToken)">
<summary> <summary>
Called when a response is handled successfully, or when the server reponses with No Content (204) or Not Modified (304). Called when a response is handled successfully, or when the server responses with a non-error status code (100~399).
</summary> </summary>
</member> </member>
<member name="M:Cryville.EEW.HttpPullWorker.Handle(System.IO.Stream,System.Net.Http.Headers.HttpResponseHeaders,System.Threading.CancellationToken)"> <member name="M:Cryville.EEW.HttpPullWorker.Handle(System.IO.Stream,System.Net.Http.Headers.HttpResponseHeaders,System.Threading.CancellationToken)">
@@ -549,6 +591,61 @@
<member name="P:Cryville.EEW.Models.GeoJSON.Feature.Properties"> <member name="P:Cryville.EEW.Models.GeoJSON.Feature.Properties">
<summary>The properties of the feature.</summary> <summary>The properties of the feature.</summary>
</member> </member>
<member name="T:Cryville.EEW.Models.GeoJSON.Feature`1">
<summary>
Represents a spatially bounded thing.
</summary>
<typeparam name="T">The type of the properties.</typeparam>
<param name="Id">A JSON string or number representing the commonly used identifier of the feature.</param>
<param name="Geometry">The geometry of the feature.</param>
<param name="Properties">The properties of the feature.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.Feature`1.#ctor(System.Text.Json.JsonElement,Cryville.EEW.Models.GeoJSON.Geometry,`0,System.Double[])">
<summary>
Represents a spatially bounded thing.
</summary>
<typeparam name="T">The type of the properties.</typeparam>
<param name="Id">A JSON string or number representing the commonly used identifier of the feature.</param>
<param name="Geometry">The geometry of the feature.</param>
<param name="Properties">The properties of the feature.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.Feature`1.Id">
<summary>A JSON string or number representing the commonly used identifier of the feature.</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.Feature`1.Geometry">
<summary>The geometry of the feature.</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.Feature`1.Properties">
<summary>The properties of the feature.</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.IFeature`1">
<summary>
Represents a spatially bounded thing.
</summary>
<typeparam name="T">The type of the properties.</typeparam>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.Id">
<summary>
A JSON string or number representing the commonly used identifier of the feature.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.Geometry">
<summary>
The geometry of the feature.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.Properties">
<summary>
The properties of the feature.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.IFeature`1.BoundingBox">
<summary>
The bounding box.
</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.FeatureCollection"> <member name="T:Cryville.EEW.Models.GeoJSON.FeatureCollection">
<summary> <summary>
Represents a feature collection. Represents a feature collection.
@@ -566,6 +663,25 @@
<member name="P:Cryville.EEW.Models.GeoJSON.FeatureCollection.Features"> <member name="P:Cryville.EEW.Models.GeoJSON.FeatureCollection.Features">
<summary>The features.</summary> <summary>The features.</summary>
</member> </member>
<member name="T:Cryville.EEW.Models.GeoJSON.FeatureCollection`1">
<summary>
Represents a feature collection.
</summary>
<typeparam name="T">The type of the properties of the features.</typeparam>
<param name="Features">The features.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.FeatureCollection`1.#ctor(Cryville.EEW.Models.GeoJSON.Feature{`0}[],System.Double[])">
<summary>
Represents a feature collection.
</summary>
<typeparam name="T">The type of the properties of the features.</typeparam>
<param name="Features">The features.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.FeatureCollection`1.Features">
<summary>The features.</summary>
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.GeoJSONObject"> <member name="T:Cryville.EEW.Models.GeoJSON.GeoJSONObject">
<summary> <summary>
A Geometry, Feature, or collection of Features. A Geometry, Feature, or collection of Features.
@@ -983,6 +1099,37 @@
<member name="M:Cryville.EEW.NonstandardDateTimeJsonConverter.Write(System.Text.Json.Utf8JsonWriter,System.DateTime,System.Text.Json.JsonSerializerOptions)"> <member name="M:Cryville.EEW.NonstandardDateTimeJsonConverter.Write(System.Text.Json.Utf8JsonWriter,System.DateTime,System.Text.Json.JsonSerializerOptions)">
<inheritdoc /> <inheritdoc />
</member> </member>
<member name="T:Cryville.EEW.ProgressiveDelay">
<summary>
A helper class that produces progressive delay.
</summary>
</member>
<member name="P:Cryville.EEW.ProgressiveDelay.CurrentDelay">
<summary>
The delay to next tick.
</summary>
</member>
<member name="M:Cryville.EEW.ProgressiveDelay.#ctor(System.Double,System.Double,System.Double)">
<summary>
Creates an instance of the <see cref="T:Cryville.EEW.ProgressiveDelay" /> class.
</summary>
<param name="baseDelay">The minimum delay.</param>
<param name="maxDelay">The maximum delay.</param>
<param name="delayMultiplier">The multiplier between adjacent delay values.</param>
<exception cref="T:System.ArgumentOutOfRangeException"><paramref name="baseDelay" /> is negative or zero. -or- <paramref name="maxDelay" /> is negative or zero. -or- <paramref name="delayMultiplier" /> is less than or equal to 1.</exception>
</member>
<member name="M:Cryville.EEW.ProgressiveDelay.Step(System.Double)">
<summary>
Decrements the current delay and ticks if the delay has run over.
</summary>
<param name="amount">The amount of delay to decrement.</param>
<returns>Whether to tick.</returns>
</member>
<member name="M:Cryville.EEW.ProgressiveDelay.Reset">
<summary>
Resets to the base delay.
</summary>
</member>
<member name="T:Cryville.EEW.Report.EmptyRVMGeneratorContext"> <member name="T:Cryville.EEW.Report.EmptyRVMGeneratorContext">
<summary> <summary>
An empty <see cref="T:Cryville.EEW.Report.IRVMGeneratorContext" />. An empty <see cref="T:Cryville.EEW.Report.IRVMGeneratorContext" />.
@@ -1018,7 +1165,7 @@
</summary> </summary>
<param name="Latitude">The latitude of the hypocenter.</param> <param name="Latitude">The latitude of the hypocenter.</param>
<param name="Longitude">The longitude of the hypocenter.</param> <param name="Longitude">The longitude of the hypocenter.</param>
<param name="DateTime">The origin date time.</param> <param name="DateTime">The origin date time in UTC.</param>
<param name="Magnitude">The magnitude.</param> <param name="Magnitude">The magnitude.</param>
</member> </member>
<member name="M:Cryville.EEW.Report.HypocenterGroupKey.#ctor(System.Double,System.Double,System.DateTime,System.Double)"> <member name="M:Cryville.EEW.Report.HypocenterGroupKey.#ctor(System.Double,System.Double,System.DateTime,System.Double)">
@@ -1027,7 +1174,7 @@
</summary> </summary>
<param name="Latitude">The latitude of the hypocenter.</param> <param name="Latitude">The latitude of the hypocenter.</param>
<param name="Longitude">The longitude of the hypocenter.</param> <param name="Longitude">The longitude of the hypocenter.</param>
<param name="DateTime">The origin date time.</param> <param name="DateTime">The origin date time in UTC.</param>
<param name="Magnitude">The magnitude.</param> <param name="Magnitude">The magnitude.</param>
</member> </member>
<member name="P:Cryville.EEW.Report.HypocenterGroupKey.Latitude"> <member name="P:Cryville.EEW.Report.HypocenterGroupKey.Latitude">
@@ -1037,7 +1184,7 @@
<summary>The longitude of the hypocenter.</summary> <summary>The longitude of the hypocenter.</summary>
</member> </member>
<member name="P:Cryville.EEW.Report.HypocenterGroupKey.DateTime"> <member name="P:Cryville.EEW.Report.HypocenterGroupKey.DateTime">
<summary>The origin date time.</summary> <summary>The origin date time in UTC.</summary>
</member> </member>
<member name="P:Cryville.EEW.Report.HypocenterGroupKey.Magnitude"> <member name="P:Cryville.EEW.Report.HypocenterGroupKey.Magnitude">
<summary>The magnitude.</summary> <summary>The magnitude.</summary>
@@ -1317,11 +1464,6 @@
<see cref="P:Cryville.EEW.Report.ReportViewModel.InvalidatedTime" /> converted to UTC. <see cref="P:Cryville.EEW.Report.ReportViewModel.InvalidatedTime" /> converted to UTC.
</summary> </summary>
</member> </member>
<member name="P:Cryville.EEW.Report.ReportViewModel.IssueTime">
<summary>
The time when the report is issued, in the time zone indicated by <see cref="P:Cryville.EEW.Report.ReportViewModel.TimeZone" />.
</summary>
</member>
<member name="P:Cryville.EEW.Report.ReportViewModel.UtcIssueTime"> <member name="P:Cryville.EEW.Report.ReportViewModel.UtcIssueTime">
<summary> <summary>
The time when the report is issued, in UTC. The time when the report is issued, in UTC.
@@ -1445,13 +1587,10 @@
The parent type. The parent type.
</summary> </summary>
</member> </member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.#ctor(System.String,Cryville.EEW.Report.ReportViewModelPropertyType)"> <member name="P:Cryville.EEW.Report.ReportViewModelPropertyType.Root">
<summary> <summary>
Creates an instance of the <see cref="T:Cryville.EEW.Report.ReportViewModelPropertyType" /> class. The root type.
</summary> </summary>
<param name="name">The name of the type.</param>
<param name="parent">The parent type.</param>
<exception cref="T:System.ArgumentException"><paramref name="name" /> contains the sub-type delimiter <c>:</c>.</exception>
</member> </member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.OfSubtype(System.String)"> <member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.OfSubtype(System.String)">
<summary> <summary>
@@ -1463,6 +1602,14 @@
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.ToString"> <member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.ToString">
<inheritdoc/> <inheritdoc/>
</member> </member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.Of(System.String,Cryville.EEW.Report.ReportViewModelPropertyType)">
<summary>
Gets an instance of the <see cref="T:Cryville.EEW.Report.ReportViewModelPropertyType" /> class.
</summary>
<param name="name">The name of the type.</param>
<param name="parent">The parent type.</param>
<exception cref="T:System.ArgumentException"><paramref name="name" /> contains the sub-type delimiter <c>:</c>.</exception>
</member>
<member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.FromString(System.String)"> <member name="M:Cryville.EEW.Report.ReportViewModelPropertyType.FromString(System.String)">
<summary> <summary>
Creates a report view model property type from a string. Creates a report view model property type from a string.

View File

@@ -2,6 +2,7 @@
"Culture": "en-US", "Culture": "en-US",
"Strings": { "Strings": {
"AuthorityName": "CWA", "AuthorityName": "CWA",
"ErrorUnauthorized": "Authorization token is invalid.",
"PropertyDepth": "Depth", "PropertyDepth": "Depth",
"PropertyDepthValue": "{0}km", "PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "Max intensity", "PropertyMaxIntensity": "Max intensity",

View File

@@ -2,6 +2,7 @@
"Culture": "zh-TW", "Culture": "zh-TW",
"Strings": { "Strings": {
"AuthorityName": "CWA", "AuthorityName": "CWA",
"ErrorUnauthorized": "授權碼無效。",
"PropertyDepth": "深度", "PropertyDepth": "深度",
"PropertyDepthValue": "{0}km", "PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "最大震度", "PropertyMaxIntensity": "最大震度",

View File

@@ -2,6 +2,7 @@
"Culture": "yue-HK", "Culture": "yue-HK",
"Strings": { "Strings": {
"AuthorityName": "CWA", "AuthorityName": "CWA",
"ErrorUnauthorized": "授權碼無效。",
"PropertyDepth": "深度", "PropertyDepth": "深度",
"PropertyDepthValue": "{0}km", "PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "最大震度", "PropertyMaxIntensity": "最大震度",

View File

@@ -2,6 +2,7 @@
"Culture": "zh-CN", "Culture": "zh-CN",
"Strings": { "Strings": {
"AuthorityName": "CWA", "AuthorityName": "CWA",
"ErrorUnauthorized": "授权码无效。",
"PropertyDepth": "深度", "PropertyDepth": "深度",
"PropertyDepthValue": "{0}km", "PropertyDepthValue": "{0}km",
"PropertyMaxIntensity": "最大震度", "PropertyMaxIntensity": "最大震度",

View File

@@ -1,5 +1,5 @@
{ {
"Culture": "en-US", "Culture": "en-GB",
"Strings": { "Strings": {
"AuthorityName": "EMSC", "AuthorityName": "EMSC",
"AuthorityNameForwarded": "EMSC | {0}", "AuthorityNameForwarded": "EMSC | {0}",

View File

@@ -642,7 +642,7 @@
"674": "聖勞倫斯島", "674": "聖勞倫斯島",
"675": "波弗特海", "675": "波弗特海",
"676": "阿拉斯加北部", "676": "阿拉斯加北部",
"677": "加拿大育空地區北部", "677": "育空地區北部",
"678": "伊利沙伯女皇群島", "678": "伊利沙伯女皇群島",
"679": "西北地區—努拿烏特地區", "679": "西北地區—努拿烏特地區",
"68": "恰帕斯近海", "68": "恰帕斯近海",

View File

@@ -642,7 +642,7 @@
"674": "聖勞倫斯島", "674": "聖勞倫斯島",
"675": "波弗特海", "675": "波弗特海",
"676": "阿拉斯加北部", "676": "阿拉斯加北部",
"677": "加拿大育空地區北部", "677": "育空地區北部",
"678": "伊莉莎白女王群島", "678": "伊莉莎白女王群島",
"679": "西北地區—努納福特地區", "679": "西北地區—努納福特地區",
"68": "恰帕斯近海", "68": "恰帕斯近海",

View File

@@ -642,7 +642,7 @@
"674": "圣劳伦斯岛", "674": "圣劳伦斯岛",
"675": "波弗特海", "675": "波弗特海",
"676": "阿拉斯加北部", "676": "阿拉斯加北部",
"677": "加拿大育空地区北部", "677": "育空地区北部",
"678": "伊丽莎白女王群岛", "678": "伊丽莎白女王群岛",
"679": "西北地区—努纳武特地区", "679": "西北地区—努纳武特地区",
"68": "恰帕斯近海", "68": "恰帕斯近海",

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a68851283bf763f498b6efc1e7fd7d3e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "en-NZ",
"Strings": {
"BodyQuake": "Quake information. At {0}, a magnitude {1} earthquake occurred in {2}. Hypocenter depth {3} kilometers.",
"BodyQuakeDeleted": "A previously reported quake has been deleted.",
"BodyStrong": "Strong motion information. A magnitude {0} earthquake occurred in {1}. Hypocenter depth {2} kilometers. Max measured intensity {3}.",
"MaxIntensity": " Max intensity {0}.",
"TitleQuake": "Quake information",
"TitleStrong": "Strong motion information"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7dda4437bc429f946a3606eb5182c26a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "yue-HK",
"Strings": {
"BodyQuake": "地震資訊。{0}{2}發生震級{1}級地震。震源深度{3}公里。",
"BodyQuakeDeleted": "頭先發佈嘅一條地震資訊已被刪除。",
"BodyStrong": "強震動資訊。{1}發生震級{0}級地震。震源深度{2}公里。最大儀器烈度{3}。",
"MaxIntensity": "最大烈度{0}。",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 22fbb2e4ace53904689d749d9121f63f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "zh-TW",
"Strings": {
"BodyQuake": "地震資訊。{0}{2}發生規模{1}級地震。震源深度{3}公里。",
"BodyQuakeDeleted": "先前發佈的一條地震資訊已被刪除。",
"BodyStrong": "強震動資訊。{1}發生規模{0}級地震。震源深度{2}公里。最大計測震度{3}。",
"MaxIntensity": "最大震度{0}。",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bc25877491739c64f9796c1c10f00291
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
{
"Culture": "zh-CN",
"Strings": {
"BodyQuake": "地震信息。{0}{2}发生震级{1}级地震。震源深度{3}千米。",
"BodyQuakeDeleted": "先前发布的一条地震信息已被删除。",
"BodyStrong": "强震动信息。{1}发生震级{0}级地震。震源深度{2}千米。最大仪器烈度{3}。",
"MaxIntensity": "最大烈度{0}。",
"TitleQuake": "地震信息",
"TitleStrong": "强震动信息"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 15d5046e9e6258d4eb6f6290681de662
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5d5f90e1fe276574da03cf1e5722e915
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "en-NZ",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "Depth",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "Max intensity",
"SourceName": "GeoNet",
"TitleQuake": "Quake information",
"TitleStrong": "Strong motion information"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "Unknown",
"best": "Best",
"preliminary": "Preliminary",
"automatic": "Automatic",
"deleted": "Deleted"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ca2c1d5bc70b5ed49948d18a239b95b5
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "yue-HK",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "最大烈度",
"SourceName": "GeoNet",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "不明",
"best": "精確",
"preliminary": "速報",
"automatic": "自動",
"deleted": "刪除"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 3cabe2d850c5b2c4c987036edefbdf1d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "zh-TW",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "最大震度",
"SourceName": "GeoNet",
"TitleQuake": "地震資訊",
"TitleStrong": "強震動資訊"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "不明",
"best": "精確",
"preliminary": "速報",
"automatic": "自動",
"deleted": "刪除"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 99ceee37962c37646bd9eb43fd445f01
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
{
"Culture": "zh-CN",
"Strings": {
"AuthorityName": "GeoNet",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyMaxIntensity": "最大烈度",
"SourceName": "GeoNet",
"TitleQuake": "地震信息",
"TitleStrong": "强震动信息"
},
"StringSets": {
"PropertyQualityValue": {
"Strings": {
"": "不明",
"best": "精确",
"preliminary": "速报",
"automatic": "自动",
"deleted": "删除"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 75acceaa142e0b34ea805d36298102df
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "The high tide time and estimated initial tsunami arrival time per area is as follows.", "HeadlineTsunamiInformationForecast": "The high tide time and estimated initial tsunami arrival time per area is as follows.",
"HeadlineTsunamiInformationObservation": "Currently, tsunami observed is as follows.", "HeadlineTsunamiInformationObservation": "Currently, tsunami observed is as follows.",
"HeadlineTsunamiWarning": "{0} has been issued.", "HeadlineTsunamiWarning": "{0} has been issued.",
"HeadlineTsunamiWarningDowngraded": "{0} has been lifted and switched to {1}.",
"HeadlineTsunamiWarningLifted": "{0} has been lifted.", "HeadlineTsunamiWarningLifted": "{0} has been lifted.",
"HeadlineTsunamiWarningUpdate": "The current {0} in effect has been updated.", "HeadlineTsunamiWarningUpdate": "The current {0} in effect has been updated.",
"Intensity": "seismic intensity", "Intensity": "seismic intensity",
@@ -34,8 +35,9 @@
"LongIntensity": "long-period ground motion intensity", "LongIntensity": "long-period ground motion intensity",
"LongIntensityObservationMax": "This earthquake resulted in {0} of the maximum long-period ground motion intensity recorded.", "LongIntensityObservationMax": "This earthquake resulted in {0} of the maximum long-period ground motion intensity recorded.",
"Maximum": "the maximum {0}", "Maximum": "the maximum {0}",
"MinorItemSeparator": "; ", "MediumItemSeparator": "; ",
"PlumeDirectionValue": "{0} direction", "PlumeDirectionValue": "{0} direction",
"ShortItemSeparator": ", ",
"TsunamiForecast": "{0} has been issued for the following coastal regions of Japan.", "TsunamiForecast": "{0} has been issued for the following coastal regions of Japan.",
"TsunamiForecastArea": "{0}. {1}.", "TsunamiForecastArea": "{0}. {1}.",
"TsunamiForecastFirstHeightArrivalTime": "Estimated arrival time {0:t}", "TsunamiForecastFirstHeightArrivalTime": "Estimated arrival time {0:t}",
@@ -169,7 +171,7 @@
"北海道・三陸沖後発地震注意情報": "Hokkaido and off-Sanriku aftershock notice", "北海道・三陸沖後発地震注意情報": "Hokkaido and off-Sanriku aftershock notice",
"南海トラフ地震に関連する情報": "Information related to Nankai Trough earthquake", "南海トラフ地震に関連する情報": "Information related to Nankai Trough earthquake",
"噴火に関する火山観測報": "Volcano observation information about eruption", "噴火に関する火山観測報": "Volcano observation information about eruption",
"噴火警報・予報": "Vocanic warning and forecast", "噴火警報・予報": "Volcanic warning and forecast",
"噴火速報": "Volcanic eruption notice", "噴火速報": "Volcanic eruption notice",
"地震の活動状況等に関する情報": "Earthquake activity information", "地震の活動状況等に関する情報": "Earthquake activity information",
"地震回数情報": "Earthquake count information", "地震回数情報": "Earthquake count information",
@@ -196,6 +198,13 @@
"73": "Tsunami Forecast (slight sea-level changes)" "73": "Tsunami Forecast (slight sea-level changes)"
} }
}, },
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "Tsunami Forecast",
"72": "Tsunami Forecast",
"73": "Tsunami Forecast"
}
},
"TsunamiForecastFirstHeightCondition": { "TsunamiForecastFirstHeightCondition": {
"Strings": { "Strings": {
"ただちに津波来襲と予測": "Imminent tsunami arrival expected", "ただちに津波来襲と予測": "Imminent tsunami arrival expected",

View File

@@ -21,8 +21,9 @@
"LongIntensity": "長周期地震動階級", "LongIntensity": "長周期地震動階級",
"LongIntensityObservationMax": "この地震で、最大長周期地震動階級{0}を観測しました。", "LongIntensityObservationMax": "この地震で、最大長周期地震動階級{0}を観測しました。",
"Maximum": "最大{0}", "Maximum": "最大{0}",
"MinorItemSeparator": "、", "MediumItemSeparator": "、",
"PlumeDirectionValue": "{0}方向", "PlumeDirectionValue": "{0}方向",
"ShortItemSeparator": "、",
"TsunamiForecast": "{0}が、次の地域に発表されています。", "TsunamiForecast": "{0}が、次の地域に発表されています。",
"TsunamiForecastArea": "{0}。{1}。", "TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "到達予想時刻{0:t}", "TsunamiForecastFirstHeightArrivalTime": "到達予想時刻{0:t}",
@@ -75,6 +76,13 @@
"73": "津波予報(若干の海面変動)" "73": "津波予報(若干の海面変動)"
} }
}, },
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "津波予報",
"72": "津波予報",
"73": "津波予報"
}
},
"VolcanoObservationPlumeHeightAboveCraterValue": { "VolcanoObservationPlumeHeightAboveCraterValue": {
"Strings": { "Strings": {
"": "{0}メートル", "": "{0}メートル",

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "各地嘅滿潮時刻同海嘯到達預測時刻如下。", "HeadlineTsunamiInformationForecast": "各地嘅滿潮時刻同海嘯到達預測時刻如下。",
"HeadlineTsunamiInformationObservation": "目前,海嘯嘅觀測值如下。", "HeadlineTsunamiInformationObservation": "目前,海嘯嘅觀測值如下。",
"HeadlineTsunamiWarning": "{0}已被發佈。", "HeadlineTsunamiWarning": "{0}已被發佈。",
"HeadlineTsunamiWarningDowngraded": "{0}已被解除,切換為{1}。",
"HeadlineTsunamiWarningLifted": "{0}已被解除。", "HeadlineTsunamiWarningLifted": "{0}已被解除。",
"HeadlineTsunamiWarningUpdate": "而家發佈緊嘅{0}已被更新。", "HeadlineTsunamiWarningUpdate": "而家發佈緊嘅{0}已被更新。",
"Intensity": "震度", "Intensity": "震度",
@@ -34,9 +35,10 @@
"LongIntensity": "長週期地震動階級", "LongIntensity": "長週期地震動階級",
"LongIntensityObservationMax": "呢次地震,觀測到嘅最大長週期地震動階級為{0}。", "LongIntensityObservationMax": "呢次地震,觀測到嘅最大長週期地震動階級為{0}。",
"Maximum": "最大{0}", "Maximum": "最大{0}",
"MinorItemSeparator": "", "MediumItemSeparator": "",
"PlumeDirectionValue": "{0}方向", "PlumeDirectionValue": "{0}方向",
"TsunamiForecast": "以下嘅區域正在發佈{0}。", "ShortItemSeparator": "、",
"TsunamiForecast": "{0}正在向以下嘅區域發佈。",
"TsunamiForecastArea": "{0}。{1}。", "TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "預測到達時刻{0:t}", "TsunamiForecastFirstHeightArrivalTime": "預測到達時刻{0:t}",
"TsunamiForecastMaxHeight": "預測海嘯高度為{0}。", "TsunamiForecastMaxHeight": "預測海嘯高度為{0}。",
@@ -196,6 +198,13 @@
"73": "海嘯預報(若干嘅海面變動)" "73": "海嘯預報(若干嘅海面變動)"
} }
}, },
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
},
"TsunamiForecastFirstHeightCondition": { "TsunamiForecastFirstHeightCondition": {
"Strings": { "Strings": {
"ただちに津波来襲と予測": "預測海嘯即將到達", "ただちに津波来襲と予測": "預測海嘯即將到達",

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "各地的滿潮時刻和海嘯到達預測時刻如下。", "HeadlineTsunamiInformationForecast": "各地的滿潮時刻和海嘯到達預測時刻如下。",
"HeadlineTsunamiInformationObservation": "目前,海嘯的觀測值如下。", "HeadlineTsunamiInformationObservation": "目前,海嘯的觀測值如下。",
"HeadlineTsunamiWarning": "{0}已被發佈。", "HeadlineTsunamiWarning": "{0}已被發佈。",
"HeadlineTsunamiWarningDowngraded": "{0}已被解除,切換為{1}。",
"HeadlineTsunamiWarningLifted": "{0}已被解除。", "HeadlineTsunamiWarningLifted": "{0}已被解除。",
"HeadlineTsunamiWarningUpdate": "當前發佈中的{0}已被更新。", "HeadlineTsunamiWarningUpdate": "當前發佈中的{0}已被更新。",
"Intensity": "震度", "Intensity": "震度",
@@ -34,9 +35,10 @@
"LongIntensity": "長周期地震動階級", "LongIntensity": "長周期地震動階級",
"LongIntensityObservationMax": "本次地震,觀測到的最大長周期地震動階級為{0}。", "LongIntensityObservationMax": "本次地震,觀測到的最大長周期地震動階級為{0}。",
"Maximum": "最大{0}", "Maximum": "最大{0}",
"MinorItemSeparator": "", "MediumItemSeparator": "",
"PlumeDirectionValue": "{0}方向", "PlumeDirectionValue": "{0}方向",
"TsunamiForecast": "以下的區域正在發布{0}。", "ShortItemSeparator": "、",
"TsunamiForecast": "{0}正在對以下的區域發布。",
"TsunamiForecastArea": "{0}。{1}。", "TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "預測到達時刻{0:t}", "TsunamiForecastFirstHeightArrivalTime": "預測到達時刻{0:t}",
"TsunamiForecastMaxHeight": "預測海嘯高度為{0}。", "TsunamiForecastMaxHeight": "預測海嘯高度為{0}。",
@@ -119,7 +121,7 @@
"EarthquakeMagnitudeUnknown": { "EarthquakeMagnitudeUnknown": {
"Strings": { "Strings": {
"": "地震的規模不明。", "": "地震的規模不明。",
"M8を超える巨大地震": "推定本次地震為規模大於8的巨大地震" "M8を超える巨大地震": "推定本次地震為規模大於8的巨大地震"
} }
}, },
"HeadlineVolcanoWarning": { "HeadlineVolcanoWarning": {
@@ -196,6 +198,13 @@
"73": "海嘯預報(若干的海面變動)" "73": "海嘯預報(若干的海面變動)"
} }
}, },
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
},
"TsunamiForecastFirstHeightCondition": { "TsunamiForecastFirstHeightCondition": {
"Strings": { "Strings": {
"ただちに津波来襲と予測": "預測海嘯即將來襲", "ただちに津波来襲と予測": "預測海嘯即將來襲",

View File

@@ -25,6 +25,7 @@
"HeadlineTsunamiInformationForecast": "各地的满潮时刻和海啸到达预测时刻如下。", "HeadlineTsunamiInformationForecast": "各地的满潮时刻和海啸到达预测时刻如下。",
"HeadlineTsunamiInformationObservation": "目前,海啸的观测值如下。", "HeadlineTsunamiInformationObservation": "目前,海啸的观测值如下。",
"HeadlineTsunamiWarning": "{0}已被发布。", "HeadlineTsunamiWarning": "{0}已被发布。",
"HeadlineTsunamiWarningDowngraded": "{0}已被解除,切换为{1}。",
"HeadlineTsunamiWarningLifted": "{0}已被解除。", "HeadlineTsunamiWarningLifted": "{0}已被解除。",
"HeadlineTsunamiWarningUpdate": "当前发布中的{0}已被更新。", "HeadlineTsunamiWarningUpdate": "当前发布中的{0}已被更新。",
"Intensity": "震度", "Intensity": "震度",
@@ -34,9 +35,10 @@
"LongIntensity": "长周期地震动阶级", "LongIntensity": "长周期地震动阶级",
"LongIntensityObservationMax": "本次地震,观测到的最大长周期地震动阶级为{0}。", "LongIntensityObservationMax": "本次地震,观测到的最大长周期地震动阶级为{0}。",
"Maximum": "最大{0}", "Maximum": "最大{0}",
"MinorItemSeparator": "", "MediumItemSeparator": "",
"PlumeDirectionValue": "{0}方向", "PlumeDirectionValue": "{0}方向",
"TsunamiForecast": "以下的区域正在发布{0}。", "ShortItemSeparator": "、",
"TsunamiForecast": "{0}正在对以下的区域发布。",
"TsunamiForecastArea": "{0}。{1}。", "TsunamiForecastArea": "{0}。{1}。",
"TsunamiForecastFirstHeightArrivalTime": "预测到达时刻{0:t}", "TsunamiForecastFirstHeightArrivalTime": "预测到达时刻{0:t}",
"TsunamiForecastMaxHeight": "预测海啸高度为{0}。", "TsunamiForecastMaxHeight": "预测海啸高度为{0}。",
@@ -119,7 +121,7 @@
"EarthquakeMagnitudeUnknown": { "EarthquakeMagnitudeUnknown": {
"Strings": { "Strings": {
"": "地震的震级不明。", "": "地震的震级不明。",
"M8を超える巨大地震": "推定本次地震为震级大于8的巨大地震" "M8を超える巨大地震": "推定本次地震为震级大于8的巨大地震"
} }
}, },
"HeadlineVolcanoWarning": { "HeadlineVolcanoWarning": {
@@ -196,6 +198,13 @@
"73": "海啸预报(若干的海面变动)" "73": "海啸预报(若干的海面变动)"
} }
}, },
"TsunamiForecastCategoryShort": {
"Strings": {
"71": "海啸预报",
"72": "海啸预报",
"73": "海啸预报"
}
},
"TsunamiForecastFirstHeightCondition": { "TsunamiForecastFirstHeightCondition": {
"Strings": { "Strings": {
"ただちに津波来襲と予測": "预测海啸即将来袭", "ただちに津波来襲と予測": "预测海啸即将来袭",

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km", "PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "No plume", "PropertyPlumeHeightAboveCraterValueNone": "No plume",
"PropertyPlumeHeightAboveCraterValueUnknown": "Unknown", "PropertyPlumeHeightAboveCraterValueUnknown": "Unknown",
"ShortItemSeparator": ", ",
"SourceName": "JMA Atom" "SourceName": "JMA Atom"
}, },
"StringSets": { "StringSets": {
@@ -27,7 +28,7 @@
"北海道・三陸沖後発地震注意情報": "Hokkaido and off-Sanriku aftershock notice", "北海道・三陸沖後発地震注意情報": "Hokkaido and off-Sanriku aftershock notice",
"南海トラフ地震に関連する情報": "Information related to Nankai Trough earthquake", "南海トラフ地震に関連する情報": "Information related to Nankai Trough earthquake",
"噴火に関する火山観測報": "Volcano observation information about eruption", "噴火に関する火山観測報": "Volcano observation information about eruption",
"噴火警報・予報": "Vocanic warning and forecast", "噴火警報・予報": "Volcanic warning and forecast",
"噴火速報": "Volcanic eruption notice", "噴火速報": "Volcanic eruption notice",
"地震の活動状況等に関する情報": "Earthquake activity information", "地震の活動状況等に関する情報": "Earthquake activity information",
"地震回数情報": "Earthquake count information", "地震回数情報": "Earthquake count information",
@@ -87,7 +88,7 @@
"": "Lifted" "": "Lifted"
} }
}, },
"PropertyVocanicWarningValue": { "PropertyVolcanicWarningValue": {
"Strings": { "Strings": {
"11": "Level 1", "11": "Level 1",
"12": "Level 2", "12": "Level 2",
@@ -112,6 +113,17 @@
"訓練": "{0} (Drilling)", "訓練": "{0} (Drilling)",
"試験": "{0} (Testing)" "試験": "{0} (Testing)"
} }
},
"TsunamiForecastCategory": {
"Strings": {
"51": "Tsunami Warning",
"52": "Major Tsunami Warning",
"53": "Major Tsunami Warning",
"62": "Tsunami Advisory",
"71": "Tsunami Forecast",
"72": "Tsunami Forecast",
"73": "Tsunami Forecast"
}
} }
} }
} }

View File

@@ -43,7 +43,7 @@
"": "解\u2060除" "": "解\u2060除"
} }
}, },
"PropertyVocanicWarningValue": { "PropertyVolcanicWarningValue": {
"Strings": { "Strings": {
"11": "レ\u2060ベ\u2060ル", "11": "レ\u2060ベ\u2060ル",
"12": "レ\u2060ベ\u2060ル", "12": "レ\u2060ベ\u2060ル",

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km", "PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "冇噴\u2060煙", "PropertyPlumeHeightAboveCraterValueNone": "冇噴\u2060煙",
"PropertyPlumeHeightAboveCraterValueUnknown": "不明", "PropertyPlumeHeightAboveCraterValueUnknown": "不明",
"ShortItemSeparator": "、",
"SourceName": "JMA Atom" "SourceName": "JMA Atom"
}, },
"StringSets": { "StringSets": {
@@ -87,7 +88,7 @@
"": "解\u2060除" "": "解\u2060除"
} }
}, },
"PropertyVocanicWarningValue": { "PropertyVolcanicWarningValue": {
"Strings": { "Strings": {
"11": "等\u2060級1", "11": "等\u2060級1",
"12": "等\u2060級2", "12": "等\u2060級2",
@@ -112,6 +113,17 @@
"訓練": "{0}(訓練)", "訓練": "{0}(訓練)",
"試験": "{0}(測試)" "試験": "{0}(測試)"
} }
},
"TsunamiForecastCategory": {
"Strings": {
"51": "海嘯警報",
"52": "大海嘯警報",
"53": "大海嘯警報",
"62": "海嘯注意報",
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
} }
} }
} }

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km", "PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "無噴\u2060煙", "PropertyPlumeHeightAboveCraterValueNone": "無噴\u2060煙",
"PropertyPlumeHeightAboveCraterValueUnknown": "不明", "PropertyPlumeHeightAboveCraterValueUnknown": "不明",
"ShortItemSeparator": "、",
"SourceName": "JMA Atom" "SourceName": "JMA Atom"
}, },
"StringSets": { "StringSets": {
@@ -87,7 +88,7 @@
"": "解\u2060除" "": "解\u2060除"
} }
}, },
"PropertyVocanicWarningValue": { "PropertyVolcanicWarningValue": {
"Strings": { "Strings": {
"11": "等\u2060級1", "11": "等\u2060級1",
"12": "等\u2060級2", "12": "等\u2060級2",
@@ -112,6 +113,17 @@
"訓練": "{0}(訓練)", "訓練": "{0}(訓練)",
"試験": "{0}(測試)" "試験": "{0}(測試)"
} }
},
"TsunamiForecastCategory": {
"Strings": {
"51": "海嘯警報",
"52": "大海嘯警報",
"53": "大海嘯警報",
"62": "海嘯注意報",
"71": "海嘯預報",
"72": "海嘯預報",
"73": "海嘯預報"
}
} }
} }
} }

View File

@@ -18,6 +18,7 @@
"PropertyPlumeHeightAboveCraterValue": "{0}km", "PropertyPlumeHeightAboveCraterValue": "{0}km",
"PropertyPlumeHeightAboveCraterValueNone": "无喷\u2060烟", "PropertyPlumeHeightAboveCraterValueNone": "无喷\u2060烟",
"PropertyPlumeHeightAboveCraterValueUnknown": "不明", "PropertyPlumeHeightAboveCraterValueUnknown": "不明",
"ShortItemSeparator": "、",
"SourceName": "JMA Atom" "SourceName": "JMA Atom"
}, },
"StringSets": { "StringSets": {
@@ -87,7 +88,7 @@
"": "解\u2060除" "": "解\u2060除"
} }
}, },
"PropertyVocanicWarningValue": { "PropertyVolcanicWarningValue": {
"Strings": { "Strings": {
"11": "等\u2060级1", "11": "等\u2060级1",
"12": "等\u2060级2", "12": "等\u2060级2",
@@ -112,6 +113,17 @@
"訓練": "{0}(训练)", "訓練": "{0}(训练)",
"試験": "{0}(测试)" "試験": "{0}(测试)"
} }
},
"TsunamiForecastCategory": {
"Strings": {
"51": "海啸警报",
"52": "大海啸警报",
"53": "大海啸警报",
"62": "海啸注意报",
"71": "海啸预报",
"72": "海啸预报",
"73": "海啸预报"
}
} }
} }
} }

View File

@@ -1,6 +1,39 @@
{ {
"Culture": "en-US", "Culture": "en-US",
"Strings": { "Strings": {
"AuthorityName": "USGS",
"AuthorityNameForwarded": "{0} | {1}",
"PropertyDepth": "Depth",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyValue": "{0}{1}",
"ShakeMapTitle": "ShakeMap ({0})",
"SourceName": "USGS" "SourceName": "USGS"
},
"StringSets": {
"ContoursName": {
"Strings": {
"cont_mi": "Intensity Contours",
"cont_mmi": "Intensity Contours",
"cont_pga": "PGA Contours",
"cont_pgv": "PGV Contours"
}
},
"ContoursPropertyName": {
"Strings": {
"cont_mi": "Max intensity",
"cont_mmi": "Max intensity",
"cont_pga": "Max PGA",
"cont_pgv": "Max PGV"
}
},
"PropertyUnits": {
"Strings": {
"mmi": "",
"pctg": "%g",
"g": "g",
"cms": "cm/s"
}
}
} }
} }

View File

@@ -0,0 +1,39 @@
{
"Culture": "yue-HK",
"Strings": {
"AuthorityName": "USGS",
"AuthorityNameForwarded": "{0} | {1}",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyValue": "{0}{1}",
"ShakeMapTitle": "地震動圖({0}",
"SourceName": "USGS"
},
"StringSets": {
"ContoursName": {
"Strings": {
"cont_mi": "等烈度綫",
"cont_mmi": "等烈度綫",
"cont_pga": "等最大地面加速度綫",
"cont_pgv": "等最大地面速度綫"
}
},
"ContoursPropertyName": {
"Strings": {
"cont_mi": "最大烈度",
"cont_mmi": "最大烈度",
"cont_pga": "最大PGA",
"cont_pgv": "最大PGV"
}
},
"PropertyUnits": {
"Strings": {
"mmi": "",
"pctg": "%g",
"g": "g",
"cms": "cm/s"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6f321e8c7c214c648a5dc5abfae0a628
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
{
"Culture": "zh-TW",
"Strings": {
"AuthorityName": "USGS",
"AuthorityNameForwarded": "{0} | {1}",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyValue": "{0}{1}",
"ShakeMapTitle": "地震動圖({0}",
"SourceName": "USGS"
},
"StringSets": {
"ContoursName": {
"Strings": {
"cont_mi": "等震度綫",
"cont_mmi": "等震度綫",
"cont_pga": "等最大地面加速度綫",
"cont_pgv": "等最大地面速度綫"
}
},
"ContoursPropertyName": {
"Strings": {
"cont_mi": "最大震度",
"cont_mmi": "最大震度",
"cont_pga": "最大PGA",
"cont_pgv": "最大PGV"
}
},
"PropertyUnits": {
"Strings": {
"mmi": "",
"pctg": "%g",
"g": "g",
"cms": "cm/s"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 44c3032bb65e45441be984876fd9a89e
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
{
"Culture": "zh-CN",
"Strings": {
"AuthorityName": "USGS",
"AuthorityNameForwarded": "{0} | {1}",
"PropertyDepth": "深度",
"PropertyDepthValue": "{0}km",
"PropertyMagnitude": "M",
"PropertyValue": "{0}{1}",
"ShakeMapTitle": "地震动图({0}",
"SourceName": "USGS"
},
"StringSets": {
"ContoursName": {
"Strings": {
"cont_mi": "等烈度线",
"cont_mmi": "等烈度线",
"cont_pga": "等峰值地面加速度线",
"cont_pgv": "等峰值地面速度线"
}
},
"ContoursPropertyName": {
"Strings": {
"cont_mi": "最大烈度",
"cont_mmi": "最大烈度",
"cont_pga": "最大PGA",
"cont_pgv": "最大PGV"
}
},
"PropertyUnits": {
"Strings": {
"mmi": "",
"pctg": "%g",
"g": "g",
"cms": "cm/s"
}
}
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b3c804718aac7954ab4e4949d15b7904
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -7,9 +7,12 @@ The following files are licensed under [CC-BY-4.0](https://creativecommons.org/l
- Cryville.EEW.CWA/* - Cryville.EEW.CWA/*
- Cryville.EEW.CWAOpenData/* - Cryville.EEW.CWAOpenData/*
- Cryville.EEW.CWAOpenData.TTS/* - Cryville.EEW.CWAOpenData.TTS/*
- Cryville.EEW.EMSC/*
- Cryville.EEW.FERegion/yue.json - Cryville.EEW.FERegion/yue.json
- Cryville.EEW.FERegion/zh.json - Cryville.EEW.FERegion/zh.json
- Cryville.EEW.FERegion/zh-Hant.json - Cryville.EEW.FERegion/zh-Hant.json
- Cryville.EEW.GeoNet/*
- Cryville.EEW.GeoNet.TTS/*
- Cryville.EEW.GlobalQuake/* - Cryville.EEW.GlobalQuake/*
- Cryville.EEW.JMA/* - Cryville.EEW.JMA/*
- Cryville.EEW.JMA/PointTsunami/en.json - Cryville.EEW.JMA/PointTsunami/en.json

View File

@@ -134,7 +134,7 @@ PlayerSettings:
16:10: 1 16:10: 1
16:9: 1 16:9: 1
Others: 1 Others: 1
bundleVersion: 0.0.6 bundleVersion: 0.0.8
preloadedAssets: [] preloadedAssets: []
metroInputSource: 0 metroInputSource: 0
wsaTransparentSwapchain: 0 wsaTransparentSwapchain: 0
@@ -654,7 +654,7 @@ PlayerSettings:
allowUnsafeCode: 1 allowUnsafeCode: 1
useDeterministicCompilation: 1 useDeterministicCompilation: 1
enableRoslynAnalyzers: 1 enableRoslynAnalyzers: 1
selectedPlatform: 2 selectedPlatform: 0
additionalIl2CppArgs: additionalIl2CppArgs:
scriptingRuntimeVersion: 1 scriptingRuntimeVersion: 1
gcIncremental: 1 gcIncremental: 1