@atmosx/event-product-parser 3.0.48 → 3.0.52

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 (141) hide show
  1. package/.vscode/settings.json +3 -3
  2. package/CODE_OF_CONDUCT.md +9 -9
  3. package/CONTRIBUTING.md +29 -29
  4. package/LICENSE +17 -17
  5. package/README.md +443 -417
  6. package/SECURITY.md +20 -20
  7. package/SUPPORTED_EVENTS.md +369 -368
  8. package/dist/cjs/index.cjs +1925 -1885
  9. package/dist/esm/index.mjs +1927 -1887
  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 -41
  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 -70
  19. package/src/@building/building.properties.ts +95 -95
  20. package/src/@building/building.signature.ts +60 -61
  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 -146
  24. package/src/@core/core.clearEvents.ts +30 -31
  25. package/src/@core/core.createListener.ts +23 -23
  26. package/src/@core/core.getEvents.ts +23 -24
  27. package/src/@core/core.getNodes.ts +23 -24
  28. package/src/@core/core.getRandomEvent.ts +23 -24
  29. package/src/@core/core.getVersion.ts +23 -24
  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 -118
  56. package/src/@events/events.text.ts +84 -81
  57. package/src/@events/events.ugc.ts +89 -85
  58. package/src/@events/events.vtec.ts +86 -87
  59. package/src/@manager/manager.mkEvent.ts +97 -88
  60. package/src/@manager/manager.rmEvent.ts +56 -49
  61. package/src/@manager/manager.setHash.ts +35 -36
  62. package/src/@manager/manager.updateEvents.ts +32 -34
  63. package/src/@manager/manager.updateListener.ts +154 -159
  64. package/src/@manager/manager.updateNodes.ts +53 -54
  65. package/src/@modules/@database/database.broadcastify.ts +66 -66
  66. package/src/@modules/@database/database.cache.ts +49 -47
  67. package/src/@modules/@database/database.init.ts +58 -57
  68. package/src/@modules/@database/database.shapefiles.ts +92 -92
  69. package/src/@modules/@database/database.stanza.ts +46 -47
  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 -52
  79. package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -32
  80. package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
  81. package/src/@modules/@eas/eas.setEasTone.ts +151 -147
  82. package/src/@modules/@eas/eas.setNoise.ts +32 -31
  83. package/src/@modules/@eas/eas.setRadioEffect.ts +50 -49
  84. package/src/@modules/@eas/eas.setSameHeader.ts +44 -45
  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 +70 -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 -0
  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 -0
  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 -58
  100. package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
  101. package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -58
  102. package/src/@modules/@xmpp/xmpp.xError.ts +26 -28
  103. package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -37
  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 -57
  112. package/src/@parsers/@text/text.getPolygonFromProduct.ts +53 -32
  113. package/src/@parsers/@text/text.getTextFromProduct.ts +42 -42
  114. package/src/@parsers/@text/text.getXML.ts +60 -60
  115. package/src/@parsers/@ugc/ugc.coordinates.ts +110 -109
  116. package/src/@parsers/@ugc/ugc.expiry.ts +31 -31
  117. package/src/@parsers/@ugc/ugc.extract.ts +36 -36
  118. package/src/@parsers/@ugc/ugc.getCache.ts +24 -0
  119. package/src/@parsers/@ugc/ugc.header.ts +29 -29
  120. package/src/@parsers/@ugc/ugc.locations.ts +57 -29
  121. package/src/@parsers/@ugc/ugc.setCache.ts +28 -0
  122. package/src/@parsers/@ugc/ugc.zones.ts +51 -51
  123. package/src/@types/type.attributes.ts +28 -28
  124. package/src/@types/type.compiled.ts +34 -34
  125. package/src/@types/type.event.ts +69 -69
  126. package/src/@types/type.hash.ts +24 -24
  127. package/src/@types/type.hvtec.ts +25 -25
  128. package/src/@types/type.listener.ts +32 -32
  129. package/src/@types/type.properties.ts +77 -77
  130. package/src/@types/type.pvtec.ts +30 -30
  131. package/src/@types/type.settings.ts +84 -83
  132. package/src/@types/type.stanza.ts +37 -37
  133. package/src/@types/type.ugc.ts +24 -24
  134. package/src/bootstrap.ts +115 -112
  135. package/src/index.ts +74 -74
  136. package/test.js +92 -98
  137. package/tsconfig.json +13 -13
  138. package/tsup.config.ts +15 -15
  139. package/dist/index.d.mts +0 -299
  140. package/dist/index.d.ts +0 -299
  141. package/src/@core/core.createEvent.ts +0 -83
