@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
package/package.json CHANGED
@@ -1,52 +1,47 @@
1
- {
2
- "name": "@atmosx/event-product-parser",
3
- "version": "3.0.54",
4
- "description": "NOAA Weather Wire & NWS API Parser - Built for standalone and Project AtmosphericX Integration.",
5
- "main": "dist/cjs/index.cjs",
6
- "module": "dist/esm/index.mjs",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/AtmosphericX/event-product-parser",
10
- "branch": "v3-beta-branch"
11
- },
12
- "scripts": {
13
- "start": "cd ./test && node ./index.js",
14
- "build": "tsup && cd ./test && node ./index.js",
15
- "publish": "tsup && npm publish --access public",
16
- "publish-beta-branch": "tsup && npm publish --tag v3-beta-branch --access public"
17
- },
18
- "keywords": [
19
- "NWWS",
20
- "NOAA Weather Wire Service",
21
- "TypeScript",
22
- "XMPP",
23
- "Parser",
24
- "JavaScript",
25
- "CommonJS",
26
- "ESM"
27
- ],
28
- "author": "k3yomi, StarflightWx",
29
- "license": "MIT",
30
- "bugs": {
31
- "url": "https://github.com/AtmosphericX/event-product-parser/issues"
32
- },
33
- "homepage": "https://github.com/AtmosphericX/event-product-parser#readme",
34
- "dependencies": {
35
- "@xmpp/client": "0.14.0",
36
- "better-sqlite3": "12.9.0",
37
- "croner": "10.0.1",
38
- "express": "5.2.1",
39
- "express-ws": "5.0.2",
40
- "jszip": "3.10.1",
41
- "p-queue": "^9.3.0",
42
- "polygon-clipping": "0.15.7",
43
- "say": "0.16.0",
44
- "shapefile": "0.6.6",
45
- "typescript": "5.9.3",
46
- "xml2js": "0.6.2"
47
- },
48
- "devDependencies": {
49
- "@types/node": "25.2.0",
50
- "tsup": "8.5.1"
51
- }
52
- }
1
+ {
2
+ "name": "@atmosx/event-product-parser",
3
+ "version": "3.0.61",
4
+ "description": "NOAA Weather Wire & NWS API Parser - Built for standalone and Project AtmosphericX Integration.",
5
+ "main": "dist/cjs/index.cjs",
6
+ "module": "dist/esm/index.mjs",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/AtmosphericX/event-product-parser",
10
+ "branch": "v3-beta-branch"
11
+ },
12
+ "scripts": {
13
+ "start": "cd ./test && node ./index.js",
14
+ "build": "tsup && cd ./test && node ./index.js",
15
+ "publish": "tsup && npm publish --access public",
16
+ "publish-beta-branch": "tsup && npm publish --tag v3-beta-branch --access public"
17
+ },
18
+ "keywords": [
19
+ "NWWS",
20
+ "NOAA Weather Wire Service",
21
+ "TypeScript",
22
+ "XMPP",
23
+ "Parser",
24
+ "JavaScript",
25
+ "CommonJS",
26
+ "ESM"
27
+ ],
28
+ "author": "k3yomi, StarflightWx",
29
+ "license": "MIT",
30
+ "bugs": {
31
+ "url": "https://github.com/AtmosphericX/event-product-parser/issues"
32
+ },
33
+ "homepage": "https://github.com/AtmosphericX/event-product-parser#readme",
34
+ "dependencies": {
35
+ "@xmpp/client": "0.14.0",
36
+ "better-sqlite3": "12.9.0",
37
+ "croner": "10.0.1",
38
+ "jszip": "3.10.1",
39
+ "polygon-clipping": "0.15.7",
40
+ "shapefile": "0.6.6",
41
+ "typescript": "5.9.3"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "25.2.0",
45
+ "tsup": "8.5.1"
46
+ }
47
+ }
@@ -1,56 +1,56 @@
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 { TypeStanzaCompiled } from "../@types/type.compiled"
21
- import { TypeSettings } from "../@types/type.settings"
22
- import { bootstrap } from "../bootstrap"
23
- import { text } from "../@events/events.text"
24
- import { ugc } from "../@events/events.ugc"
25
- import { vtec } from "../@events/events.vtec"
26
- import { api } from "../@events/events.api"
27
- import { validateEvents } from "./building.validate"
28
-
29
- export const createEvent = async (stanza: TypeStanzaCompiled, ignorePushing?: boolean): Promise<void | string> => {
30
- const settings = bootstrap.settings as TypeSettings
31
- const StanzaSettings = settings.NOAAWeatherWireServiceSettings.StanzaSettings;
32
-
33
- const isVtecEvent = (stanza.isVTEC && stanza.isUGC)
34
- const isUgcEvent = (!stanza.isVTEC && stanza.isUGC)
35
- const isTextEvent = (!stanza.isVTEC && !stanza.isUGC)
36
- const isNWWS = (stanza.isNWWS)
37
-
38
- switch (true) {
39
- case (!isNWWS):
40
- await api(stanza)
41
- break;
42
- case (isNWWS && !StanzaSettings.DisableVTEC && isVtecEvent):
43
- await vtec(stanza)
44
- break;
45
- case (isNWWS && !StanzaSettings.DisableUGC && isUgcEvent):
46
- await ugc(stanza)
47
- break;
48
- case (isNWWS && !StanzaSettings.DisableText && isTextEvent):
49
- await text(stanza)
50
- break;
51
- }
52
- if (!ignorePushing) {
53
- validateEvents(bootstrap.cache.processed)
54
- }
55
- return 'nothing picked';
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 { TypeStanzaCompiled } from "../@types/StanzaCompiled"
21
+ import { TypeSettings } from "../@types/Settings"
22
+ import { bootstrap } from "../bootstrap"
23
+ import { ParseText } from "../@events/ParseText"
24
+ import { ParseUGC } from "../@events/ParseUGC"
25
+ import { ParseVTEC } from "../@events/ParseVTEC"
26
+ import { ParseAPI } from "../@events/ParseAPI"
27
+ import { ValidateEvents } from "../@manager/ValidateEvents"
28
+
29
+ export const CreateEvent = async (stanza: TypeStanzaCompiled, ignorePushing?: boolean): Promise<void | string> => {
30
+ const settings = bootstrap.settings as TypeSettings
31
+ const StanzaSettings = settings.NOAAWeatherWireServiceSettings.StanzaSettings;
32
+
33
+ const isVtecEvent = (stanza.isVTEC && stanza.isUGC)
34
+ const isUgcEvent = (!stanza.isVTEC && stanza.isUGC)
35
+ const isTextEvent = (!stanza.isVTEC && !stanza.isUGC)
36
+ const isNWWS = (stanza.isNWWS)
37
+
38
+ switch (true) {
39
+ case (!isNWWS):
40
+ await ParseAPI(stanza)
41
+ break;
42
+ case (isNWWS && !StanzaSettings.DisableVTEC && isVtecEvent):
43
+ await ParseVTEC(stanza)
44
+ break;
45
+ case (isNWWS && !StanzaSettings.DisableUGC && isUgcEvent):
46
+ await ParseUGC(stanza)
47
+ break;
48
+ case (isNWWS && !StanzaSettings.DisableText && isTextEvent):
49
+ await ParseText(stanza)
50
+ break;
51
+ }
52
+ if (!ignorePushing) {
53
+ await ValidateEvents(bootstrap.cache.processed)
54
+ }
55
+ return 'nothing picked';
56
56
  }
@@ -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
- export const getCleanedEvent = <T extends Record<string, any>>(event: T): T => {
21
- for (const key of Object.keys(event)) {
22
- const value = event[key];
23
- if (value === null || value === undefined) {
24
- delete event[key];
25
- } else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
26
- (event as Record<string, any>)[key] = getCleanedEvent(value as Record<string, any>) as any;
27
- }
28
- }
29
- return event;
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 GetCleanedEvent = <T extends Record<string, any>>(event: T): T => {
21
+ for (const key of Object.keys(event)) {
22
+ const value = event[key];
23
+ if (value === null || value === undefined) {
24
+ delete event[key];
25
+ } else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
26
+ (event as Record<string, any>)[key] = GetCleanedEvent(value as Record<string, any>) as any;
27
+ }
28
+ }
29
+ return event;
30
30
  };
