@atmosx/event-product-parser 3.0.51 → 3.0.53

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 (140) hide show
  1. package/{CODE_OF_CONDUCT.md → .github/CODE_OF_CONDUCT.md} +9 -9
  2. package/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +29 -29
  3. package/{LICENSE → .github/LICENSE} +17 -17
  4. package/{README.md → .github/README.md} +466 -444
  5. package/{SECURITY.md → .github/SECURITY.md} +20 -20
  6. package/{SUPPORTED_EVENTS.md → .github/SUPPORTED_EVENTS.md} +369 -368
  7. package/.vscode/settings.json +3 -3
  8. package/dist/cjs/index.cjs +243 -213
  9. package/dist/esm/index.mjs +242 -212
  10. package/package.json +52 -52
  11. package/src/@building/building.attachments.ts +82 -82
  12. package/src/@building/building.clean.ts +29 -29
  13. package/src/@building/building.create.ts +55 -55
  14. package/src/@building/building.enhance.ts +59 -59
  15. package/src/@building/building.geometry.ts +47 -47
  16. package/src/@building/building.headers.ts +36 -36
  17. package/src/@building/building.office.ts +42 -42
  18. package/src/@building/building.polygon.ts +69 -69
  19. package/src/@building/building.properties.ts +95 -95
  20. package/src/@building/building.signature.ts +60 -60
  21. package/src/@building/building.tags.ts +23 -23
  22. package/src/@building/building.tracking.ts +67 -67
  23. package/src/@building/building.validate.ts +152 -151
  24. package/src/@core/core.clearEvents.ts +30 -30
  25. package/src/@core/core.createListener.ts +23 -23
  26. package/src/@core/core.getEvents.ts +23 -23
  27. package/src/@core/core.getNodes.ts +23 -23
  28. package/src/@core/core.getRandomEvent.ts +23 -23
  29. package/src/@core/core.getVersion.ts +23 -23
  30. package/src/@core/core.manualEvent.ts +38 -0
  31. package/src/@core/core.query.ts +38 -38
  32. package/src/@core/core.setNode.ts +80 -80
  33. package/src/@core/core.start.ts +60 -60
  34. package/src/@core/core.stop.ts +31 -31
  35. package/src/@dictionaries/dictionaries.actions.ts +27 -27
  36. package/src/@dictionaries/dictionaries.awips.ts +363 -363
  37. package/src/@dictionaries/dictionaries.cancellation.ts +30 -30
  38. package/src/@dictionaries/dictionaries.causes.ts +35 -35
  39. package/src/@dictionaries/dictionaries.correlations.ts +42 -42
  40. package/src/@dictionaries/dictionaries.enhanced.ts +66 -109
  41. package/src/@dictionaries/dictionaries.events.ts +82 -82
  42. package/src/@dictionaries/dictionaries.expressions.ts +28 -28
  43. package/src/@dictionaries/dictionaries.global.ts +24 -0
  44. package/src/@dictionaries/dictionaries.hail.ts +35 -35
  45. package/src/@dictionaries/dictionaries.icao.ts +258 -258
  46. package/src/@dictionaries/dictionaries.matches.ts +54 -35
  47. package/src/@dictionaries/dictionaries.products.ts +24 -24
  48. package/src/@dictionaries/dictionaries.records.ts +25 -25
  49. package/src/@dictionaries/dictionaries.severity.ts +27 -27
  50. package/src/@dictionaries/dictionaries.shapefiles.ts +35 -35
  51. package/src/@dictionaries/dictionaries.states.ts +71 -71
  52. package/src/@dictionaries/dictionaries.status.ts +30 -30
  53. package/src/@dictionaries/dictionaries.tags.ts +92 -92
  54. package/src/@dictionaries/dictionaries.testing.ts +24 -24
  55. package/src/@events/events.api.ts +116 -116
  56. package/src/@events/events.text.ts +84 -80
  57. package/src/@events/events.ugc.ts +89 -85
  58. package/src/@events/events.vtec.ts +86 -86
  59. package/src/@manager/manager.mkEvent.ts +97 -93
  60. package/src/@manager/manager.rmEvent.ts +56 -51
  61. package/src/@manager/manager.setHash.ts +35 -35
  62. package/src/@manager/manager.updateEvents.ts +32 -32
  63. package/src/@manager/manager.updateListener.ts +179 -154
  64. package/src/@manager/manager.updateNodes.ts +53 -53
  65. package/src/@modules/@database/database.broadcastify.ts +66 -66
  66. package/src/@modules/@database/database.cache.ts +49 -49
  67. package/src/@modules/@database/database.init.ts +58 -58
  68. package/src/@modules/@database/database.shapefiles.ts +92 -92
  69. package/src/@modules/@database/database.stanza.ts +46 -46
  70. package/src/@modules/@eas/eas.getCleanDescription.ts +91 -91
  71. package/src/@modules/@eas/eas.getFloatPCM16.ts +29 -29
  72. package/src/@modules/@eas/eas.getMergedPCM16.ts +32 -32
  73. package/src/@modules/@eas/eas.getPCM16.ts +52 -52
  74. package/src/@modules/@eas/eas.getPCMToFloat.ts +26 -26
  75. package/src/@modules/@eas/eas.getSampledPCM16.ts +36 -36
  76. package/src/@modules/@eas/eas.getTTS.ts +54 -54
  77. package/src/@modules/@eas/eas.getWavPCM16.ts +52 -52
  78. package/src/@modules/@eas/eas.setAFSK.ts +51 -51
  79. package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -31
  80. package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
  81. package/src/@modules/@eas/eas.setEasTone.ts +151 -151
  82. package/src/@modules/@eas/eas.setNoise.ts +32 -32
  83. package/src/@modules/@eas/eas.setRadioEffect.ts +50 -50
  84. package/src/@modules/@eas/eas.setSameHeader.ts +44 -44
  85. package/src/@modules/@stanza/stanza.getAwipsType.ts +45 -45
  86. package/src/@modules/@stanza/stanza.validate.ts +49 -49
  87. package/src/@modules/@utilities/utilities.createHttp.ts +83 -70
  88. package/src/@modules/@utilities/utilities.getFormattedTime.ts +43 -43
  89. package/src/@modules/@utilities/utilities.getLatestIssuance.ts +32 -32
  90. package/src/@modules/@utilities/utilities.getMatched.ts +33 -33
  91. package/src/@modules/@utilities/utilities.getSettings.ts +25 -25
  92. package/src/@modules/@utilities/utilities.getShapeNearestPoint.ts +114 -114
  93. package/src/@modules/@utilities/utilities.setCronSchedule.ts +94 -94
  94. package/src/@modules/@utilities/utilities.setDebug.ts +38 -38
  95. package/src/@modules/@utilities/utilities.setEventEmit.ts +41 -41
  96. package/src/@modules/@utilities/utilities.setListener.ts +30 -30
  97. package/src/@modules/@utilities/utilities.setSettings.ts +42 -42
  98. package/src/@modules/@utilities/utilities.setSleep.ts +33 -33
  99. package/src/@modules/@utilities/utilities.setTimeoutAction.ts +62 -62
  100. package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
  101. package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -57
  102. package/src/@modules/@xmpp/xmpp.xError.ts +26 -26
  103. package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -36
  104. package/src/@modules/@xmpp/xmpp.xOnline.ts +45 -44
  105. package/src/@modules/@xmpp/xmpp.xReconnect.ts +64 -64
  106. package/src/@modules/@xmpp/xmpp.xStanza.ts +62 -62
  107. package/src/@parsers/@hvtec/hvtec.extract.ts +39 -39
  108. package/src/@parsers/@pvtec/pvtec.expires.ts +25 -25
  109. package/src/@parsers/@pvtec/pvtec.extract.ts +48 -48
  110. package/src/@parsers/@text/text.getDescriptionFromProduct.ts +52 -52
  111. package/src/@parsers/@text/text.getEmbed.ts +55 -55
  112. package/src/@parsers/@text/text.getPolygonFromProduct.ts +53 -32
  113. package/src/@parsers/@text/text.getRaw.ts +54 -0
  114. package/src/@parsers/@text/text.getTextFromProduct.ts +42 -42
  115. package/src/@parsers/@text/text.getXML.ts +60 -60
  116. package/src/@parsers/@ugc/ugc.coordinates.ts +110 -110
  117. package/src/@parsers/@ugc/ugc.expiry.ts +31 -31
  118. package/src/@parsers/@ugc/ugc.extract.ts +36 -36
  119. package/src/@parsers/@ugc/ugc.getCache.ts +23 -23
  120. package/src/@parsers/@ugc/ugc.header.ts +29 -29
  121. package/src/@parsers/@ugc/ugc.locations.ts +56 -56
  122. package/src/@parsers/@ugc/ugc.setCache.ts +27 -27
  123. package/src/@parsers/@ugc/ugc.zones.ts +51 -51
  124. package/src/@types/type.attributes.ts +28 -28
  125. package/src/@types/type.compiled.ts +34 -34
  126. package/src/@types/type.event.ts +69 -69
  127. package/src/@types/type.hash.ts +24 -24
  128. package/src/@types/type.hvtec.ts +25 -25
  129. package/src/@types/type.listener.ts +37 -32
  130. package/src/@types/type.properties.ts +77 -77
  131. package/src/@types/type.pvtec.ts +30 -30
  132. package/src/@types/type.settings.ts +93 -84
  133. package/src/@types/type.stanza.ts +37 -37
  134. package/src/@types/type.ugc.ts +24 -24
  135. package/src/bootstrap.ts +124 -115
  136. package/src/index.ts +74 -74
  137. package/{test.js → testing/init.js} +105 -92
  138. package/tsconfig.json +13 -13
  139. package/tsup.config.ts +15 -15
  140. package/src/@core/core.createEvent.ts +0 -82
