@atmosx/event-product-parser 3.0.54 → 3.0.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/.github/CODE_OF_CONDUCT.md +9 -9
  2. package/.github/CONTRIBUTING.md +29 -29
  3. package/.github/LICENSE +17 -17
  4. package/.github/SECURITY.md +20 -20
  5. package/.github/SUPPORTED_EVENTS.md +369 -369
  6. package/.github/docs/docs-functions.md +30 -0
  7. package/.github/docs/docs-general-configurations.md +209 -0
  8. package/.github/docs/docs-integrations.md +37 -0
  9. package/.github/docs/docs-listeners.md +28 -0
  10. package/.github/docs/docs-source-configuration.md +218 -0
  11. package/.github/docs/docs-technical.md +50 -0
  12. package/.github/logo.png +0 -0
  13. package/.github/samples/SAMPLE_EAS_GENERATION.wav +0 -0
  14. package/.github/samples/SAMPLE_GEOJSON.json +204 -0
  15. package/.github/samples/SAMPLE_TEXT_PRODUCT.txt +119 -0
  16. package/.vscode/settings.json +3 -3
  17. package/README.md +167 -0
  18. package/dist/cjs/index.cjs +1475 -1294
  19. package/dist/esm/index.mjs +1456 -1275
  20. package/package.json +47 -52
  21. package/src/@building/{building.create.ts → CreateEvent.ts} +55 -55
  22. package/src/@building/{building.clean.ts → GetCleanedEvent.ts} +29 -29
  23. package/src/@building/{building.attachments.ts → GetEventAttachments.ts} +85 -82
  24. package/src/@building/{building.enhance.ts → GetEventEnhancedName.ts} +54 -59
  25. package/src/@building/{building.geometry.ts → GetEventGeometry.ts} +47 -47
  26. package/src/@building/{building.headers.ts → GetEventHeader.ts} +36 -36
  27. package/src/@building/{building.polygon.ts → GetEventNodes.ts} +72 -69
  28. package/src/@building/{building.office.ts → GetEventOffice.ts} +42 -42
  29. package/src/@building/{building.properties.ts → GetEventProperties.ts} +95 -95
  30. package/src/@building/{building.signature.ts → GetEventSignature.ts} +60 -60
  31. package/src/@building/{building.tags.ts → GetEventTags.ts} +29 -24
  32. package/src/@building/{building.tracking.ts → GetEventTracking.ts} +67 -67
  33. package/src/@core/{core.clearEvents.ts → ClearEvents.ts} +30 -30
  34. package/src/@core/{core.createListener.ts → CreateListener.ts} +23 -23
  35. package/src/@core/{core.getEvents.ts → GetEvents.ts} +23 -23
  36. package/src/@core/{core.getNodes.ts → GetNodes.ts} +23 -23
  37. package/src/@core/{core.getRandomEvent.ts → GetRandomEvent.ts} +23 -23
  38. package/src/@core/{core.getVersion.ts → GetVersion.ts} +23 -23
  39. package/src/@core/{core.manualEvent.ts → ManualEvent.ts} +56 -38
  40. package/src/@core/{core.query.ts → QueryStanza.ts} +38 -38
  41. package/src/@core/{core.setNode.ts → SetNode.ts} +80 -80
  42. package/src/@core/{core.start.ts → StartService.ts} +60 -60
  43. package/src/@core/{core.stop.ts → StopService.ts} +31 -31
  44. package/src/@enums/AWIPS.ts +366 -0
  45. package/src/{@dictionaries/dictionaries.actions.ts → @enums/Actions.ts} +27 -27
  46. package/src/{@dictionaries/dictionaries.cancellation.ts → @enums/Cancellation.ts} +30 -30
  47. package/src/{@dictionaries/dictionaries.causes.ts → @enums/Causes.ts} +35 -35
  48. package/src/{@dictionaries/dictionaries.correlations.ts → @enums/Correlations.ts} +42 -42
  49. package/src/{@dictionaries/dictionaries.enhanced.ts → @enums/Enhanced.ts} +69 -66
  50. package/src/{@dictionaries/dictionaries.events.ts → @enums/Events.ts} +82 -82
  51. package/src/{@dictionaries/dictionaries.expressions.ts → @enums/Expressions.ts} +28 -28
  52. package/src/@enums/GlobalFilter.ts +24 -0
  53. package/src/{@dictionaries/dictionaries.hail.ts → @enums/Hail.ts} +37 -35
  54. package/src/{@dictionaries/dictionaries.icao.ts → @enums/ICAO.ts} +258 -258
  55. package/src/{@dictionaries/dictionaries.matches.ts → @enums/Matches.ts} +54 -54
  56. package/src/{@dictionaries/dictionaries.products.ts → @enums/Products.ts} +24 -24
  57. package/src/{@dictionaries/dictionaries.records.ts → @enums/Records.ts} +25 -25
  58. package/src/{@dictionaries/dictionaries.severity.ts → @enums/Severity.ts} +27 -27
  59. package/src/{@dictionaries/dictionaries.shapefiles.ts → @enums/Shapefiles.ts} +35 -35
  60. package/src/{@dictionaries/dictionaries.states.ts → @enums/States.ts} +71 -71
  61. package/src/{@dictionaries/dictionaries.status.ts → @enums/Status.ts} +30 -30
  62. package/src/{@dictionaries/dictionaries.global.ts → @enums/Strings.ts} +22 -24
  63. package/src/@enums/Tags.ts +167 -0
  64. package/src/{@dictionaries/dictionaries.testing.ts → @enums/Testing.ts} +24 -24
  65. package/src/@events/{events.api.ts → ParseAPI.ts} +116 -116
  66. package/src/@events/{events.text.ts → ParseText.ts} +87 -84
  67. package/src/@events/{events.ugc.ts → ParseUGC.ts} +93 -89
  68. package/src/@events/{events.vtec.ts → ParseVTEC.ts} +86 -86
  69. package/src/@manager/MakeEvents.ts +106 -0
  70. package/src/@manager/RemoveEvent.ts +70 -0
  71. package/src/@manager/{manager.setHash.ts → SetHash.ts} +35 -35
  72. package/src/@manager/Tasks.ts +246 -0
  73. package/src/@manager/{manager.updateEvents.ts → UpdateEvents.ts} +34 -32
  74. package/src/@manager/{manager.updateNodes.ts → UpdateNode.ts} +61 -53
  75. package/src/{@building/building.validate.ts → @manager/ValidateEvents.ts} +141 -152
  76. package/src/@modules/@database/{database.cache.ts → GetCachedEvents.ts} +49 -49
  77. package/src/@modules/@database/{database.broadcastify.ts → ImportBroadcastify.ts} +69 -66
  78. package/src/@modules/@database/{database.shapefiles.ts → ImportShapefiles.ts} +92 -92
  79. package/src/@modules/@database/{database.stanza.ts → ImportStanza.ts} +46 -46
  80. package/src/@modules/@database/{database.init.ts → InitializeDatabase.ts} +58 -58
  81. package/src/@modules/@eas/{eas.setEasTone.ts → GenerateEASMessage.ts} +144 -151
  82. package/src/@modules/@eas/{eas.getCleanDescription.ts → GetCleanDescription.ts} +91 -91
  83. package/src/@modules/@eas/{eas.getFloatPCM16.ts → GetFloatPCM16.ts} +29 -29
  84. package/src/@modules/@eas/{eas.getMergedPCM16.ts → GetMergedPCM16.ts} +32 -32
  85. package/src/@modules/@eas/{eas.getPCM16.ts → GetPCM16.ts} +52 -52
  86. package/src/@modules/@eas/{eas.getPCMToFloat.ts → GetPCMToFloat.ts} +26 -26
  87. package/src/@modules/@eas/{eas.getSampledPCM16.ts → GetSampledPCM16.ts} +36 -36
  88. package/src/@modules/@eas/{eas.getTTS.ts → GetTTS.ts} +54 -54
  89. package/src/@modules/@eas/{eas.getWavPCM16.ts → GetWavPCM16.ts} +52 -52
  90. package/src/@modules/@eas/{eas.setAFSK.ts → SetAFSK.ts} +51 -51
  91. package/src/@modules/@eas/{eas.setAsciiToBits.ts → SetAsciiToBits.ts} +31 -31
  92. package/src/@modules/@eas/{eas.setAttentionTone.ts → SetAttentionTone.ts} +40 -40
  93. package/src/@modules/@eas/{eas.setNoise.ts → SetNoise.ts} +32 -32
  94. package/src/@modules/@eas/{eas.setRadioEffect.ts → SetRadioEffect.ts} +50 -50
  95. package/src/@modules/@eas/{eas.setSameHeader.ts → SetSameHeader.ts} +44 -44
  96. package/src/@modules/@stanza/{stanza.getAwipsType.ts → GetAwipsType.ts} +47 -45
  97. package/src/@modules/@stanza/{stanza.validate.ts → ValidateStanza.ts} +49 -49
  98. package/src/@modules/@utilities/{utilities.createHttp.ts → CreateHttp.ts} +83 -83
  99. package/src/@modules/@utilities/{utilities.getFormattedTime.ts → GetFormattedTime.ts} +43 -43
  100. package/src/@modules/@utilities/{utilities.getLatestIssuance.ts → GetLatestIssuance.ts} +32 -32
  101. package/src/@modules/@utilities/{utilities.getMatched.ts → GetMatched.ts} +33 -33
  102. package/src/@modules/@utilities/{utilities.getSettings.ts → GetSettings.ts} +25 -25
  103. package/src/@modules/@utilities/{utilities.getShapeNearestPoint.ts → GetShapeNearestPoint.ts} +114 -114
  104. package/src/@modules/@utilities/{utilities.setCronSchedule.ts → SetCronSchedule.ts} +94 -94
  105. package/src/@modules/@utilities/{utilities.setDebug.ts → SetDebug.ts} +37 -38
  106. package/src/@modules/@utilities/{utilities.setEventEmit.ts → SetEventEmit.ts} +41 -41
  107. package/src/@modules/@utilities/{utilities.setListener.ts → SetListener.ts} +30 -30
  108. package/src/@modules/@utilities/{utilities.setSettings.ts → SetSettings.ts} +42 -42
  109. package/src/@modules/@utilities/{utilities.setSleep.ts → SetSleep.ts} +33 -33
  110. package/src/@modules/@utilities/{utilities.setTimeoutAction.ts → SetTimeoutAction.ts} +63 -62
  111. package/src/@modules/@utilities/{utilities.setWarning.ts → SetWarning.ts} +34 -34
  112. package/src/@modules/@xmpp/{xmpp.xDeploy.ts → DeployXMPP.ts} +57 -57
  113. package/src/@modules/@xmpp/{xmpp.xError.ts → ErrorXMPP.ts} +26 -26
  114. package/src/@modules/@xmpp/{xmpp.xOffline.ts → OfflineXMPP.ts} +36 -36
  115. package/src/@modules/@xmpp/{xmpp.xOnline.ts → OnlineXMPP.ts} +45 -45
  116. package/src/@modules/@xmpp/{xmpp.xReconnect.ts → ReconnectXMPP.ts} +64 -64
  117. package/src/@modules/@xmpp/{xmpp.xStanza.ts → StanzaXMPP.ts} +62 -62
  118. package/src/@parsers/@hvtec/{hvtec.extract.ts → HVExtract.ts} +39 -39
  119. package/src/@parsers/@pvtec/{pvtec.expires.ts → GetExpiry.ts} +25 -25
  120. package/src/@parsers/@pvtec/{pvtec.extract.ts → VTECExtract.ts} +48 -48
  121. package/src/@parsers/@text/{text.getDescriptionFromProduct.ts → GetDescriptionFromProduct.ts} +59 -52
  122. package/src/@parsers/@text/{text.getEmbedText.ts → GetEmbededText.ts} +55 -55
  123. package/src/@parsers/@text/{text.getPolygonFromProduct.ts → GetPolygonFromProduct.ts} +52 -52
  124. package/src/@parsers/@text/{text.getStringText.ts → GetStringText.ts} +57 -53
  125. package/src/@parsers/@text/{text.getTextFromProduct.ts → GetTextFromProduct.ts} +42 -42
  126. package/src/@parsers/@text/{text.getXML.ts → GetXML.ts} +60 -60
  127. package/src/@parsers/@ugc/{ugc.getCache.ts → GetCache.ts} +23 -23
  128. package/src/@parsers/@ugc/{ugc.expiry.ts → GetExpiry.ts} +31 -31
  129. package/src/@parsers/@ugc/{ugc.locations.ts → GetLocations.ts} +56 -56
  130. package/src/@parsers/@ugc/{ugc.header.ts → GetUGCHeader.ts} +29 -29
  131. package/src/@parsers/@ugc/{ugc.coordinates.ts → GetZonePolygon.ts} +110 -110
  132. package/src/@parsers/@ugc/{ugc.zones.ts → GetZones.ts} +51 -51
  133. package/src/@parsers/@ugc/{ugc.setCache.ts → SetCache.ts} +27 -27
  134. package/src/@parsers/@ugc/{ugc.extract.ts → UGCExtract.ts} +36 -36
  135. package/src/@types/{type.listener.ts → Actions.ts} +37 -38
  136. package/src/@types/{type.attributes.ts → Attributes.ts} +28 -28
  137. package/src/@types/{type.event.ts → Event.ts} +69 -69
  138. package/src/@types/{type.hvtec.ts → HVTEC.ts} +25 -25
  139. package/src/@types/{type.hash.ts → Hash.ts} +24 -24
  140. package/src/@types/{type.properties.ts → Properties.ts} +77 -77
  141. package/src/@types/{type.settings.ts → Settings.ts} +99 -93
  142. package/src/@types/{type.stanza.ts → Stanza.ts} +37 -37
  143. package/src/@types/{type.compiled.ts → StanzaCompiled.ts} +35 -34
  144. package/src/@types/{type.ugc.ts → UGC.ts} +24 -24
  145. package/src/@types/{type.pvtec.ts → VTEC.ts} +30 -30
  146. package/src/bootstrap.ts +128 -124
  147. package/src/index.ts +74 -74
  148. package/tsconfig.json +13 -13
  149. package/tsup.config.ts +15 -15
  150. package/.github/README.md +0 -384
  151. package/src/@dictionaries/dictionaries.awips.ts +0 -364
  152. package/src/@dictionaries/dictionaries.tags.ts +0 -93
  153. package/src/@manager/manager.mkEvent.ts +0 -98
  154. package/src/@manager/manager.rmEvent.ts +0 -59
  155. package/src/@manager/manager.updateListener.ts +0 -177
  156. package/testing/init.js +0 -91