@@ -1,83 +1,86 @@
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 { TypeEvent } from "../@types/type.event"
21
- import { bootstrap } from "../bootstrap"
22
- import { dict_states } from "../@dictionaries/dictionaries.states"
23
- import { dict_expressions } from "../@dictionaries/dictionaries.expressions"
24
- import { getLatestIssuance } from "../@modules/@utilities/utilities.getLatestIssuance";
25
-
26
- interface GetEventAttachmentsResponse {
27
- name: string
28
- link: string
29
- }
30
-
31
- type BroadcastifyResponse = {
32
- state: string
33
- county: string
34
- feed: string
35
- type: string
36
- link: string
37
- }
38
-
39
- export const getEventAttachments = (event: TypeEvent): GetEventAttachmentsResponse[] | null => {
40
- let attachments = [];
41
- const issuanceTime = getLatestIssuance();
42
- const spcNumber = event?.properties?.discussion_parameters?.discussion_number;
43
- const watchNumber = event?.properties?.watch_parameters?.watch_number;
44
- const locations = event?.properties?.locations_array;
45
- const events = [
46
- { target: "Storm Prediction Center Day 1 Outlook", attachment: `https://www.spc.noaa.gov/products/outlook/day1otlk_${issuanceTime}.png` },
47
- { target: "Storm Prediction Center Day 2 Outlook", attachment: `https://www.spc.noaa.gov/products/outlook/day2otlk.png` },
48
- { target: "Storm Prediction Center Day 3 Outlook", attachment: `https://www.spc.noaa.gov/products/outlook/day3otlk.png` },
49
- { target: "Mesoscale Discussion", attachment: `https://www.spc.noaa.gov/products/md/mcd${spcNumber}.png` },
50
- { target: "Tornado Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` },
51
- { target: "PDS Tornado Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` },
52
- { target: "Severe Thunderstorm Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` },
53
- { target: "PDS Severe Thunderstorm Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` }
54
- ]
55
-
56
- if (events.find((e) => e.target === event.properties.event)) {
57
- attachments.push({ name: `Image: Graphic`, link: events.find((e) => e.target.toLowerCase() === event.properties.event.toLowerCase()).attachment });
58
- }
59
-
60
- for (const location of locations) {
61
- if (dict_expressions.location.test(location)) {
62
- const lines = [`Northern`, `Southern`, `Eastern`, `Western`, `Inland`, `Costal`, `County`]
63
- const county = location?.split(',')[0]?.trim().replace(new RegExp(`^(${lines.join('|')}) `), '')
64
- const state = dict_states[location?.split(',')[1]?.trim()]
65
- const feeds = bootstrap.database.prepare(`SELECT * FROM broadcastify WHERE state = ? AND county = ?`).all(state, county).sort((a, b) => {
66
- const typeOrder = ['Other', 'Public Safety'];
67
- const indexA = typeOrder.indexOf(a.type);
68
- const indexB = typeOrder.indexOf(b.type);
69
- return indexA - indexB;
70
- });
71
- const tags = bootstrap.settings.BroadcastifySettings.BroadcastifyTags;
72
- const filtered = feeds.filter((feed: BroadcastifyResponse) => tags.includes(feed.type));
73
- if (filtered.length > 0) {
74
- filtered.map((filtered: BroadcastifyResponse) => {
75
- if (!attachments.some((a) => a.link === filtered.link)) {
76
- attachments.push({ name: `${filtered.type}: ${filtered.feed}`, link: filtered.link });
77
- }
78
- });
79
- }
80
- }
81
- }
82
- return attachments;
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 { TypeEvent } from "../@types/Event"
21
+ import { bootstrap } from "../bootstrap"
22
+ import { EnumStates } from "../@enums/States"
23
+ import { EnumExpressions } from "../@enums/Expressions"
24
+ import { GetLatestIssuance } from "../@modules/@utilities/GetLatestIssuance";
25
+
26
+ interface GetEventAttachmentsResponse {
27
+ name: string
28
+ link: string
29
+ }
30
+
31
+ type BroadcastifyResponse = {
32
+ state: string
33
+ county: string
34
+ feed: string
35
+ type: string
36
+ link: string
37
+ }
38
+
39
+ export const GetEventAttachments = (event: TypeEvent): GetEventAttachmentsResponse[] | null => {
40
+ let attachments = [];
41
+ const settings = bootstrap.settings;
42
+ const issuanceTime = GetLatestIssuance();
43
+ const spcNumber = event?.properties?.discussion_parameters?.discussion_number;
44
+ const watchNumber = event?.properties?.watch_parameters?.watch_number;
45
+ const locations = event?.properties?.locations_array;
46
+ const events = [
47
+ { target: "Storm Prediction Center Day 1 Outlook", attachment: `https://www.spc.noaa.gov/products/outlook/day1otlk_${issuanceTime}.png` },
48
+ { target: "Storm Prediction Center Day 2 Outlook", attachment: `https://www.spc.noaa.gov/products/outlook/day2otlk.png` },
49
+ { target: "Storm Prediction Center Day 3 Outlook", attachment: `https://www.spc.noaa.gov/products/outlook/day3otlk.png` },
50
+ { target: "Mesoscale Discussion", attachment: `https://www.spc.noaa.gov/products/md/mcd${spcNumber}.png` },
51
+ { target: "Tornado Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` },
52
+ { target: "PDS Tornado Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` },
53
+ { target: "Severe Thunderstorm Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` },
54
+ { target: "PDS Severe Thunderstorm Watch", attachment: `https://www.spc.noaa.gov/products/watch/ww${watchNumber}_radar_big.gif` }
55
+ ]
56
+
57
+ if (events.find((e) => e.target === event.properties.event)) {
58
+ attachments.push({ name: `Image: Graphic`, link: events.find((e) => e.target.toLowerCase() === event.properties.event.toLowerCase()).attachment });
59
+ }
60
+
61
+ if (settings.BroadcastifySettings.BroadcastifyAttachments) {
62
+ for (const location of locations) {
63
+ if (EnumExpressions.location.test(location)) {
64
+ const lines = [`Northern`, `Southern`, `Eastern`, `Western`, `Inland`, `Costal`, `County`]
65
+ const county = location?.split(',')[0]?.trim().replace(new RegExp(`^(${lines.join('|')}) `), '')
66
+ const state = EnumStates[location?.split(',')[1]?.trim()]
67
+ const feeds = bootstrap.database.prepare(`SELECT * FROM broadcastify WHERE state = ? AND county = ?`).all(state, county).sort((a, b) => {
68
+ const typeOrder = ['Other', 'Public Safety'];
69
+ const indexA = typeOrder.indexOf(a.type);
70
+ const indexB = typeOrder.indexOf(b.type);
71
+ return indexA - indexB;
72
+ })
73
+ const tags = bootstrap.settings.BroadcastifySettings.BroadcastifyTags;
74
+ const filtered = feeds.filter((feed: BroadcastifyResponse) => tags.includes(feed.type));
75
+ if (filtered.length > 0) {
76
+ filtered.map((filtered: BroadcastifyResponse) => {
77
+ if (!attachments.some((a) => a.link === filtered.link)) {
78
+ attachments.push({ name: `${filtered.type}: ${filtered.feed}`, link: filtered.link });
79
+ }
80
+ });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ return attachments;
83
86
  }
@@ -1,60 +1,55 @@
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 { TypeEvent } from "../@types/type.event";
21
- import { TypeSettings } from "../@types/type.settings";
22
- import { dict_enhanced } from "../@dictionaries/dictionaries.enhanced"
23
- import { bootstrap } from "../bootstrap"
24
-
25
- export const getEventEnhancedName = (event: TypeEvent): string => {
26
- const configurations = bootstrap.settings as TypeSettings
27
- let name = event?.properties?.event
28
-
29
- if (!configurations?.GlobalSettings?.BetterEventNames) {
30
- return name
31
- }
32
-
33
- const damage = event?.properties?.parameters?.damage_threat
34
- const tornado = event?.properties?.parameters?.tornado_threat;
35
- const pdswatch = event?.properties?.watch_parameters?.pds_watch;
36
- const description = event?.properties?.description?.toLowerCase()
37
- for (const [eventKey, eventConfig] of Object.entries(dict_enhanced)) {
38
- if (eventKey !== name) continue;
39
- for (const [paramKey, paramValue] of Object.entries(eventConfig)) {
40
- let matches = true;
41
- if (paramValue?.description) {
42
- if (!description.includes(paramValue.description.toLowerCase())) matches = false;
43
- }
44
- if (paramValue?.damage) {
45
- if (paramValue.damage !== damage) matches = false;
46
- }
47
- if (paramValue?.tornado) {
48
- if (paramValue.tornado !== tornado) matches = false;
49
- }
50
- if (paramValue?.pdswatch) {
51
- if (paramValue.pdswatch !== pdswatch) matches = false;
52
- }
53
- if (matches) {
54
- name = paramKey;
55
- break;
56
- }
57
- }
58
- }
59
- return name;
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 { TypeEvent } from "../@types/Event";
21
+ import { TypeSettings } from "../@types/Settings";
22
+ import { EnumEnhanced } from "../@enums/Enhanced"
23
+ import { bootstrap } from "../bootstrap"
24
+
25
+ export const GetEventEnhancedName = (event: TypeEvent): string => {
26
+ let name = event?.properties?.event;
27
+
28
+ const damage = event?.properties?.parameters?.damage_threat
29
+ const tornado = event?.properties?.parameters?.tornado_threat;
30
+ const pdswatch = event?.properties?.watch_parameters?.pds_watch;
31
+ const description = event?.properties?.description?.toLowerCase()
32
+ for (const [eventKey, eventConfig] of Object.entries(EnumEnhanced)) {
33
+ if (eventKey !== name) continue;
34
+ for (const [paramKey, paramValue] of Object.entries(eventConfig)) {
35
+ let matches = true;
36
+ if (paramValue?.description) {
37
+ if (!description.includes(paramValue.description.toLowerCase())) matches = false;
38
+ }
39
+ if (paramValue?.damage) {
40
+ if (paramValue.damage !== damage) matches = false;
41
+ }
42
+ if (paramValue?.tornado) {
43
+ if (paramValue.tornado !== tornado) matches = false;
44
+ }
45
+ if (paramValue?.pdswatch) {
46
+ if (paramValue.pdswatch !== pdswatch) matches = false;
47
+ }
48
+ if (matches) {
49
+ name = paramKey;
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ return name;
60
55
  }