@@ -1,160 +1,155 @@
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
-
21
- import { TypeEvent } from "../@types/type.event";
22
- import { TypeListener } from "../@types/type.listener";
23
- import { bootstrap } from "../bootstrap"
24
- import { setEasTone } from "../@modules/@eas/eas.setEasTone"
25
- import { setTimeoutAction } from "../@modules/@utilities/utilities.setTimeoutAction";
26
- import { getEmebed } from "../@parsers/@text/text.getEmbed";
27
- import { getCleanedEvent } from "../@building/building.clean"
28
- import { createHttp } from "../@modules/@utilities/utilities.createHttp";
29
- import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from "fs";
30
- import { setWarning } from "../@modules/@utilities/utilities.setWarning";
31
-
32
-
33
-
34
-
35
- export const updateListener = async (event: TypeEvent): Promise<void> => {
36
- const settings = bootstrap.settings;
37
- const listeners = settings.ListenerSettings as TypeListener[];
38
- const properties = event.properties;
39
- const metadata = {
40
- file: null,
41
- eas: 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 = events.some(pattern => {
57
- if (!pattern) return false;
58
- if (pattern === "*" || pattern === metadata.name) return true;
59
- if (pattern.includes("*")) {
60
- const regex = "^" +
61
- pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*") + "$";
62
- return new RegExp(regex).test(metadata.name);
63
- }
64
- return false;
65
- });
66
-
67
- if (events?.length == 0 || isMatched) {
68
- if (uploads?.eas) {
69
- metadata.eas = await setEasTone({
70
- title: `${metadata.name}_${metadata.status}_${metadata.tracking}`,
71
- message: metadata.description,
72
- header: metadata.header
73
- });
74
- }
75
-
76
- if (uploads?.file) {
77
- const fDestination = settings.GlobalSettings.ArchiveSettings.TextDirectory;
78
- if (fDestination) {
79
- if (!existsSync(fDestination)) { mkdirSync(fDestination, { recursive: true }); }
80
- if (existsSync(`${fDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.txt`)) {
81
- appendFileSync(`${fDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.txt`, metadata.raw);
82
- } else {
83
- writeFileSync(`${fDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.txt`, metadata.raw);
84
- }
85
- }
86
- metadata.file = metadata.raw;
87
- }
88
-
89
- if (uploads?.event) {
90
- const eDestination = settings.GlobalSettings.ArchiveSettings.EventDirectory;
91
- if (eDestination) {
92
- if (!existsSync(eDestination)) { mkdirSync(eDestination, { recursive: true }); }
93
- writeFileSync(`${eDestination}/${metadata.name}_${metadata.status}_${metadata.tracking}.json`, JSON.stringify(getCleanedEvent(event), null, 2));
94
- }
95
- }
96
-
97
- if (webhook.enabled && webhook.destination) {
98
- const ratelimit = setTimeoutAction({ identifier: webhook.destination, interval: webhook.ratelimit * 2, max: webhook.ratelimit, addTime: true })
99
- const form = new FormData();
100
- const embed = {
101
- title: `${metadata.name} (${metadata.status})`,
102
- description: getEmebed(event),
103
- fields: [],
104
- color: 16711680,
105
- timestamp: new Date().toISOString(),
106
- footer: { text: webhook.title ?? `AtmosphericX` }
107
- };
108
-
109
- if (ratelimit.limited) { return }
110
-
111
-
112
- if (metadata.description && !metadata.expired) {
113
- if (metadata.description.length > 900) {
114
- metadata.description = metadata.description.substring(0, 900) + "\n\n[Message truncated due to length]";
115
- }
116
- embed.fields.push({
117
- name: "Description",
118
- value: metadata.description ? '```' + '\n' + metadata.description.split('\n').map(l => l.trim()).filter(Boolean).join('\n') + '\n' + '```' : ""
119
- });
120
- }
121
-
122
-
123
- if (metadata.attachments?.length > 0) {
124
- metadata.attachments = metadata.attachments.slice(0, 5);
125
- embed.fields.push({
126
- name: "Attachments",
127
- value: metadata.attachments.map(attachment => `- [${attachment.name.length > 45 ? attachment.name.substring(0, 45) + '...' : attachment.name}](${attachment.link})`).join('\n')
128
- });
129
- }
130
-
131
- if (uploads?.file) {
132
- form.append("fUpload", new Blob([Buffer.from(metadata.file)], {type: "application/text"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.txt`)
133
- }
134
-
135
- if (uploads?.eas) {
136
- if (metadata.eas) {
137
- const file = readFileSync(metadata.eas)
138
- form.append("fEas", new Blob([Buffer.from(file)], { type: "audio/mpeg" }), `${properties.event}_${properties.status}_${properties.metadata.tracking}_eas.mp3`)
139
- }
140
- }
141
-
142
- form.append("payload_json", JSON.stringify({
143
- username: webhook.title ?? "AtmosphericX",
144
- content: webhook.message ?? "",
145
- embeds: [embed]
146
- }));
147
-
148
- const a = await createHttp({
149
- url: webhook.destination,
150
- timeout: 5000,
151
- method: `POST`,
152
- body: form
153
- })
154
- if (a.error) {
155
- setWarning({ message: `Failed to send webhook: ${a.error.message}` })
156
- }
157
- }
158
- }
159
- }
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` })
160
155
  }
@@ -1,55 +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 { getEventNodes } from "../@building/building.polygon";
21
- import { setEventEmit } from "../@modules/@utilities/utilities.setEventEmit";
22
- import { TypeEvent } from "../@types/type.event";
23
- import { bootstrap } from "../bootstrap"
24
-
25
-
26
- export const updateNode = async (selectedEvent?: TypeEvent): Promise<void> => {
27
- const events = bootstrap.cache.events.features;
28
- const ttl = bootstrap.settings.GlobalSettings.NodeTTL * 1e3;
29
- let total = 0;
30
-
31
- async function update(evt: TypeEvent) {
32
- const lastUpdate = evt?.properties?.metadata?.updated ?? null;
33
- if (lastUpdate != null && (Date.now() - lastUpdate) < ttl) {
34
- return evt;
35
- }
36
- const node = await getEventNodes(evt);
37
- if (node.nodes.length > 0) {
38
- total++
39
- }
40
- evt.properties.metadata.nodes = node.nodes
41
- evt.properties.metadata.filtered_proximity = node.filtered
42
- evt.properties.metadata.updated = node.updated
43
- }
44
- if (!selectedEvent) { await Promise.all(events.map(async (evt) => { await update(evt) })) }
45
- if (selectedEvent) { await update(selectedEvent) }
46
- if (total > 0) {
47
- setEventEmit({
48
- event: `onNodeUpdate`,
49
- metadata: {
50
- type: `global-update`,
51
- updated: total
52
- },
53
- })
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
+ }
55
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
  };