@@ -1,61 +1,61 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
- */
19
-
20
- interface GetXMLOptions {
21
- message: string
22
- targets: string[]
23
- }
24
-
25
- export const getXML = (options: GetXMLOptions): Record<string, string> => {
26
- const extracted: Record<string, any> = {};
27
- const findValueByKey = (obj: any, searchKey: string) => {
28
- const results = [];
29
- if (obj === null || typeof obj !== 'object') {
30
- return results;
31
- }
32
- const searchKeyLower = searchKey.toLowerCase();
33
- for (const key in obj) {
34
- if (obj.hasOwnProperty(key) && key.toLowerCase() === searchKeyLower) {
35
- results.push(obj[key]);
36
- }
37
- }
38
- if (Array.isArray(obj)) {
39
- for (const item of obj) {
40
- if (item.valueName && item.valueName.toLowerCase() === searchKeyLower && item.value !== undefined) {
41
- results.push(item.value);
42
- }
43
- const nestedResults = findValueByKey(item, searchKey);
44
- results.push(...nestedResults);
45
- }
46
- }
47
- for (const key in obj) {
48
- if (obj.hasOwnProperty(key)) {
49
- const nestedResults = findValueByKey(obj[key], searchKey);
50
- results.push(...nestedResults);
51
- }
52
- }
53
- return results;
54
- };
55
- for (const key of options.targets) {
56
- const values = findValueByKey(options.message, key);
57
- const uniqueValues = [...new Set(values)];
58
- extracted[key] = uniqueValues.length === 0 ? null : (uniqueValues.length === 1 ? uniqueValues[0] : uniqueValues);
59
- }
60
- return extracted;
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ interface GetXMLOptions {
21
+ message: string
22
+ targets: string[]
23
+ }
24
+
25
+ export const GetXML = (options: GetXMLOptions): Record<string, string> => {
26
+ const extracted: Record<string, any> = {};
27
+ const findValueByKey = (obj: any, searchKey: string) => {
28
+ const results = [];
29
+ if (obj === null || typeof obj !== 'object') {
30
+ return results;
31
+ }
32
+ const searchKeyLower = searchKey.toLowerCase();
33
+ for (const key in obj) {
34
+ if (obj.hasOwnProperty(key) && key.toLowerCase() === searchKeyLower) {
35
+ results.push(obj[key]);
36
+ }
37
+ }
38
+ if (Array.isArray(obj)) {
39
+ for (const item of obj) {
40
+ if (item.valueName && item.valueName.toLowerCase() === searchKeyLower && item.value !== undefined) {
41
+ results.push(item.value);
42
+ }
43
+ const nestedResults = findValueByKey(item, searchKey);
44
+ results.push(...nestedResults);
45
+ }
46
+ }
47
+ for (const key in obj) {
48
+ if (obj.hasOwnProperty(key)) {
49
+ const nestedResults = findValueByKey(obj[key], searchKey);
50
+ results.push(...nestedResults);
51
+ }
52
+ }
53
+ return results;
54
+ };
55
+ for (const key of options.targets) {
56
+ const values = findValueByKey(options.message, key);
57
+ const uniqueValues = [...new Set(values)];
58
+ extracted[key] = uniqueValues.length === 0 ? null : (uniqueValues.length === 1 ? uniqueValues[0] : uniqueValues);
59
+ }
60
+ return extracted;
61
61
  }
@@ -1,24 +1,24 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
- */
19
-
20
- import { bootstrap } from "../../bootstrap";
21
-
22
- export const getCache = (key: string) => {
23
- return bootstrap.cache.ugc.get(key);
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ import { bootstrap } from "../../bootstrap";
21
+
22
+ export const getCache = (key: string) => {
23
+ return bootstrap.cache.ugc.get(key);
24
24
  };
@@ -1,32 +1,32 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
- */
19
-
20
- export const getExpiry = (message: string): string | null => {
21
- const match = message.match(/\b(\d{6})-/);
22
- if (!match) {
23
- return null;
24
- }
25
- const date = match?.[1];
26
- const day = parseInt(date?.slice(0, 2), 10);
27
- const hour = parseInt(date?.slice(2, 4), 10);
28
- const minute = parseInt(date?.slice(4, 6), 10);
29
- const now = new Date();
30
- const expires = new Date(Date.UTC(now.getUTCFullYear(),now.getUTCMonth(),day,hour,minute));
31
- return expires.toISOString();
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ export const GetExpiry = (message: string): string | null => {
21
+ const match = message.match(/\b(\d{6})-/);
22
+ if (!match) {
23
+ return null;
24
+ }
25
+ const date = match?.[1];
26
+ const day = parseInt(date?.slice(0, 2), 10);
27
+ const hour = parseInt(date?.slice(2, 4), 10);
28
+ const minute = parseInt(date?.slice(4, 6), 10);
29
+ const now = new Date();
30
+ const expires = new Date(Date.UTC(now.getUTCFullYear(),now.getUTCMonth(),day,hour,minute));
31
+ return expires.toISOString();
32
32
  }
@@ -1,57 +1,57 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
- */
19
-
20
- import { bootstrap } from "../../bootstrap";
21
- import { getCache } from "./ugc.getCache";
22
- import { setCache } from "./ugc.setCache";
23
-
24
- export const getLocations = async (zones: string[]): Promise<string[]> => {
25
- const uniqueZones = Array.from(new Set(zones));
26
-
27
- const results: string[] = [];
28
- const missing: string[] = [];
29
-
30
- for (let i = 0; i < uniqueZones.length; i++) {
31
- const zone = uniqueZones[i];
32
- const cached = getCache(zone);
33
-
34
- if (cached) {
35
- for (let j = 0; j < cached.length; j++) {
36
- results.push(cached[j]);
37
- }
38
- } else {
39
- missing.push(zone);
40
- }
41
- }
42
-
43
- if (missing.length > 0) {
44
- const rows = await bootstrap.database
45
- .prepare(
46
- `SELECT id, location FROM shapefiles WHERE id IN (${missing.map(() => '?').join(',')})`
47
- )
48
- .all(...missing);
49
-
50
- for (let i = 0; i < rows.length; i++) {
51
- const r = rows[i] as any;
52
- setCache(r.id, [r.location]);
53
- results.push(r.location);
54
- }
55
- }
56
- return results;
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ import { bootstrap } from "../../bootstrap";
21
+ import { getCache } from "./GetCache";
22
+ import { setCache } from "./SetCache";
23
+
24
+ export const getLocations = async (zones: string[]): Promise<string[]> => {
25
+ const uniqueZones = Array.from(new Set(zones));
26
+
27
+ const results: string[] = [];
28
+ const missing: string[] = [];
29
+
30
+ for (let i = 0; i < uniqueZones.length; i++) {
31
+ const zone = uniqueZones[i];
32
+ const cached = getCache(zone);
33
+
34
+ if (cached) {
35
+ for (let j = 0; j < cached.length; j++) {
36
+ results.push(cached[j]);
37
+ }
38
+ } else {
39
+ missing.push(zone);
40
+ }
41
+ }
42
+
43
+ if (missing.length > 0) {
44
+ const rows = await bootstrap.database
45
+ .prepare(
46
+ `SELECT id, location FROM shapefiles WHERE id IN (${missing.map(() => '?').join(',')})`
47
+ )
48
+ .all(...missing);
49
+
50
+ for (let i = 0; i < rows.length; i++) {
51
+ const r = rows[i] as any;
52
+ setCache(r.id, [r.location]);
53
+ results.push(r.location);
54
+ }
55
+ }
56
+ return results;
57
57
  };
@@ -1,30 +1,30 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
- */
19
-
20
- import { dict_expressions } from "../../@dictionaries/dictionaries.expressions"
21
-
22
- export const getUGCHeader = (message: string): string | null => {
23
- const start = message.search(dict_expressions.ugc1)
24
- const sub = message.substring(start)
25
- const end = sub.search(dict_expressions.ugc2)
26
- const fin = sub.substring(0, end)
27
- .replace(/\s+/g, '')
28
- .slice(0, -1);
29
- return fin ?? null
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ import { EnumExpressions } from "../../@enums/Expressions"
21
+
22
+ export const getUGCHeader = (message: string): string | null => {
23
+ const start = message.search(EnumExpressions.ugc1)
24
+ const sub = message.substring(start)
25
+ const end = sub.search(EnumExpressions.ugc2)
26
+ const fin = sub.substring(0, end)
27
+ .replace(/\s+/g, '')
28
+ .slice(0, -1);
29
+ return fin ?? null
30
30
  }
@@ -1,111 +1,111 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
- */
19
-
20
- import { bootstrap } from "../../bootstrap";
21
- import { union } from "polygon-clipping";
22
-
23
- interface CoordinatesOptions {
24
- zones: string[]
25
- isUnion: boolean
26
- }
27
-
28
- interface CoordinatesResponse {
29
- type: `Polygon` | `MultiPolygon`
30
- coordinates: any[]
31
- }
32
-
33
- export const getZonePolygon = (options: CoordinatesOptions): CoordinatesResponse | null => {
34
- const list = [...new Set(options.zones.map(z => z.trim()))].filter(z => z === 'XX000' ? false : true);
35
- if (list.length === 0) return null;
36
-
37
- const placeholders = list.map(() => "?").join(",");
38
- const rows = bootstrap.database
39
- .prepare(`SELECT geometry FROM shapefiles WHERE id IN (${placeholders})`)
40
- .all(...list);
41
- const polygons: any[] = [];
42
- for (const row of rows) {
43
- if (!row?.geometry) continue;
44
- const geom = JSON.parse(row.geometry);
45
- if (geom?.type === "Polygon") {
46
- polygons.push(geom.coordinates);
47
- }
48
- }
49
-
50
- if (polygons.length === 0) return null;
51
-
52
- if (options.isUnion) {
53
- const unionFn = union as (...polys: any[]) => any;
54
- const mergedCoords = unionFn(...polygons);
55
- if (!mergedCoords || mergedCoords.length === 0) return null;
56
- let maxArea = -1;
57
- let bestPoly: any[] = [];
58
- for (const poly of mergedCoords) {
59
- const outerRing = poly[0];
60
- let area = 0;
61
- for (let i = 0; i < outerRing.length - 1; i++) {
62
- const [x1, y1] = outerRing[i];
63
- const [x2, y2] = outerRing[i + 1];
64
- area += x1 * y2 - x2 * y1;
65
- }
66
- area = Math.abs(area / 2);
67
- if (area > maxArea) {
68
- maxArea = area;
69
- bestPoly = poly;
70
- }
71
- }
72
- if (!bestPoly || bestPoly.length === 0) return null;
73
- const outerRing = bestPoly[0];
74
- const skip = Math.max(1, parseInt(String(bootstrap.settings.GlobalSettings.ShapefileSkipPoints), 10) ?? 1);
75
- let skipped = outerRing.filter((_: any, idx: number) => idx % skip === 0);
76
- if (skipped.length < 4) {
77
- skipped = outerRing.slice();
78
- }
79
- const first = skipped[0];
80
- const last = skipped[skipped.length - 1];
81
- if (!first || !last || first[0] !== last[0] || first[1] !== last[1]) {
82
- skipped.push([first[0], first[1]]);
83
- }
84
- return {type: "Polygon", coordinates: [skipped]};
85
- } else {
86
- const multi: any[] = [];
87
- for (const polyCoords of polygons) {
88
- if (Array.isArray(polyCoords) && Array.isArray(polyCoords[0])) {
89
- multi.push(polyCoords);
90
- }
91
- }
92
- if (multi.length === 0) return null;
93
- const skip = Math.max(1, parseInt(String(bootstrap.settings.GlobalSettings.ShapefileSkipPoints), 10) ?? 1);
94
- if (skip > 1) {
95
- for (let p = 0; p < multi.length; p++) {
96
- for (let r = 0; r < multi[p].length; r++) {
97
- const ring = multi[p][r];
98
- let reduced = ring.filter((_: any, i: number) => i % skip === 0);
99
- if (reduced.length < 4) reduced = ring.slice();
100
- const first = reduced[0];
101
- const last = reduced[reduced.length - 1];
102
- if ( first && last && (first[0] !== last[0] || first[1] !== last[1])) {
103
- reduced.push([first[0], first[1]]);
104
- }
105
- multi[p][r] = reduced;
106
- }
107
- }
108
- }
109
- return {type: "MultiPolygon", coordinates: multi};
110
- }
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ import { bootstrap } from "../../bootstrap"
21
+ import { union } from "polygon-clipping";
22
+
23
+ interface CoordinatesOptions {
24
+ zones: string[]
25
+ isUnion: boolean
26
+ }
27
+
28
+ interface CoordinatesResponse {
29
+ type: `Polygon` | `MultiPolygon`
30
+ coordinates: any[]
31
+ }
32
+
33
+ export const getZonePolygon = (options: CoordinatesOptions): CoordinatesResponse | null => {
34
+ const list = [...new Set(options.zones.map(z => z.trim()))].filter(z => z === 'XX000' ? false : true);
35
+ if (list.length === 0) return null;
36
+
37
+ const placeholders = list.map(() => "?").join(",");
38
+ const rows = bootstrap.database
39
+ .prepare(`SELECT geometry FROM shapefiles WHERE id IN (${placeholders})`)
40
+ .all(...list);
41
+ const polygons: any[] = [];
42
+ for (const row of rows) {
43
+ if (!row?.geometry) continue;
44
+ const geom = JSON.parse(row.geometry);
45
+ if (geom?.type === "Polygon") {
46
+ polygons.push(geom.coordinates);
47
+ }
48
+ }
49
+
50
+ if (polygons.length === 0) return null;
51
+
52
+ if (options.isUnion) {
53
+ const unionFn = union as (...polys: any[]) => any;
54
+ const mergedCoords = unionFn(...polygons);
55
+ if (!mergedCoords || mergedCoords.length === 0) return null;
56
+ let maxArea = -1;
57
+ let bestPoly: any[] = [];
58
+ for (const poly of mergedCoords) {
59
+ const outerRing = poly[0];
60
+ let area = 0;
61
+ for (let i = 0; i < outerRing.length - 1; i++) {
62
+ const [x1, y1] = outerRing[i];
63
+ const [x2, y2] = outerRing[i + 1];
64
+ area += x1 * y2 - x2 * y1;
65
+ }
66
+ area = Math.abs(area / 2);
67
+ if (area > maxArea) {
68
+ maxArea = area;
69
+ bestPoly = poly;
70
+ }
71
+ }
72
+ if (!bestPoly || bestPoly.length === 0) return null;
73
+ const outerRing = bestPoly[0];
74
+ const skip = Math.max(1, parseInt(String(bootstrap.settings.GlobalSettings.ShapefileSkipPoints), 10) ?? 1);
75
+ let skipped = outerRing.filter((_: any, idx: number) => idx % skip === 0);
76
+ if (skipped.length < 4) {
77
+ skipped = outerRing.slice();
78
+ }
79
+ const first = skipped[0];
80
+ const last = skipped[skipped.length - 1];
81
+ if (!first || !last || first[0] !== last[0] || first[1] !== last[1]) {
82
+ skipped.push([first[0], first[1]]);
83
+ }
84
+ return {type: "Polygon", coordinates: [skipped]};
85
+ } else {
86
+ const multi: any[] = [];
87
+ for (const polyCoords of polygons) {
88
+ if (Array.isArray(polyCoords) && Array.isArray(polyCoords[0])) {
89
+ multi.push(polyCoords);
90
+ }
91
+ }
92
+ if (multi.length === 0) return null;
93
+ const skip = Math.max(1, parseInt(String(bootstrap.settings.GlobalSettings.ShapefileSkipPoints), 10) ?? 1);
94
+ if (skip > 1) {
95
+ for (let p = 0; p < multi.length; p++) {
96
+ for (let r = 0; r < multi[p].length; r++) {
97
+ const ring = multi[p][r];
98
+ let reduced = ring.filter((_: any, i: number) => i % skip === 0);
99
+ if (reduced.length < 4) reduced = ring.slice();
100
+ const first = reduced[0];
101
+ const last = reduced[reduced.length - 1];
102
+ if ( first && last && (first[0] !== last[0] || first[1] !== last[1])) {
103
+ reduced.push([first[0], first[1]]);
104
+ }
105
+ multi[p][r] = reduced;
106
+ }
107
+ }
108
+ }
109
+ return {type: "MultiPolygon", coordinates: multi};
110
+ }
111
111
  }