@@ -1,155 +1,180 @@
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 { TypeListener } from "../@types/type.listener";
22
- import { bootstrap } from "../bootstrap"
23
- import { setEasTone } from "../@modules/@eas/eas.setEasTone"
24
- import { setTimeoutAction } from "../@modules/@utilities/utilities.setTimeoutAction";
25
- import { getEmebed } from "../@parsers/@text/text.getEmbed";
26
- import { getCleanedEvent } from "../@building/building.clean"
27
- import { createHttp } from "../@modules/@utilities/utilities.createHttp";
28
- import { setDebug } from "../@modules/@utilities/utilities.setDebug";
29
- import { getMatched } from "../@modules/@utilities/utilities.getMatched";
30
- import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from "fs";
31
-
32
- export const updateListener = async (event: TypeEvent): Promise<void> => {
33
- const tick = performance.now()
34
- const settings = bootstrap.settings;
35
- const listeners = settings.ListenerSettings as TypeListener[];
36
- const properties = event.properties;
37
- const metadata = {
38
- file: null,
39
- eas: null,
40
- json: null,
41
- name: properties.event,
42
- status: properties.status,
43
- description: properties.description,
44
- tracking: properties.metadata.tracking,
45
- header: properties.metadata.header,
46
- raw: properties.metadata.raw,
47
- expired: properties.status_metadata.is_expired,
48
- attachments: properties.metadata.attachments
49
- }
50
-
51
- for (const listener of listeners) {
52
- const events = listener?.events;
53
- const webhook = listener?.webhook;
54
- const uploads = listener?.uploads
55
- const isMatched = getMatched(events ?? [], metadata.name)
56
-
57
- if (events?.length == 0 || isMatched) {
58
- if (uploads?.eas) {
59
- metadata.eas = await setEasTone({
60
- title: `${metadata.name}_${metadata.status}_${metadata.tracking}`,
61
- message: metadata.description,
62
- header: metadata.header
63
- });
64
- }
65
-
66
- if (uploads?.file) {
67
- const fDestination = settings.GlobalSettings.ArchiveSettings.TextDirectory;
68
- if (fDestination) {
69
- const file = (`${fDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.txt`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
70
- if (!existsSync(fDestination)) { mkdirSync(fDestination, { recursive: true }); }
71
- if (existsSync(file)) {
72
- appendFileSync(file, metadata.raw);
73
- } else {
74
- writeFileSync(file, metadata.raw);
75
- }
76
- }
77
- metadata.file = metadata.raw;
78
- }
79
-
80
- if (uploads?.event) {
81
- const eDestination = settings.GlobalSettings.ArchiveSettings.EventDirectory;
82
- if (eDestination) {
83
- const file = (`${eDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.json`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
84
- if (!existsSync(eDestination)) { mkdirSync(eDestination, { recursive: true }); }
85
- writeFileSync(file, JSON.stringify(getCleanedEvent(event), null, 2));
86
- }
87
- metadata.json = JSON.stringify(getCleanedEvent(event), null, 2);
88
- }
89
-
90
- if (webhook?.enabled && webhook?.destination) {
91
- const isRatelimited = setTimeoutAction({ identifier: webhook.destination, interval: (webhook.ratelimit ?? 2) * 2, max: (webhook.ratelimit ?? 2), addTime: true })
92
- const form = new FormData();
93
- const embed = {
94
- title: `${metadata.name} (${metadata.status})`,
95
- description: getEmebed(event),
96
- fields: [],
97
- color: 16711680,
98
- timestamp: new Date().toISOString(),
99
- footer: { text: webhook.title ?? `AtmosphericX` }
100
- };
101
-
102
- if (isRatelimited.limited) { return }
103
-
104
-
105
- if (metadata.description && !metadata.expired) {
106
- if (metadata.description.length > 900) {
107
- metadata.description = metadata.description.substring(0, 900) + "\n\n[Message truncated due to length]";
108
- }
109
- embed.fields.push({
110
- name: "Description",
111
- value: metadata.description ? '```' + '\n' + metadata.description.split('\n').map(l => l.trim()).filter(Boolean).join('\n') + '\n' + '```' : ""
112
- });
113
- }
114
-
115
-
116
- if (metadata.attachments?.length > 0) {
117
- metadata.attachments = metadata.attachments.slice(0, 5);
118
- embed.fields.push({
119
- name: "Attachments",
120
- value: metadata.attachments.map(attachment => `- [${attachment.name.length > 45 ? attachment.name.substring(0, 45) + '...' : attachment.name}](${attachment.link})`).join('\n')
121
- });
122
- }
123
-
124
- if (uploads?.file) {
125
- form.append("fUpload", new Blob([Buffer.from(metadata.file)], {type: "application/text"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.txt`)
126
- }
127
-
128
- if (uploads?.event) {
129
- form.append("fUpload2", new Blob([Buffer.from(metadata.json)], {type: "application/json"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.json`)
130
- }
131
-
132
- if (uploads?.eas) {
133
- if (metadata.eas) {
134
- const file = readFileSync(metadata.eas)
135
- form.append("fEas", new Blob([Buffer.from(file)], { type: "audio/mpeg" }), `${properties.event}_${properties.status}_${properties.metadata.tracking}_eas.mp3`)
136
- }
137
- }
138
-
139
- form.append("payload_json", JSON.stringify({
140
- username: webhook.title ?? "AtmosphericX",
141
- content: webhook.message ?? "",
142
- embeds: [embed]
143
- }));
144
-
145
- await createHttp({
146
- url: webhook.destination,
147
- timeout: 15e3,
148
- method: `POST`,
149
- body: form
150
- })
151
- }
152
- }
153
- }
154
- setDebug({ title: `@manager.updateListener`, message: `Listener took ${performance.now() - tick} ms` })
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 { TypeListener } from "../@types/type.listener";
22
+ import { bootstrap } from "../bootstrap"
23
+ import { setEasTone } from "../@modules/@eas/eas.setEasTone"
24
+ import { setTimeoutAction } from "../@modules/@utilities/utilities.setTimeoutAction";
25
+ import { getEmebed } from "../@parsers/@text/text.getEmbed";
26
+ import { getRaw } from "../@parsers/@text/text.getRaw";
27
+ import { getCleanedEvent } from "../@building/building.clean"
28
+ import { createHttp } from "../@modules/@utilities/utilities.createHttp";
29
+ import { setDebug } from "../@modules/@utilities/utilities.setDebug";
30
+ import { getMatched } from "../@modules/@utilities/utilities.getMatched";
31
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from "fs";
32
+
33
+ export const updateListener = async (event: TypeEvent): Promise<void> => {
34
+ const tick = performance.now()
35
+ const settings = bootstrap.settings;
36
+ const listeners = settings.ListenerSettings as TypeListener[];
37
+ const properties = event.properties;
38
+ const metadata = {
39
+ file: null,
40
+ eas: null,
41
+ json: null,
42
+ name: properties.event,
43
+ status: properties.status,
44
+ description: properties.description,
45
+ tracking: properties.metadata.tracking,
46
+ header: properties.metadata.header,
47
+ raw: properties.metadata.raw,
48
+ expired: properties.status_metadata.is_expired,
49
+ attachments: properties.metadata.attachments
50
+ }
51
+
52
+ for (const listener of listeners) {
53
+ const events = listener?.events;
54
+ const webhook = listener?.webhook;
55
+ const uploads = listener?.uploads
56
+ const isMatched = getMatched(events ?? [], metadata.name)
57
+
58
+ if (events?.length == 0 || isMatched) {
59
+ if (uploads?.eas) {
60
+ metadata.eas = await setEasTone({
61
+ title: `${metadata.name}_${metadata.status}_${metadata.tracking}`,
62
+ message: metadata.description,
63
+ header: metadata.header
64
+ });
65
+ }
66
+
67
+ if (uploads?.file) {
68
+ const fDestination = settings.GlobalSettings.ArchiveSettings.TextDirectory;
69
+ if (fDestination) {
70
+ const file = (`${fDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.txt`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
71
+ if (!existsSync(fDestination)) { mkdirSync(fDestination, { recursive: true }); }
72
+ if (existsSync(file)) {
73
+ appendFileSync(file, metadata.raw);
74
+ } else {
75
+ writeFileSync(file, metadata.raw);
76
+ }
77
+ }
78
+ metadata.file = metadata.raw;
79
+ }
80
+
81
+ if (uploads?.event) {
82
+ const eDestination = settings.GlobalSettings.ArchiveSettings.EventDirectory;
83
+ if (eDestination) {
84
+ const file = (`${eDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.json`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
85
+ if (!existsSync(eDestination)) { mkdirSync(eDestination, { recursive: true }); }
86
+ writeFileSync(file, JSON.stringify(getCleanedEvent(event), null, 2));
87
+ }
88
+ metadata.json = JSON.stringify(getCleanedEvent(event), null, 2);
89
+ }
90
+
91
+ if (settings.NotifyServer.Enabled && listener?.notify?.enabled && listener?.notify?.topic) {
92
+ const auth = settings.NotifyServer.Credentials?.Username && settings.NotifyServer.Credentials?.Password
93
+ ? {
94
+ username: settings.NotifyServer.Credentials.Username,
95
+ password: settings.NotifyServer.Credentials.Password
96
+ }
97
+ : undefined;
98
+ const attachment = metadata.eas && settings.NotifyServer.Attachments ? `${settings.NotifyServer.Attachments}/${metadata.name}_${metadata.status}_${metadata.tracking}.wav` : null;
99
+ await createHttp({
100
+ url: `${settings.NotifyServer.Server.replace(/\/$/, "")}/${listener?.notify?.topic}`,
101
+ timeout: 15_000,
102
+ method: "POST",
103
+ ...(auth && { auth }),
104
+ headers: {
105
+ "Title": `${metadata.name} (${metadata.status})`,
106
+ "Tags": properties.parameters.tags?.join(",") ?? "N/A",
107
+ ... (attachment && { "Attach": attachment }),
108
+ "Priority": "max",
109
+ "Sound": "siren",
110
+ },
111
+ body: getRaw(event)
112
+ })
113
+ }
114
+
115
+ if (webhook?.enabled && webhook?.destination) {
116
+ const isRatelimited = setTimeoutAction({ identifier: webhook.destination, interval: (webhook.ratelimit ?? 2) * 2, max: (webhook.ratelimit ?? 2), addTime: true })
117
+ const form = new FormData();
118
+ const embed = {
119
+ title: `${metadata.name} (${metadata.status})`,
120
+ description: getEmebed(event),
121
+ fields: [],
122
+ color: 16711680,
123
+ timestamp: new Date().toISOString(),
124
+ footer: { text: webhook.title ?? `AtmosphericX` }
125
+ };
126
+
127
+ if (isRatelimited.limited) { return }
128
+
129
+
130
+ if (metadata.description && !metadata.expired) {
131
+ if (metadata.description.length > 900) {
132
+ metadata.description = metadata.description.substring(0, 900) + "\n\n[Message truncated due to length]";
133
+ }
134
+ embed.fields.push({
135
+ name: "Description",
136
+ value: metadata.description ? '```' + '\n' + metadata.description.split('\n').map(l => l.trim()).filter(Boolean).join('\n') + '\n' + '```' : ""
137
+ });
138
+ }
139
+
140
+
141
+ if (metadata.attachments?.length > 0) {
142
+ metadata.attachments = metadata.attachments.slice(0, 5);
143
+ embed.fields.push({
144
+ name: "Attachments",
145
+ value: metadata.attachments.map(attachment => `- [${attachment.name.length > 45 ? attachment.name.substring(0, 45) + '...' : attachment.name}](${attachment.link})`).join('\n')
146
+ });
147
+ }
148
+
149
+ if (uploads?.file) {
150
+ form.append("fUpload", new Blob([Buffer.from(metadata.file)], {type: "application/text"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.txt`)
151
+ }
152
+
153
+ if (uploads?.event) {
154
+ form.append("fUpload2", new Blob([Buffer.from(metadata.json)], {type: "application/json"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.json`)
155
+ }
156
+
157
+ if (uploads?.eas) {
158
+ if (metadata.eas) {
159
+ const file = readFileSync(metadata.eas)
160
+ form.append("fEas", new Blob([Buffer.from(file)], { type: "audio/mpeg" }), `${properties.event}_${properties.status}_${properties.metadata.tracking}_eas.mp3`)
161
+ }
162
+ }
163
+
164
+ form.append("payload_json", JSON.stringify({
165
+ username: webhook.title ?? "AtmosphericX",
166
+ content: webhook.message ?? "",
167
+ embeds: [embed]
168
+ }));
169
+
170
+ await createHttp({
171
+ url: webhook.destination,
172
+ timeout: 15e3,
173
+ method: `POST`,
174
+ body: form
175
+ })
176
+ }
177
+ }
178
+ }
179
+ setDebug({ title: `@manager.updateListener`, message: `Listener took ${performance.now() - tick} ms` })
155
180
  }
@@ -1,54 +1,54 @@
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/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
+ }
54
54
  }
@@ -1,67 +1,67 @@
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 { createHttp } from '../@utilities/utilities.createHttp'
22
- import { setWarning } from "../@utilities/utilities.setWarning";
23
-
24
- export const importBroadcastify = async (): Promise<void> => {
25
- const settings = bootstrap.settings;
26
-
27
- const isBroadcastifyImported = bootstrap.database
28
- .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='broadcastify';`)
29
- .get();
30
-
31
-
32
- if (!settings.BroadcastifySettings.BroadcastifyAttachments) { return }
33
- if (isBroadcastifyImported) { return }
34
-
35
- const broadcastify = await createHttp({
36
- url: settings.BroadcastifySettings.BroadcastifyDatabase,
37
- timeout: 5000,
38
- });
39
- if (!broadcastify.error) {
40
- bootstrap.database.prepare(`CREATE TABLE broadcastify ( state TEXT, county TEXT, feed TEXT, type TEXT, link TEXT);`)
41
- .run();
42
- const states = JSON.parse(broadcastify.message);
43
- const insert = bootstrap.database.prepare(`INSERT INTO broadcastify (state, county, feed, type, link) VALUES (?, ?, ?, ?, ?)`);
44
- const transaction = bootstrap.database.transaction((rows: any[]) => {
45
- for (const row of rows) {
46
- insert.run(row);
47
- }
48
- });
49
- const batch: any[] = [];
50
- for (const state of states) {
51
- setWarning({ message: `Importing ${state.counties.length} counties from ${state.state} for Broadcastify` });
52
- for (const county of state.counties) {
53
- const countyName = county.county;
54
- for (const feed of county.feeds) {
55
- batch.push([
56
- state.state,
57
- countyName,
58
- feed.name,
59
- feed.type,
60
- feed.link
61
- ]);
62
- }
63
- }
64
- }
65
- transaction(batch);
66
- }
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 { createHttp } from '../@utilities/utilities.createHttp'
22
+ import { setWarning } from "../@utilities/utilities.setWarning";
23
+
24
+ export const importBroadcastify = async (): Promise<void> => {
25
+ const settings = bootstrap.settings;
26
+
27
+ const isBroadcastifyImported = bootstrap.database
28
+ .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='broadcastify';`)
29
+ .get();
30
+
31
+
32
+ if (!settings.BroadcastifySettings.BroadcastifyAttachments) { return }
33
+ if (isBroadcastifyImported) { return }
34
+
35
+ const broadcastify = await createHttp({
36
+ url: settings.BroadcastifySettings.BroadcastifyDatabase,
37
+ timeout: 5000,
38
+ });
39
+ if (!broadcastify.error) {
40
+ bootstrap.database.prepare(`CREATE TABLE broadcastify ( state TEXT, county TEXT, feed TEXT, type TEXT, link TEXT);`)
41
+ .run();
42
+ const states = JSON.parse(broadcastify.message);
43
+ const insert = bootstrap.database.prepare(`INSERT INTO broadcastify (state, county, feed, type, link) VALUES (?, ?, ?, ?, ?)`);
44
+ const transaction = bootstrap.database.transaction((rows: any[]) => {
45
+ for (const row of rows) {
46
+ insert.run(row);
47
+ }
48
+ });
49
+ const batch: any[] = [];
50
+ for (const state of states) {
51
+ setWarning({ message: `Importing ${state.counties.length} counties from ${state.state} for Broadcastify` });
52
+ for (const county of state.counties) {
53
+ const countyName = county.county;
54
+ for (const feed of county.feeds) {
55
+ batch.push([
56
+ state.state,
57
+ countyName,
58
+ feed.name,
59
+ feed.type,
60
+ feed.link
61
+ ]);
62
+ }
63
+ }
64
+ }
65
+ transaction(batch);
66
+ }
67
67
  };