@atmosx/event-product-parser 3.0.55 → 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 +1439 -1277
  19. package/dist/esm/index.mjs +1420 -1258
  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 -69
  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/{manager.rmEvent.ts → RemoveEvent.ts} +69 -71
  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 -34
  74. package/src/@manager/{manager.updateNodes.ts → UpdateNode.ts} +61 -53
  75. package/src/{@building/building.validate.ts → @manager/ValidateEvents.ts} +141 -154
  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 -63
  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.strings.ts +0 -22
  153. package/src/@dictionaries/dictionaries.tags.ts +0 -93
  154. package/src/@manager/manager.mkEvent.ts +0 -98
  155. package/src/@manager/manager.updateListener.ts +0 -180
  156. package/testing/init.js +0 -91
@@ -1,151 +1,144 @@
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/type.settings";
21
- import { bootstrap } from "../../bootstrap";
22
- import { setWarning } from "../@utilities/utilities.setWarning";
23
- import { getWavPCM16 } from "./eas.getWavPCM16";
24
- import { getSampledPCM16 } from "./eas.getSampledPCM16";
25
- import { setRadioEffect } from "./eas.setRadioEffect";
26
- import { setSameHeader } from "./eas.setSameHeader";
27
- import { setAttentionTone } from "./eas.setAttentionTone";
28
- import { getMergedPCM16 } from "./eas.getMergedPCM16";
29
- import { setNoise } from "./eas.setNoise";
30
- import { getPCM16 } from "./eas.getPCM16";
31
- import { getTTS } from "./eas.getTTS";
32
- import { getCleanDescription } from "./eas.getCleanDescription";
33
- import { setDebug } from "../@utilities/utilities.setDebug";
34
- import { join } from 'path'
35
- import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs'
36
- import { execSync } from 'child_process'
37
- import { platform } from 'os'
38
-
39
-
40
- interface GenerateEASOptions {
41
- message: string
42
- header: string
43
- title: string
44
- }
45
-
46
- export const setEasTone = async (options: GenerateEASOptions): Promise<string> => {
47
- const tick = performance.now()
48
- const settings = bootstrap.settings as TypeSettings;
49
- const directory = settings.GlobalSettings.ArchiveSettings.EasDirectory;
50
- const prefix = settings.GlobalSettings.ArchiveSettings.EasToneout;
51
- let message = options.message;
52
- let header = options.header;
53
- let title = (options.title ?? `${Math.random().toString(36).substring(2, 15)}-${header.replace(/[^a-zA-Z0-9]/g, '')}`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
54
- if (!message || !header) {
55
- setWarning({
56
- title: `EAS`,
57
- message: `Message and header are required to generate an EAS tone.`
58
- })
59
- return null;
60
- }
61
- let buffTTS: Buffer;
62
- let buffRadio: any;
63
- let buffFull: any[] = [];
64
-
65
- if (!existsSync(directory)) {
66
- mkdirSync(directory, { recursive: true });
67
- }
68
- if (!existsSync(join(directory, `/tts`))) {
69
- mkdirSync(join(directory, `/tts`), { recursive: true });
70
- }
71
- if (!existsSync(join(directory, `/encoded`))) {
72
- mkdirSync(join(directory, `/encoded`), { recursive: true });
73
- }
74
-
75
- const tmpTTS = join(directory, `/tts/${title}.wav`)
76
- const outTTS = join(directory, `/encoded/${title}.wav`)
77
- const vPlatform = platform();
78
-
79
- if (vPlatform === 'darwin') {
80
- setWarning({
81
- title: `EAS`,
82
- message: `EAS tone generation is not supported on macOS.`
83
- });
84
- return null
85
- }
86
-
87
-
88
- await new Promise<void>((resolve, reject) => {
89
- const tMsg = getCleanDescription(message)
90
- getTTS(tMsg, tmpTTS).then(() => {
91
- resolve();
92
- });
93
- });
94
- if (!existsSync(tmpTTS)) {
95
- return null;
96
- }
97
- buffTTS = readFileSync(tmpTTS);
98
- const vWav = getWavPCM16(buffTTS);
99
- const vSamples = getSampledPCM16(vWav.samples, vWav.sampleRate, 8000)
100
- const vRadio = setRadioEffect(vSamples, 8000)
101
-
102
- if (existsSync(prefix)) {
103
- let tBuffer = readFileSync(prefix);
104
- let tWav = getWavPCM16(tBuffer);
105
-
106
- if (tWav == null) {
107
- try {
108
- const converted = join(directory, `/tts/${title}.converted.wav`)
109
- execSync(`ffmpeg -y -i "${prefix}" -ar 8000 -ac 1 -sample_fmt s16 "${converted}"`, { stdio: 'ignore' })
110
- if (existsSync(converted)) {
111
- tBuffer = readFileSync(converted)
112
- tWav = getWavPCM16(tBuffer)
113
- try { unlinkSync(converted) } catch {}
114
- }
115
- } catch (e) {}
116
- }
117
-
118
- if (tWav == null) {
119
- setWarning({ title: `EAS`, message: `Intro tone isn't a valid .WAV file or isn't in PCM 16-bit format. Converted attempt failed; please convert it then try again.` })
120
- return null;
121
- }
122
-
123
- const tSamples = (tWav.sampleRate != 8000 ? getSampledPCM16(tWav.samples, tWav.sampleRate, 8000) : tWav.samples)
124
- buffRadio = setRadioEffect(tSamples, 8000)
125
- }
126
-
127
- buffFull = buffRadio != null ? [buffRadio, new Int16Array(Math.floor(0.5 * 8000))] : [];
128
- buffFull.push(
129
- setSameHeader(header, 3, 8000, {
130
- preMarkSec: 1.1,
131
- gapSec: 0.5,
132
- }),
133
- new Int16Array(Math.floor(0.5 * 8000)),
134
- setAttentionTone(8, 8000),
135
- new Int16Array(Math.floor(0.5 * 8000)),
136
- vRadio
137
- )
138
- for (let i = 0; i < 3; i++) {
139
- buffFull.push(setSameHeader(header, 1, 8000, { preMarkSec: 0.5, gapSec: 0.1 }))
140
- buffFull.push(new Int16Array(Math.floor(0.5 * 8000)));
141
- }
142
- const aSamples = getMergedPCM16(buffFull);
143
- const aFinal = setNoise(aSamples, 0.002);
144
- const aBuffer = getPCM16(Array.from(aFinal).map(v => ({ value: v })), 8000);
145
- writeFileSync(outTTS, aBuffer)
146
- try{ unlinkSync(tmpTTS) } catch {}
147
- setDebug({ title: `@eas.setEasTone`, message: `EAS tone generation took ${performance.now() - tick} ms` })
148
- return outTTS;
149
- }
150
-
151
-
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 { bootstrap } from "../../bootstrap";
22
+ import { SetWarning } from "../@utilities/SetWarning";
23
+ import { GetWavPCM16 } from "./GetWavPCM16";
24
+ import { GetSampledPCM16 } from "./GetSampledPCM16";
25
+ import { SetRadioEffect } from "./SetRadioEffect";
26
+ import { SetSameHeader } from "./SetSameHeader";
27
+ import { SetAttentionTone } from "./SetAttentionTone";
28
+ import { GetMergedPCM16 } from "./GetMergedPCM16";
29
+ import { SetNoise } from "./SetNoise";
30
+ import { GetPCM16 } from "./GetPCM16";
31
+ import { GetTTS } from "./GetTTS";
32
+ import { GetCleanDescription } from "./GetCleanDescription";
33
+ import { SetDebug } from "../@utilities/SetDebug";
34
+ import { join } from 'path'
35
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs'
36
+ import { execSync } from 'child_process'
37
+ import { platform } from 'os'
38
+
39
+
40
+ interface GenerateEASMessageOptions {
41
+ message: string
42
+ header: string
43
+ title: string
44
+ }
45
+
46
+ export const GenerateEASMessage = async (options: GenerateEASMessageOptions): Promise<string> => {
47
+ const tick = performance.now()
48
+ const settings = bootstrap.settings as TypeSettings;
49
+ const directory = settings.GlobalSettings.ArchiveSettings.EasDirectory;
50
+ const prefix = settings.GlobalSettings.ArchiveSettings.EasToneout;
51
+ let message = options.message;
52
+ let header = options.header;
53
+ let title = (options.title ?? `${Math.random().toString(36).substring(2, 15)}-${header.replace(/[^a-zA-Z0-9]/g, '')}`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
54
+ if (!message || !header) {
55
+ SetWarning({
56
+ title: `EAS`,
57
+ message: `Message and header are required to generate an EAS tone.`
58
+ })
59
+ return null;
60
+ }
61
+ let buffTTS: Buffer;
62
+ let buffRadio: any;
63
+ let buffFull: any[] = [];
64
+
65
+ if (!existsSync(directory)) {
66
+ mkdirSync(directory, { recursive: true });
67
+ }
68
+ const tmpTTS = join(directory, `/${title}-tts.wav`)
69
+ const outTTS = join(directory, `/${title}.wav`)
70
+ const vPlatform = platform();
71
+
72
+ if (vPlatform === 'darwin') {
73
+ SetWarning({
74
+ title: `EAS`,
75
+ message: `EAS tone generation is not supported on macOS.`
76
+ });
77
+ return null
78
+ }
79
+
80
+
81
+ await new Promise<void>((resolve, reject) => {
82
+ const tMsg = GetCleanDescription(message)
83
+ GetTTS(tMsg, tmpTTS).then(() => {
84
+ resolve();
85
+ });
86
+ });
87
+ if (!existsSync(tmpTTS)) {
88
+ return null;
89
+ }
90
+ buffTTS = readFileSync(tmpTTS);
91
+ const vWav = GetWavPCM16(buffTTS);
92
+ const vSamples = GetSampledPCM16(vWav.samples, vWav.sampleRate, 8000)
93
+ const vRadio = SetRadioEffect(vSamples, 8000)
94
+
95
+ if (existsSync(prefix)) {
96
+ let tBuffer = readFileSync(prefix);
97
+ let tWav = GetWavPCM16(tBuffer);
98
+
99
+ if (tWav == null) {
100
+ try {
101
+ const converted = join(directory, `/${title}-tts-fixed.wav`)
102
+ execSync(`ffmpeg -y -i "${prefix}" -ar 8000 -ac 1 -sample_fmt s16 "${converted}"`, { stdio: 'ignore' })
103
+ if (existsSync(converted)) {
104
+ tBuffer = readFileSync(converted)
105
+ tWav = GetWavPCM16(tBuffer)
106
+ try { unlinkSync(converted) } catch {}
107
+ }
108
+ } catch (e) {}
109
+ }
110
+
111
+ if (tWav == null) {
112
+ SetWarning({ title: `EAS`, message: `Intro tone isn't a valid .WAV file or isn't in PCM 16-bit format. Converted attempt failed; please convert it then try again.` })
113
+ return null;
114
+ }
115
+
116
+ const tSamples = (tWav.sampleRate != 8000 ? GetSampledPCM16(tWav.samples, tWav.sampleRate, 8000) : tWav.samples)
117
+ buffRadio = SetRadioEffect(tSamples, 8000)
118
+ }
119
+
120
+ buffFull = buffRadio != null ? [buffRadio, new Int16Array(Math.floor(0.5 * 8000))] : [];
121
+ buffFull.push(
122
+ SetSameHeader(header, 3, 8000, {
123
+ preMarkSec: 1.1,
124
+ gapSec: 0.5,
125
+ }),
126
+ new Int16Array(Math.floor(0.5 * 8000)),
127
+ SetAttentionTone(8, 8000),
128
+ new Int16Array(Math.floor(0.5 * 8000)),
129
+ vRadio
130
+ )
131
+ for (let i = 0; i < 3; i++) {
132
+ buffFull.push(SetSameHeader(header, 1, 8000, { preMarkSec: 0.5, gapSec: 0.1 }))
133
+ buffFull.push(new Int16Array(Math.floor(0.5 * 8000)));
134
+ }
135
+ const aSamples = GetMergedPCM16(buffFull);
136
+ const aFinal = SetNoise(aSamples, 0.002);
137
+ const aBuffer = GetPCM16(Array.from(aFinal).map(v => ({ value: v })), 8000);
138
+ writeFileSync(outTTS, aBuffer)
139
+ try{ unlinkSync(tmpTTS) } catch {}
140
+ SetDebug({ title: `GenerateEASMessage`, message: `${Math.round(performance.now() - tick)}ms` })
141
+ return outTTS;
142
+ }
143
+
144
+
@@ -1,91 +1,91 @@
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
- export const getCleanDescription = (message: string): string => {
22
- const patches: { regex: RegExp, replacement: string }[] = [
23
- { regex: /\.{3,}/g, replacement: ". " },
24
- { regex: /\bUTC\b/g, replacement: 'Coordinated Universal Time' },
25
- { regex: /\bGMT\b/g, replacement: 'Greenwich Mean Time' },
26
- { regex: /\bEST\b(?!\w)/g, replacement: 'Eastern Standard Time' },
27
- { regex: /\bEDT\b(?!\w)/g, replacement: 'Eastern Daylight Time' },
28
- { regex: /\bCST\b(?!\w)/g, replacement: 'Central Standard Time' },
29
- { regex: /\bCDT\b(?!\w)/g, replacement: 'Central Daylight Time' },
30
- { regex: /\bMST\b(?!\w)/g, replacement: 'Mountain Standard Time' },
31
- { regex: /\bMDT\b(?!\w)/g, replacement: 'Mountain Daylight Time' },
32
- { regex: /\bPST\b(?!\w)/g, replacement: 'Pacific Standard Time' },
33
- { regex: /\bPDT\b(?!\w)/g, replacement: 'Pacific Daylight Time' },
34
- { regex: /\bAKST\b(?!\w)/g, replacement: 'Alaska Standard Time' },
35
- { regex: /\bAKDT\b(?!\w)/g, replacement: 'Alaska Daylight Time' },
36
- { regex: /\bHST\b(?!\w)/g, replacement: 'Hawaii Standard Time' },
37
- { regex: /\bHDT\b(?!\w)/g, replacement: 'Hawaii Daylight Time' },
38
- { regex: /\bmph\b(?!\w)/g, replacement: 'miles per hour' },
39
- { regex: /\bkm\/h\b(?!\w)/g, replacement: 'kilometers per hour' },
40
- { regex: /\bkmh\b(?!\w)/g, replacement: 'kilometers per hour' },
41
- { regex: /\bkt\b(?!\w)/g, replacement: 'knots' },
42
- { regex: /\bNE\b(?!\w)/g, replacement: 'northeast' },
43
- { regex: /\bNW\b(?!\w)/g, replacement: 'northwest' },
44
- { regex: /\bSE\b(?!\w)/g, replacement: 'southeast' },
45
- { regex: /\bSW\b(?!\w)/g, replacement: 'southwest' },
46
- { regex: /\bNM\b(?!\w)/g, replacement: 'nautical miles' },
47
- { regex: /\bdeg\b(?!\w)/g, replacement: 'degrees' },
48
- { regex: /\btstm\b(?!\w)/g, replacement: 'thunderstorm' },
49
- { regex: /\bmm\b(?!\w)/g, replacement: 'millimeters' },
50
- { regex: /\bcm\b(?!\w)/g, replacement: 'centimeters' },
51
- { regex: /\bin.\b(?!\w)/g, replacement: 'inches' },
52
- { regex: /\bft\b(?!\w)/g, replacement: 'feet' },
53
- { regex: /\bmi\b(?!\w)/g, replacement: 'miles' },
54
- { regex: /\bhr\b(?!\w)/g, replacement: 'hour' },
55
- { regex: /\bhourly\b(?!\w)/g, replacement: 'per hour' },
56
- { regex: /\bkg\b(?!\w)/g, replacement: 'kilograms' },
57
- { regex: /\bg\/kg\b(?!\w)/g, replacement: 'grams per kilogram' },
58
- { regex: /\bmb\b(?!\w)/g, replacement: 'millibars' },
59
- { regex: /\bhPa\b(?!\w)/g, replacement: 'hectopascals' },
60
- { regex: /\bPa\b(?!\w)/g, replacement: 'pascals' },
61
- { regex: /\bKPa\b(?!\w)/g, replacement: 'kilopascals' },
62
- { regex: /\bC\/hr\b(?!\w)/g, replacement: 'degrees Celsius per hour' },
63
- { regex: /\bF\/hr\b(?!\w)/g, replacement: 'degrees Fahrenheit per hour' },
64
- { regex: /\bC\/min\b(?!\w)/g, replacement: 'degrees Celsius per minute' },
65
- { regex: /\bF\/min\b(?!\w)/g, replacement: 'degrees Fahrenheit per minute' },
66
- { regex: /\bC\b(?!\w)/g, replacement: 'degrees Celsius' },
67
- { regex: /\bF\b(?!\w)/g, replacement: 'degrees Fahrenheit' },
68
- ]
69
- const hours: Record<number, string> = {
70
- 0: "twelve", 1: "one", 2: "two", 3: "three", 4: "four",
71
- 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine",
72
- 10: "ten", 11: "eleven", 12: "twelve",
73
- };
74
- const minWord = (m: number) => m === 0 ? "o'clock" : m < 10 ? `oh ${m}` : `${m}`;
75
- const fmt = (h: number, m: number, ap: string) => `${hours[h % 12]} ${minWord(m)} ${ap}`;
76
- for (const {regex, replacement} of patches) {
77
- message = message.replace(regex, replacement)
78
- }
79
- return message
80
- .replace(/'/g, "''")
81
- .replace(/\b(\d{1,2}):(\d{2})\s*(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
82
- .replace(/\b(\d{1,2})\s+(\d{2})\s+(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
83
- .replace(/\b(\d{2})(\d{2})\s+(AM|PM)\b/gi, (_, hh, mm, ap) => fmt(+hh, +mm, ap.toUpperCase()))
84
- .replace(/\b(\d{1,2})\s+(AM|PM)\b/gi, (_, h, ap) => fmt(+h, 0, ap.toUpperCase()))
85
- .replace(/\*+/g, " ")
86
- .replace(/-/g, " ")
87
- .replace(/\n/g, " ")
88
- .trim();
89
- }
90
-
91
-
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
+ export const GetCleanDescription = (message: string): string => {
22
+ const patches: { regex: RegExp, replacement: string }[] = [
23
+ { regex: /\.{3,}/g, replacement: ". " },
24
+ { regex: /\bUTC\b/g, replacement: 'Coordinated Universal Time' },
25
+ { regex: /\bGMT\b/g, replacement: 'Greenwich Mean Time' },
26
+ { regex: /\bEST\b(?!\w)/g, replacement: 'Eastern Standard Time' },
27
+ { regex: /\bEDT\b(?!\w)/g, replacement: 'Eastern Daylight Time' },
28
+ { regex: /\bCST\b(?!\w)/g, replacement: 'Central Standard Time' },
29
+ { regex: /\bCDT\b(?!\w)/g, replacement: 'Central Daylight Time' },
30
+ { regex: /\bMST\b(?!\w)/g, replacement: 'Mountain Standard Time' },
31
+ { regex: /\bMDT\b(?!\w)/g, replacement: 'Mountain Daylight Time' },
32
+ { regex: /\bPST\b(?!\w)/g, replacement: 'Pacific Standard Time' },
33
+ { regex: /\bPDT\b(?!\w)/g, replacement: 'Pacific Daylight Time' },
34
+ { regex: /\bAKST\b(?!\w)/g, replacement: 'Alaska Standard Time' },
35
+ { regex: /\bAKDT\b(?!\w)/g, replacement: 'Alaska Daylight Time' },
36
+ { regex: /\bHST\b(?!\w)/g, replacement: 'Hawaii Standard Time' },
37
+ { regex: /\bHDT\b(?!\w)/g, replacement: 'Hawaii Daylight Time' },
38
+ { regex: /\bmph\b(?!\w)/g, replacement: 'miles per hour' },
39
+ { regex: /\bkm\/h\b(?!\w)/g, replacement: 'kilometers per hour' },
40
+ { regex: /\bkmh\b(?!\w)/g, replacement: 'kilometers per hour' },
41
+ { regex: /\bkt\b(?!\w)/g, replacement: 'knots' },
42
+ { regex: /\bNE\b(?!\w)/g, replacement: 'northeast' },
43
+ { regex: /\bNW\b(?!\w)/g, replacement: 'northwest' },
44
+ { regex: /\bSE\b(?!\w)/g, replacement: 'southeast' },
45
+ { regex: /\bSW\b(?!\w)/g, replacement: 'southwest' },
46
+ { regex: /\bNM\b(?!\w)/g, replacement: 'nautical miles' },
47
+ { regex: /\bdeg\b(?!\w)/g, replacement: 'degrees' },
48
+ { regex: /\btstm\b(?!\w)/g, replacement: 'thunderstorm' },
49
+ { regex: /\bmm\b(?!\w)/g, replacement: 'millimeters' },
50
+ { regex: /\bcm\b(?!\w)/g, replacement: 'centimeters' },
51
+ { regex: /\bin.\b(?!\w)/g, replacement: 'inches' },
52
+ { regex: /\bft\b(?!\w)/g, replacement: 'feet' },
53
+ { regex: /\bmi\b(?!\w)/g, replacement: 'miles' },
54
+ { regex: /\bhr\b(?!\w)/g, replacement: 'hour' },
55
+ { regex: /\bhourly\b(?!\w)/g, replacement: 'per hour' },
56
+ { regex: /\bkg\b(?!\w)/g, replacement: 'kilograms' },
57
+ { regex: /\bg\/kg\b(?!\w)/g, replacement: 'grams per kilogram' },
58
+ { regex: /\bmb\b(?!\w)/g, replacement: 'millibars' },
59
+ { regex: /\bhPa\b(?!\w)/g, replacement: 'hectopascals' },
60
+ { regex: /\bPa\b(?!\w)/g, replacement: 'pascals' },
61
+ { regex: /\bKPa\b(?!\w)/g, replacement: 'kilopascals' },
62
+ { regex: /\bC\/hr\b(?!\w)/g, replacement: 'degrees Celsius per hour' },
63
+ { regex: /\bF\/hr\b(?!\w)/g, replacement: 'degrees Fahrenheit per hour' },
64
+ { regex: /\bC\/min\b(?!\w)/g, replacement: 'degrees Celsius per minute' },
65
+ { regex: /\bF\/min\b(?!\w)/g, replacement: 'degrees Fahrenheit per minute' },
66
+ { regex: /\bC\b(?!\w)/g, replacement: 'degrees Celsius' },
67
+ { regex: /\bF\b(?!\w)/g, replacement: 'degrees Fahrenheit' },
68
+ ]
69
+ const hours: Record<number, string> = {
70
+ 0: "twelve", 1: "one", 2: "two", 3: "three", 4: "four",
71
+ 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine",
72
+ 10: "ten", 11: "eleven", 12: "twelve",
73
+ };
74
+ const minWord = (m: number) => m === 0 ? "o'clock" : m < 10 ? `oh ${m}` : `${m}`;
75
+ const fmt = (h: number, m: number, ap: string) => `${hours[h % 12]} ${minWord(m)} ${ap}`;
76
+ for (const {regex, replacement} of patches) {
77
+ message = message.replace(regex, replacement)
78
+ }
79
+ return message
80
+ .replace(/'/g, "''")
81
+ .replace(/\b(\d{1,2}):(\d{2})\s*(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
82
+ .replace(/\b(\d{1,2})\s+(\d{2})\s+(AM|PM)\b/gi, (_, h, m, ap) => fmt(+h, +m, ap.toUpperCase()))
83
+ .replace(/\b(\d{2})(\d{2})\s+(AM|PM)\b/gi, (_, hh, mm, ap) => fmt(+hh, +mm, ap.toUpperCase()))
84
+ .replace(/\b(\d{1,2})\s+(AM|PM)\b/gi, (_, h, ap) => fmt(+h, 0, ap.toUpperCase()))
85
+ .replace(/\*+/g, " ")
86
+ .replace(/-/g, " ")
87
+ .replace(/\n/g, " ")
88
+ .trim();
89
+ }
90
+
91
+
@@ -1,29 +1,29 @@
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
- export const getFloatPCM16 = (float32: Float32Array): Int16Array => {
22
- const out = new Int16Array(float32.length);
23
- for (let i = 0; i < float32.length; i++) {
24
- let v = Math.max(-1, Math.min(1, float32[i]));
25
- out[i] = Math.round(v * 32767);
26
- }
27
- return out;
28
- }
29
-
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
+ export const GetFloatPCM16 = (float32: Float32Array): Int16Array => {
22
+ const out = new Int16Array(float32.length);
23
+ for (let i = 0; i < float32.length; i++) {
24
+ let v = Math.max(-1, Math.min(1, float32[i]));
25
+ out[i] = Math.round(v * 32767);
26
+ }
27
+ return out;
28
+ }
29
+
@@ -1,32 +1,32 @@
1
- /*
2
- _ _ _ __ __
3
- /\ | | | | (_) \ \ / /
4
- / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
- / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
- / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
- /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
- | |
9
- |_|
10
-
11
- Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
- Discord: https://atmosphericx-discord.scriptkitty.cafe
13
- Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
-
16
- Internal Package: @atmosx/event-product-parser
17
-
18
-
19
- */
20
-
21
- export const getMergedPCM16 = (arrays: Int16Array[]): Int16Array => {
22
- let total = 0;
23
- for (const a of arrays) total += a.length;
24
- const out = new Int16Array(total);
25
- let o = 0;
26
- for (const a of arrays) {
27
- out.set(a, o);
28
- o += a.length;
29
- }
30
- return out;
31
- }
32
-
1
+ /*
2
+ _ _ _ __ __
3
+ /\ | | | | (_) \ \ / /
4
+ / \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
5
+ / /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
6
+ / ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
7
+ /_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
8
+ | |
9
+ |_|
10
+
11
+ Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
+ Discord: https://atmosphericx-discord.scriptkitty.cafe
13
+ Ko-Fi: https://ko-fi.com/k3yomi
14
+ Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Internal Package: @atmosx/event-product-parser
17
+
18
+
19
+ */
20
+
21
+ export const GetMergedPCM16 = (arrays: Int16Array[]): Int16Array => {
22
+ let total = 0;
23
+ for (const a of arrays) total += a.length;
24
+ const out = new Int16Array(total);
25
+ let o = 0;
26
+ for (const a of arrays) {
27
+ out.set(a, o);
28
+ o += a.length;
29
+ }
30
+ return out;
31
+ }
32
+