@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
@@ -0,0 +1,70 @@
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 { EnumStrings } from "../@enums/Strings";
22
+ import { bootstrap } from "../bootstrap"
23
+ import { SetEventEmit } from "../@modules/@utilities/SetEventEmit";
24
+ import { SetTimeoutAction } from "../@modules/@utilities/SetTimeoutAction";
25
+ import { Tasks } from "./Tasks";
26
+
27
+
28
+ export const RemoveEvent = async (event: TypeEvent, isTimeBasedExpiration: boolean):Promise<void> => {
29
+ const gTracking = event.properties.metadata.tracking;
30
+ const isTrackingEventLogged = bootstrap.cache.events.features
31
+ .find(f => f?.properties?.metadata?.tracking === gTracking);
32
+ const isStatement = event.properties.status_metadata.is_statement;
33
+
34
+ if (isTrackingEventLogged) {
35
+ event.properties.expires = new Date().toISOString();
36
+ event.properties.status = `Expired`;
37
+ event.properties.status_metadata.is_expired = true;
38
+
39
+ const description = isTimeBasedExpiration ? EnumStrings.cancellation
40
+ .replace(`{SENDER}`, event.properties.geocode.office.name)
41
+ .replace(`{EVENT}`, event.properties.event) : event.properties.description
42
+ event.properties.description = description;
43
+ event.properties.metadata.raw = isTimeBasedExpiration ? description : event.properties.metadata.raw;
44
+ event.properties.metadata.history.push({
45
+ description: isTimeBasedExpiration ? description : event.properties.description,
46
+ issued: event.properties.expires,
47
+ status: event.properties.status
48
+ })
49
+
50
+ bootstrap.cache.events.features
51
+ .splice(bootstrap.cache.events.features.indexOf(isTrackingEventLogged), 1);
52
+ bootstrap.cache.hashes = bootstrap.cache.hashes
53
+ .filter(hash => hash.tracking !== gTracking);
54
+
55
+ if (!isStatement) {
56
+ SetEventEmit({
57
+ event: `onEventStatus`,
58
+ metadata: { type: `Removed`, event: event },
59
+ message: `[Removed] ${event.properties.event} (${event.properties.status}) (${gTracking})`
60
+ })
61
+ await Tasks([event])
62
+ }
63
+ SetTimeoutAction({ identifier: gTracking, expire: true })
64
+ }
65
+ SetEventEmit({
66
+ event: `onEventCache`,
67
+ metadata: bootstrap.cache.events,
68
+ limited: true
69
+ })
70
+ }
@@ -1,36 +1,36 @@
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 { TypeHash } from "../@types/type.hash"
22
- import { bootstrap } from "../bootstrap"
23
-
24
- export const setHash = (event: TypeEvent, entry: TypeHash): void => {
25
- if (entry) {
26
- entry.hashes.push(event.properties.metadata.hash);
27
- entry.expires = event.properties.expires;
28
- } else {
29
- bootstrap.cache.hashes.push({
30
- tracking: event.properties.metadata.tracking,
31
- hashes: [event.properties.metadata.hash],
32
- expires: event.properties.expires
33
- });
34
- }
35
-
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 { TypeHash } from "../@types/Hash"
22
+ import { bootstrap } from "../bootstrap"
23
+
24
+ export const SetHash = (event: TypeEvent, entry: TypeHash): void => {
25
+ if (!entry) {
26
+ bootstrap.cache.hashes.push({
27
+ tracking: event.properties.metadata.tracking,
28
+ hashes: [event.properties.metadata.hash],
29
+ expires: event.properties.expires
30
+ });
31
+ return;
32
+ }
33
+
34
+ entry.hashes.push(event.properties.metadata.hash);
35
+ entry.expires = event.properties.expires;
36
36
  }
@@ -0,0 +1,246 @@
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 { TypeSettings } from "../@types/Settings";
21
+ import { TypeEvent } from "../@types/Event";
22
+ import { TypeActions } from "../@types/Actions";
23
+ import { bootstrap } from "../bootstrap"
24
+ import { GenerateEASMessage } from "../@modules/@eas/GenerateEASMessage"
25
+ import { SetTimeoutAction } from "../@modules/@utilities/SetTimeoutAction";
26
+ import { GetEmebedText } from "../@parsers/@text/GetEmbededText";
27
+ import { GetStringText } from "../@parsers/@text/GetStringText";
28
+ import { GetCleanedEvent } from "../@building/GetCleanedEvent"
29
+ import { CreateHttp } from "../@modules/@utilities/CreateHttp";
30
+ import { SetDebug } from "../@modules/@utilities/SetDebug";
31
+ import { GetMatched } from "../@modules/@utilities/GetMatched";
32
+ import { mkdir, writeFile, readFile, appendFile } from "fs/promises";
33
+
34
+ export const Tasks = async (events: TypeEvent[]): Promise<void> => {
35
+ const tick = performance.now()
36
+ const settings = bootstrap.settings as TypeSettings;
37
+ const notifyServer = settings.NotifyServer;
38
+ const actions = settings.ActionSettings as TypeActions[];
39
+ for (const event of events) {
40
+ const properties = event.properties;
41
+ const hasActions = Array.isArray(actions) && actions.length > 0;
42
+ if (!hasActions) {
43
+ SetDebug({ title: `Tasks`, message: `${Math.round(performance.now() - tick)}ms` });
44
+ return;
45
+ }
46
+ const metadata = {
47
+ text: null,
48
+ eas: null,
49
+ json: null,
50
+ name: properties.event,
51
+ status: properties.status,
52
+ description: properties.description,
53
+ tracking: properties.metadata.tracking,
54
+ header: properties.metadata.header,
55
+ raw: properties.metadata.raw,
56
+ expired: properties.status_metadata.is_expired,
57
+ attachments: properties.metadata.attachments
58
+ }
59
+
60
+ const archiveSettings = settings.GlobalSettings?.ArchiveSettings;
61
+ const textArchiveDir = archiveSettings?.TextDirectory;
62
+ const jsonArchiveDir = archiveSettings?.JSONDirectory;
63
+ const eventBaseName = `${metadata.name}_${metadata.tracking}`;
64
+ const easTitle = `${metadata.name}_${metadata.status}_${metadata.tracking}`;
65
+ const cleanedEventText = JSON.stringify(GetCleanedEvent(event), null, 2);
66
+ const stringText = GetStringText(event);
67
+ const embedText = GetEmebedText(event);
68
+
69
+ for (const action of actions) {
70
+ const events = action?.Events;
71
+ const webhook = action?.Webhook;
72
+ const notify = action?.NotificationServer;
73
+ const uploads = action?.Uploads
74
+ const isMatched = GetMatched(events ?? [], metadata.name)
75
+
76
+ if (events?.length == 0 || isMatched) {
77
+ const t = performance.now()
78
+
79
+ if (uploads?.EAS && !metadata.eas) {
80
+ metadata.eas = await GenerateEASMessage({
81
+ title: easTitle,
82
+ message: metadata.description,
83
+ header: metadata.header
84
+ });
85
+ SetDebug({
86
+ title: "Tasks/EAS",
87
+ message: `${Math.round(performance.now() - t)}ms`
88
+ });
89
+ }
90
+
91
+ if (uploads?.TEXT && metadata.text === null) {
92
+ const t = performance.now()
93
+ if (textArchiveDir) {
94
+ const file = (`${textArchiveDir}/${eventBaseName}.txt`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
95
+ await mkdir(textArchiveDir, { recursive: true });
96
+ await appendFile(file, `${"\n".repeat(7)}${metadata.raw}`);
97
+ SetDebug({
98
+ title: "Tasks/TEXT",
99
+ message: `${Math.round(performance.now() - t)}ms`
100
+ });
101
+ }
102
+ metadata.text = metadata.raw;
103
+ }
104
+
105
+ if (uploads?.JSON && metadata.json === null) {
106
+ const t = performance.now()
107
+ if (jsonArchiveDir) {
108
+ const file = (`${jsonArchiveDir}/${eventBaseName}.json`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
109
+ await mkdir(jsonArchiveDir, { recursive: true });
110
+ await writeFile(file, cleanedEventText);
111
+ SetDebug({
112
+ title: "Tasks/JSON",
113
+ message: `${Math.round(performance.now() - t)}ms`
114
+ });
115
+ }
116
+ metadata.json = cleanedEventText;
117
+ }
118
+
119
+ if (notifyServer?.Enabled && notify?.Enabled && notify?.Topic) {
120
+ let buttons = [];
121
+ const t = performance.now()
122
+ const auth = notifyServer?.Credentials?.Username && notifyServer?.Credentials?.Password ? { username: notifyServer?.Credentials?.Username, password: notifyServer?.Credentials?.Password } : undefined;
123
+ const image = metadata.attachments?.find(a => a.name === "Image: Graphic");
124
+
125
+
126
+ if (notifyServer?.MediaStorage?.EAS) {
127
+ if (metadata.eas) {
128
+ buttons.push({
129
+ "action": "view",
130
+ "label": "Listen",
131
+ "url": `${notifyServer?.MediaStorage?.EAS}/${metadata.name}_${metadata.status}_${metadata.tracking}.wav`,
132
+ })
133
+ }
134
+ }
135
+ if (metadata.json) {
136
+ buttons.push({
137
+ "action": "view",
138
+ "label": "View JSON",
139
+ "url": `${notifyServer?.MediaStorage?.JSON}/${metadata.name}_${metadata.tracking}.json`,
140
+ })
141
+ }
142
+ if (metadata.text) {
143
+ buttons.push({
144
+ "action": "view",
145
+ "label": "View Text",
146
+ "url": `${notifyServer?.MediaStorage?.TEXT}/${metadata.name}_${metadata.tracking}.txt`,
147
+ })
148
+ }
149
+ if (image) {
150
+ buttons.push({
151
+ "action": "view",
152
+ "label": "View Image",
153
+ "url": image.link,
154
+ })
155
+ }
156
+ await CreateHttp({
157
+ url: `${notifyServer?.Server?.replace(/\/$/, "")}/${notify.Topic}`,
158
+ timeout: 15_000,
159
+ method: "PUT",
160
+ ...(auth && { auth }),
161
+ headers: {
162
+ "Title": `${metadata.name} (${metadata.status})`,
163
+ "Tags": properties.parameters.tags?.join(",") ?? "N/A",
164
+ "Priority": notify?.Priority ?? "5",
165
+ ... (buttons.length > 0 && { "Actions": JSON.stringify(buttons) }),
166
+ },
167
+ body: stringText
168
+ })
169
+ SetDebug({
170
+ title: "Tasks/NTFY",
171
+ message: `${Math.round(performance.now() - t)}ms`
172
+ });
173
+ }
174
+
175
+ if (webhook?.Enabled && webhook?.Destination) {
176
+ const t = performance.now()
177
+ const isRatelimited = SetTimeoutAction({ identifier: webhook.Destination, interval: (webhook.Ratelimit ?? 2) * 2, max: (webhook.Ratelimit ?? 2), addTime: true })
178
+ const form = new FormData();
179
+ const embed = {
180
+ title: `${metadata.name} (${metadata.status})`,
181
+ description: embedText,
182
+ fields: [],
183
+ color: 16711680,
184
+ timestamp: new Date().toISOString(),
185
+ footer: { text: webhook.Title ?? `AtmosphericX` }
186
+ };
187
+
188
+ if (isRatelimited.limited) { return }
189
+
190
+
191
+ if (metadata.description && !metadata.expired) {
192
+ const description = metadata.description.length > 900
193
+ ? metadata.description.substring(0, 900) + "\n\n[Message truncated due to length]"
194
+ : metadata.description;
195
+ embed.fields.push({
196
+ name: "Description",
197
+ value: description ? '```' + '\n' + description.split('\n').map(l => l.trim()).filter(Boolean).join('\n') + '\n' + '```' : ""
198
+ });
199
+ }
200
+
201
+
202
+ if (metadata.attachments?.length > 0) {
203
+ const attachments = metadata.attachments.slice(0, 5);
204
+ embed.fields.push({
205
+ name: "Attachments",
206
+ value: attachments.map(attachment => `- [${attachment.name.length > 45 ? attachment.name.substring(0, 45) + '...' : attachment.name}](${attachment.link})`).join('\n')
207
+ });
208
+ }
209
+
210
+ if (uploads?.TEXT) {
211
+ form.append("fUpload", new Blob([Buffer.from(metadata.text)], {type: "application/text"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.txt`)
212
+ }
213
+
214
+ if (uploads?.JSON) {
215
+ form.append("fUpload2", new Blob([Buffer.from(metadata.json)], {type: "application/json"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.json`)
216
+ }
217
+
218
+ if (uploads?.EAS) {
219
+ if (metadata.eas) {
220
+ const file = await readFile(metadata.eas);
221
+ form.append("fEas", new Blob([Buffer.from(file)], { type: "audio/mpeg" }), `${properties.event}_${properties.status}_${properties.metadata.tracking}_eas.mp3`)
222
+ }
223
+ }
224
+
225
+ form.append("payload_json", JSON.stringify({
226
+ username: webhook.Title ?? "AtmosphericX",
227
+ content: webhook.Message ?? "",
228
+ embeds: [embed]
229
+ }));
230
+
231
+ await CreateHttp({
232
+ url: webhook.Destination,
233
+ timeout: 15e3,
234
+ method: `POST`,
235
+ body: form
236
+ })
237
+ SetDebug({
238
+ title: "Tasks/Webhook",
239
+ message: `${Math.round(performance.now() - t)}ms`
240
+ });
241
+ }
242
+ }
243
+ }
244
+ }
245
+ SetDebug({ title: `Tasks`, message: `${Math.round(performance.now() - tick)}ms` })
246
+ }
@@ -1,33 +1,35 @@
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 { rmEvent } from "./manager.rmEvent";
23
-
24
- export const updateEvents = async (selectedEvent?: TypeEvent): Promise<void> => {
25
- const events = bootstrap.cache.events.features;
26
- async function update(evt: TypeEvent) {
27
- if (new Date(evt.properties.expires) < new Date()) {
28
- await rmEvent(evt);
29
- }
30
- }
31
- if (!selectedEvent) { await Promise.all(events.map(async (evt) => { await update(evt) })) }
32
- if (selectedEvent) { await update(selectedEvent) }
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 { SetEventEmit } from "../@modules/@utilities/SetEventEmit";
23
+ import { RemoveEvent } from "./RemoveEvent";
24
+
25
+ export const UpdateEvents = async (selectedEvent?: TypeEvent): Promise<void> => {
26
+ const events = bootstrap.cache.events.features;
27
+ async function update(event: TypeEvent) {
28
+ if (new Date(event.properties.expires) < new Date()) {
29
+ SetEventEmit({ event: `onExpiredProduct`, metadata: event })
30
+ await RemoveEvent(event, true)
31
+ }
32
+ }
33
+ if (!selectedEvent) { await Promise.all(events.map(async (event) => { await update(event) })) }
34
+ if (selectedEvent) { await update(selectedEvent) }
33
35
  }
@@ -1,54 +1,62 @@
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 { getEventNodes } from "../@building/building.polygon";
23
- import { setEventEmit } from "../@modules/@utilities/utilities.setEventEmit";
24
-
25
- export const updateNode = async (selectedEvent?: TypeEvent): Promise<void> => {
26
- const events = bootstrap.cache.events.features;
27
- const ttl = bootstrap.settings.GlobalSettings.NodeTTL * 1e3;
28
- let total = 0;
29
-
30
- async function update(evt: TypeEvent) {
31
- const lastUpdate = evt?.properties?.metadata?.updated ?? null;
32
- if (lastUpdate != null && (Date.now() - lastUpdate) < ttl) {
33
- return evt;
34
- }
35
- const node = await getEventNodes(evt);
36
- if (node.nodes.length > 0) {
37
- total++
38
- }
39
- evt.properties.metadata.nodes = node.nodes
40
- evt.properties.metadata.filtered_proximity = node.filtered
41
- evt.properties.metadata.updated = node.updated
42
- }
43
- if (!selectedEvent) { await Promise.all(events.map(async (evt) => { await update(evt) })) }
44
- if (selectedEvent) { await update(selectedEvent) }
45
- if (total > 0) {
46
- setEventEmit({
47
- event: `onNodeUpdate`,
48
- metadata: {
49
- type: `global-update`,
50
- updated: total
51
- },
52
- })
53
- }
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 { GetEventNodes } from "../@building/GetEventNodes";
23
+ import { SetEventEmit } from "../@modules/@utilities/SetEventEmit";
24
+
25
+ export const UpdateNode = async (selectedEvent?: TypeEvent): Promise<void> => {
26
+ const events = bootstrap.cache.events.features;
27
+ const ttl = bootstrap.settings.GlobalSettings.NodeTTL * 1e3;
28
+ let total = 0;
29
+
30
+ const TTLEvents = selectedEvent ? [selectedEvent] : events.filter((evt) => {
31
+ const lastUpdate = evt?.properties?.metadata?.updated ?? null;
32
+ return lastUpdate == null || (Date.now() - lastUpdate) >= ttl;
33
+ });
34
+
35
+ if (TTLEvents.length === 0) return;
36
+
37
+ async function update(evt: TypeEvent) {
38
+ const node = await GetEventNodes(evt);
39
+ if (node.nodes.length > 0) {
40
+ total++;
41
+ }
42
+ evt.properties.metadata.nodes = node.nodes;
43
+ evt.properties.metadata.filtered_proximity = node.filtered;
44
+ evt.properties.metadata.updated = node.updated;
45
+ }
46
+
47
+ const concurrency = 4;
48
+ for (let index = 0; index < TTLEvents.length; index += concurrency) {
49
+ const batch = TTLEvents.slice(index, index + concurrency);
50
+ await Promise.all(batch.map((evt) => update(evt)));
51
+ }
52
+
53
+ if (total > 0) {
54
+ SetEventEmit({
55
+ event: `onNodeUpdate`,
56
+ metadata: {
57
+ type: `global-update`,
58
+ updated: total
59
+ },
60
+ })
61
+ }
54
62
  }