@atmosx/event-product-parser 3.0.54 → 3.0.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/CODE_OF_CONDUCT.md +9 -9
- package/.github/CONTRIBUTING.md +29 -29
- package/.github/LICENSE +17 -17
- package/.github/SECURITY.md +20 -20
- package/.github/SUPPORTED_EVENTS.md +369 -369
- package/.github/docs/docs-functions.md +30 -0
- package/.github/docs/docs-general-configurations.md +209 -0
- package/.github/docs/docs-integrations.md +37 -0
- package/.github/docs/docs-listeners.md +28 -0
- package/.github/docs/docs-source-configuration.md +218 -0
- package/.github/docs/docs-technical.md +50 -0
- package/.github/logo.png +0 -0
- package/.github/samples/SAMPLE_EAS_GENERATION.wav +0 -0
- package/.github/samples/SAMPLE_GEOJSON.json +204 -0
- package/.github/samples/SAMPLE_TEXT_PRODUCT.txt +119 -0
- package/.vscode/settings.json +3 -3
- package/README.md +167 -0
- package/dist/cjs/index.cjs +1475 -1294
- package/dist/esm/index.mjs +1456 -1275
- package/package.json +47 -52
- package/src/@building/{building.create.ts → CreateEvent.ts} +55 -55
- package/src/@building/{building.clean.ts → GetCleanedEvent.ts} +29 -29
- package/src/@building/{building.attachments.ts → GetEventAttachments.ts} +85 -82
- package/src/@building/{building.enhance.ts → GetEventEnhancedName.ts} +54 -59
- package/src/@building/{building.geometry.ts → GetEventGeometry.ts} +47 -47
- package/src/@building/{building.headers.ts → GetEventHeader.ts} +36 -36
- package/src/@building/{building.polygon.ts → GetEventNodes.ts} +72 -69
- package/src/@building/{building.office.ts → GetEventOffice.ts} +42 -42
- package/src/@building/{building.properties.ts → GetEventProperties.ts} +95 -95
- package/src/@building/{building.signature.ts → GetEventSignature.ts} +60 -60
- package/src/@building/{building.tags.ts → GetEventTags.ts} +29 -24
- package/src/@building/{building.tracking.ts → GetEventTracking.ts} +67 -67
- package/src/@core/{core.clearEvents.ts → ClearEvents.ts} +30 -30
- package/src/@core/{core.createListener.ts → CreateListener.ts} +23 -23
- package/src/@core/{core.getEvents.ts → GetEvents.ts} +23 -23
- package/src/@core/{core.getNodes.ts → GetNodes.ts} +23 -23
- package/src/@core/{core.getRandomEvent.ts → GetRandomEvent.ts} +23 -23
- package/src/@core/{core.getVersion.ts → GetVersion.ts} +23 -23
- package/src/@core/{core.manualEvent.ts → ManualEvent.ts} +56 -38
- package/src/@core/{core.query.ts → QueryStanza.ts} +38 -38
- package/src/@core/{core.setNode.ts → SetNode.ts} +80 -80
- package/src/@core/{core.start.ts → StartService.ts} +60 -60
- package/src/@core/{core.stop.ts → StopService.ts} +31 -31
- package/src/@enums/AWIPS.ts +366 -0
- package/src/{@dictionaries/dictionaries.actions.ts → @enums/Actions.ts} +27 -27
- package/src/{@dictionaries/dictionaries.cancellation.ts → @enums/Cancellation.ts} +30 -30
- package/src/{@dictionaries/dictionaries.causes.ts → @enums/Causes.ts} +35 -35
- package/src/{@dictionaries/dictionaries.correlations.ts → @enums/Correlations.ts} +42 -42
- package/src/{@dictionaries/dictionaries.enhanced.ts → @enums/Enhanced.ts} +69 -66
- package/src/{@dictionaries/dictionaries.events.ts → @enums/Events.ts} +82 -82
- package/src/{@dictionaries/dictionaries.expressions.ts → @enums/Expressions.ts} +28 -28
- package/src/@enums/GlobalFilter.ts +24 -0
- package/src/{@dictionaries/dictionaries.hail.ts → @enums/Hail.ts} +37 -35
- package/src/{@dictionaries/dictionaries.icao.ts → @enums/ICAO.ts} +258 -258
- package/src/{@dictionaries/dictionaries.matches.ts → @enums/Matches.ts} +54 -54
- package/src/{@dictionaries/dictionaries.products.ts → @enums/Products.ts} +24 -24
- package/src/{@dictionaries/dictionaries.records.ts → @enums/Records.ts} +25 -25
- package/src/{@dictionaries/dictionaries.severity.ts → @enums/Severity.ts} +27 -27
- package/src/{@dictionaries/dictionaries.shapefiles.ts → @enums/Shapefiles.ts} +35 -35
- package/src/{@dictionaries/dictionaries.states.ts → @enums/States.ts} +71 -71
- package/src/{@dictionaries/dictionaries.status.ts → @enums/Status.ts} +30 -30
- package/src/{@dictionaries/dictionaries.global.ts → @enums/Strings.ts} +22 -24
- package/src/@enums/Tags.ts +167 -0
- package/src/{@dictionaries/dictionaries.testing.ts → @enums/Testing.ts} +24 -24
- package/src/@events/{events.api.ts → ParseAPI.ts} +116 -116
- package/src/@events/{events.text.ts → ParseText.ts} +87 -84
- package/src/@events/{events.ugc.ts → ParseUGC.ts} +93 -89
- package/src/@events/{events.vtec.ts → ParseVTEC.ts} +86 -86
- package/src/@manager/MakeEvents.ts +106 -0
- package/src/@manager/RemoveEvent.ts +70 -0
- package/src/@manager/{manager.setHash.ts → SetHash.ts} +35 -35
- package/src/@manager/Tasks.ts +246 -0
- package/src/@manager/{manager.updateEvents.ts → UpdateEvents.ts} +34 -32
- package/src/@manager/{manager.updateNodes.ts → UpdateNode.ts} +61 -53
- package/src/{@building/building.validate.ts → @manager/ValidateEvents.ts} +141 -152
- package/src/@modules/@database/{database.cache.ts → GetCachedEvents.ts} +49 -49
- package/src/@modules/@database/{database.broadcastify.ts → ImportBroadcastify.ts} +69 -66
- package/src/@modules/@database/{database.shapefiles.ts → ImportShapefiles.ts} +92 -92
- package/src/@modules/@database/{database.stanza.ts → ImportStanza.ts} +46 -46
- package/src/@modules/@database/{database.init.ts → InitializeDatabase.ts} +58 -58
- package/src/@modules/@eas/{eas.setEasTone.ts → GenerateEASMessage.ts} +144 -151
- package/src/@modules/@eas/{eas.getCleanDescription.ts → GetCleanDescription.ts} +91 -91
- package/src/@modules/@eas/{eas.getFloatPCM16.ts → GetFloatPCM16.ts} +29 -29
- package/src/@modules/@eas/{eas.getMergedPCM16.ts → GetMergedPCM16.ts} +32 -32
- package/src/@modules/@eas/{eas.getPCM16.ts → GetPCM16.ts} +52 -52
- package/src/@modules/@eas/{eas.getPCMToFloat.ts → GetPCMToFloat.ts} +26 -26
- package/src/@modules/@eas/{eas.getSampledPCM16.ts → GetSampledPCM16.ts} +36 -36
- package/src/@modules/@eas/{eas.getTTS.ts → GetTTS.ts} +54 -54
- package/src/@modules/@eas/{eas.getWavPCM16.ts → GetWavPCM16.ts} +52 -52
- package/src/@modules/@eas/{eas.setAFSK.ts → SetAFSK.ts} +51 -51
- package/src/@modules/@eas/{eas.setAsciiToBits.ts → SetAsciiToBits.ts} +31 -31
- package/src/@modules/@eas/{eas.setAttentionTone.ts → SetAttentionTone.ts} +40 -40
- package/src/@modules/@eas/{eas.setNoise.ts → SetNoise.ts} +32 -32
- package/src/@modules/@eas/{eas.setRadioEffect.ts → SetRadioEffect.ts} +50 -50
- package/src/@modules/@eas/{eas.setSameHeader.ts → SetSameHeader.ts} +44 -44
- package/src/@modules/@stanza/{stanza.getAwipsType.ts → GetAwipsType.ts} +47 -45
- package/src/@modules/@stanza/{stanza.validate.ts → ValidateStanza.ts} +49 -49
- package/src/@modules/@utilities/{utilities.createHttp.ts → CreateHttp.ts} +83 -83
- package/src/@modules/@utilities/{utilities.getFormattedTime.ts → GetFormattedTime.ts} +43 -43
- package/src/@modules/@utilities/{utilities.getLatestIssuance.ts → GetLatestIssuance.ts} +32 -32
- package/src/@modules/@utilities/{utilities.getMatched.ts → GetMatched.ts} +33 -33
- package/src/@modules/@utilities/{utilities.getSettings.ts → GetSettings.ts} +25 -25
- package/src/@modules/@utilities/{utilities.getShapeNearestPoint.ts → GetShapeNearestPoint.ts} +114 -114
- package/src/@modules/@utilities/{utilities.setCronSchedule.ts → SetCronSchedule.ts} +94 -94
- package/src/@modules/@utilities/{utilities.setDebug.ts → SetDebug.ts} +37 -38
- package/src/@modules/@utilities/{utilities.setEventEmit.ts → SetEventEmit.ts} +41 -41
- package/src/@modules/@utilities/{utilities.setListener.ts → SetListener.ts} +30 -30
- package/src/@modules/@utilities/{utilities.setSettings.ts → SetSettings.ts} +42 -42
- package/src/@modules/@utilities/{utilities.setSleep.ts → SetSleep.ts} +33 -33
- package/src/@modules/@utilities/{utilities.setTimeoutAction.ts → SetTimeoutAction.ts} +63 -62
- package/src/@modules/@utilities/{utilities.setWarning.ts → SetWarning.ts} +34 -34
- package/src/@modules/@xmpp/{xmpp.xDeploy.ts → DeployXMPP.ts} +57 -57
- package/src/@modules/@xmpp/{xmpp.xError.ts → ErrorXMPP.ts} +26 -26
- package/src/@modules/@xmpp/{xmpp.xOffline.ts → OfflineXMPP.ts} +36 -36
- package/src/@modules/@xmpp/{xmpp.xOnline.ts → OnlineXMPP.ts} +45 -45
- package/src/@modules/@xmpp/{xmpp.xReconnect.ts → ReconnectXMPP.ts} +64 -64
- package/src/@modules/@xmpp/{xmpp.xStanza.ts → StanzaXMPP.ts} +62 -62
- package/src/@parsers/@hvtec/{hvtec.extract.ts → HVExtract.ts} +39 -39
- package/src/@parsers/@pvtec/{pvtec.expires.ts → GetExpiry.ts} +25 -25
- package/src/@parsers/@pvtec/{pvtec.extract.ts → VTECExtract.ts} +48 -48
- package/src/@parsers/@text/{text.getDescriptionFromProduct.ts → GetDescriptionFromProduct.ts} +59 -52
- package/src/@parsers/@text/{text.getEmbedText.ts → GetEmbededText.ts} +55 -55
- package/src/@parsers/@text/{text.getPolygonFromProduct.ts → GetPolygonFromProduct.ts} +52 -52
- package/src/@parsers/@text/{text.getStringText.ts → GetStringText.ts} +57 -53
- package/src/@parsers/@text/{text.getTextFromProduct.ts → GetTextFromProduct.ts} +42 -42
- package/src/@parsers/@text/{text.getXML.ts → GetXML.ts} +60 -60
- package/src/@parsers/@ugc/{ugc.getCache.ts → GetCache.ts} +23 -23
- package/src/@parsers/@ugc/{ugc.expiry.ts → GetExpiry.ts} +31 -31
- package/src/@parsers/@ugc/{ugc.locations.ts → GetLocations.ts} +56 -56
- package/src/@parsers/@ugc/{ugc.header.ts → GetUGCHeader.ts} +29 -29
- package/src/@parsers/@ugc/{ugc.coordinates.ts → GetZonePolygon.ts} +110 -110
- package/src/@parsers/@ugc/{ugc.zones.ts → GetZones.ts} +51 -51
- package/src/@parsers/@ugc/{ugc.setCache.ts → SetCache.ts} +27 -27
- package/src/@parsers/@ugc/{ugc.extract.ts → UGCExtract.ts} +36 -36
- package/src/@types/{type.listener.ts → Actions.ts} +37 -38
- package/src/@types/{type.attributes.ts → Attributes.ts} +28 -28
- package/src/@types/{type.event.ts → Event.ts} +69 -69
- package/src/@types/{type.hvtec.ts → HVTEC.ts} +25 -25
- package/src/@types/{type.hash.ts → Hash.ts} +24 -24
- package/src/@types/{type.properties.ts → Properties.ts} +77 -77
- package/src/@types/{type.settings.ts → Settings.ts} +99 -93
- package/src/@types/{type.stanza.ts → Stanza.ts} +37 -37
- package/src/@types/{type.compiled.ts → StanzaCompiled.ts} +35 -34
- package/src/@types/{type.ugc.ts → UGC.ts} +24 -24
- package/src/@types/{type.pvtec.ts → VTEC.ts} +30 -30
- package/src/bootstrap.ts +128 -124
- package/src/index.ts +74 -74
- package/tsconfig.json +13 -13
- package/tsup.config.ts +15 -15
- package/.github/README.md +0 -384
- package/src/@dictionaries/dictionaries.awips.ts +0 -364
- package/src/@dictionaries/dictionaries.tags.ts +0 -93
- package/src/@manager/manager.mkEvent.ts +0 -98
- package/src/@manager/manager.rmEvent.ts +0 -59
- package/src/@manager/manager.updateListener.ts +0 -177
- package/testing/init.js +0 -91
|
@@ -1,93 +1,93 @@
|
|
|
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/
|
|
21
|
-
import {
|
|
22
|
-
import { bootstrap } from "../../bootstrap"
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import { existsSync, mkdirSync, writeFileSync, unlinkSync, rm } from "fs"
|
|
26
|
-
import { resolve, extname} from 'path'
|
|
27
|
-
import { loadAsync } from 'jszip'
|
|
28
|
-
import { read } from 'shapefile'
|
|
29
|
-
|
|
30
|
-
export const
|
|
31
|
-
const settings = bootstrap.settings as TypeSettings;
|
|
32
|
-
try {
|
|
33
|
-
const tShapefiles = bootstrap.database
|
|
34
|
-
.prepare(`SELECT COUNT(*) AS count FROM shapefiles`)
|
|
35
|
-
.get().count;
|
|
36
|
-
if (tShapefiles === 0) {
|
|
37
|
-
await
|
|
38
|
-
for (const shapefile of
|
|
39
|
-
const response = await fetch(shapefile.link);
|
|
40
|
-
const arrayBuff = await response.arrayBuffer();
|
|
41
|
-
const content = await loadAsync(arrayBuff);
|
|
42
|
-
const directory = resolve(__dirname, `../../shapefiles`);
|
|
43
|
-
if (!existsSync(directory)) {
|
|
44
|
-
mkdirSync(directory, { recursive: true });
|
|
45
|
-
}
|
|
46
|
-
for (const file of Object.keys(content.files)) {
|
|
47
|
-
if (file.endsWith('.shp') || file.endsWith('.dbf')) {
|
|
48
|
-
const data = await content.files[file].async(`nodebuffer`)
|
|
49
|
-
const output = resolve(directory, `${shapefile?.name ?? ``}_${shapefile?.id ?? ``}${extname(file)}`)
|
|
50
|
-
writeFileSync(output, data)
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
const filepath = resolve(__dirname, '../../shapefiles', shapefile.name + '_' + shapefile.id)
|
|
54
|
-
const { features } = await read(
|
|
55
|
-
filepath,
|
|
56
|
-
filepath,
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
const insert = bootstrap.database
|
|
60
|
-
.prepare(`INSERT OR REPLACE INTO shapefiles (id, location, geometry) VALUES (?, ?, ?)`)
|
|
61
|
-
const transaction = bootstrap.database.transaction((entries: any[]) => {
|
|
62
|
-
for (const entry of entries) {
|
|
63
|
-
const { properties, geometry } = entry;
|
|
64
|
-
let final: string, location: string;
|
|
65
|
-
if (properties.FIPS) {
|
|
66
|
-
final = `${properties.STATE}${shapefile.id}${properties.FIPS.substring(2)}`;
|
|
67
|
-
location = `${properties.COUNTYNAME}, ${properties.STATE}`;
|
|
68
|
-
}
|
|
69
|
-
else if (properties.FULLSTAID) {
|
|
70
|
-
final = `${properties.ST}${shapefile.id}${properties.WFO}`;
|
|
71
|
-
location = `${properties.CITY}, ${properties.STATE}`;
|
|
72
|
-
}
|
|
73
|
-
else if (properties.STATE) {
|
|
74
|
-
final = `${properties.STATE}${shapefile.id}${properties.ZONE ?? properties.SITE_ID}`;
|
|
75
|
-
location = `${properties.NAME ?? `${properties.RFC_NAME} ${properties.RFC_CITY}`}, ${properties.STATE}`;
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
final = properties.ID ?? properties.WFO
|
|
79
|
-
location = properties.NAME;
|
|
80
|
-
}
|
|
81
|
-
insert.run(final, location, JSON.stringify(geometry));
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
unlinkSync(`${filepath}.shp`)
|
|
85
|
-
unlinkSync(`${filepath}.dbf`)
|
|
86
|
-
transaction(features)
|
|
87
|
-
}
|
|
88
|
-
rm(resolve(__dirname, '../../shapefiles'), { recursive: true, force: true }, () => {});
|
|
89
|
-
}
|
|
90
|
-
} catch (error) {
|
|
91
|
-
|
|
92
|
-
}
|
|
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 { EnumShapefiles } from '../../@enums/Shapefiles'
|
|
22
|
+
import { bootstrap } from "../../bootstrap"
|
|
23
|
+
import { SetSleep } from '../@utilities/SetSleep'
|
|
24
|
+
import { SetWarning } from '../@utilities/SetWarning'
|
|
25
|
+
import { existsSync, mkdirSync, writeFileSync, unlinkSync, rm } from "fs"
|
|
26
|
+
import { resolve, extname} from 'path'
|
|
27
|
+
import { loadAsync } from 'jszip'
|
|
28
|
+
import { read } from 'shapefile'
|
|
29
|
+
|
|
30
|
+
export const ImportShapefiles = async (): Promise<void> => {
|
|
31
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
32
|
+
try {
|
|
33
|
+
const tShapefiles = bootstrap.database
|
|
34
|
+
.prepare(`SELECT COUNT(*) AS count FROM shapefiles`)
|
|
35
|
+
.get().count;
|
|
36
|
+
if (tShapefiles === 0) {
|
|
37
|
+
await SetSleep({timeout: 1e3});
|
|
38
|
+
for (const shapefile of EnumShapefiles) {
|
|
39
|
+
const response = await fetch(shapefile.link);
|
|
40
|
+
const arrayBuff = await response.arrayBuffer();
|
|
41
|
+
const content = await loadAsync(arrayBuff);
|
|
42
|
+
const directory = resolve(__dirname, `../../shapefiles`);
|
|
43
|
+
if (!existsSync(directory)) {
|
|
44
|
+
mkdirSync(directory, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
for (const file of Object.keys(content.files)) {
|
|
47
|
+
if (file.endsWith('.shp') || file.endsWith('.dbf')) {
|
|
48
|
+
const data = await content.files[file].async(`nodebuffer`)
|
|
49
|
+
const output = resolve(directory, `${shapefile?.name ?? ``}_${shapefile?.id ?? ``}${extname(file)}`)
|
|
50
|
+
writeFileSync(output, data)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const filepath = resolve(__dirname, '../../shapefiles', shapefile.name + '_' + shapefile.id)
|
|
54
|
+
const { features } = await read(
|
|
55
|
+
filepath,
|
|
56
|
+
filepath,
|
|
57
|
+
);
|
|
58
|
+
SetWarning({ message: `Importing ${features.length} features from ${shapefile.name}_${shapefile.id} for Shapefiles` })
|
|
59
|
+
const insert = bootstrap.database
|
|
60
|
+
.prepare(`INSERT OR REPLACE INTO shapefiles (id, location, geometry) VALUES (?, ?, ?)`)
|
|
61
|
+
const transaction = bootstrap.database.transaction((entries: any[]) => {
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
const { properties, geometry } = entry;
|
|
64
|
+
let final: string, location: string;
|
|
65
|
+
if (properties.FIPS) {
|
|
66
|
+
final = `${properties.STATE}${shapefile.id}${properties.FIPS.substring(2)}`;
|
|
67
|
+
location = `${properties.COUNTYNAME}, ${properties.STATE}`;
|
|
68
|
+
}
|
|
69
|
+
else if (properties.FULLSTAID) {
|
|
70
|
+
final = `${properties.ST}${shapefile.id}${properties.WFO}`;
|
|
71
|
+
location = `${properties.CITY}, ${properties.STATE}`;
|
|
72
|
+
}
|
|
73
|
+
else if (properties.STATE) {
|
|
74
|
+
final = `${properties.STATE}${shapefile.id}${properties.ZONE ?? properties.SITE_ID}`;
|
|
75
|
+
location = `${properties.NAME ?? `${properties.RFC_NAME} ${properties.RFC_CITY}`}, ${properties.STATE}`;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
final = properties.ID ?? properties.WFO
|
|
79
|
+
location = properties.NAME;
|
|
80
|
+
}
|
|
81
|
+
insert.run(final, location, JSON.stringify(geometry));
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
unlinkSync(`${filepath}.shp`)
|
|
85
|
+
unlinkSync(`${filepath}.dbf`)
|
|
86
|
+
transaction(features)
|
|
87
|
+
}
|
|
88
|
+
rm(resolve(__dirname, '../../shapefiles'), { recursive: true, force: true }, () => {});
|
|
89
|
+
}
|
|
90
|
+
} catch (error) {
|
|
91
|
+
SetWarning( {message: `An error occurred while compiling shapefiles: ${error.message}` })
|
|
92
|
+
}
|
|
93
93
|
}
|
|
@@ -1,47 +1,47 @@
|
|
|
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/
|
|
21
|
-
import { TypeStanzaCompiled } from '../../@types/
|
|
22
|
-
import { bootstrap } from '../../bootstrap'
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
export const
|
|
26
|
-
const settings = bootstrap.settings as TypeSettings;
|
|
27
|
-
try {
|
|
28
|
-
if (!settings.NOAAWeatherWireServiceSettings.CacheSettings.Enabled) { return }
|
|
29
|
-
bootstrap.database
|
|
30
|
-
.prepare(`INSERT OR IGNORE INTO stanzas (type, stanza, issued) VALUES (?, ?, ?)`)
|
|
31
|
-
.run(stanza.getType.type, JSON.stringify(stanza), stanza.attributes.issue)
|
|
32
|
-
const count = bootstrap.database
|
|
33
|
-
.prepare(`SELECT COUNT(*) as total FROM stanzas`)
|
|
34
|
-
.get() as { total: number }
|
|
35
|
-
const max = settings.NOAAWeatherWireServiceSettings.CacheSettings.MaxDatabaseHistory;
|
|
36
|
-
if (count.total > max) {
|
|
37
|
-
const toDelete = count.total - max;
|
|
38
|
-
if (toDelete > 0) {
|
|
39
|
-
bootstrap.database
|
|
40
|
-
.prepare(`DELETE FROM stanzas WHERE id IN (SELECT id FROM stanzas ORDER BY issued ASC LIMIT ?)`)
|
|
41
|
-
.run(toDelete);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
} catch (error) {
|
|
45
|
-
|
|
46
|
-
}
|
|
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 { TypeStanzaCompiled } from '../../@types/StanzaCompiled';
|
|
22
|
+
import { bootstrap } from '../../bootstrap'
|
|
23
|
+
import { SetWarning } from '../@utilities/SetWarning';
|
|
24
|
+
|
|
25
|
+
export const ImportStanza = async (stanza: TypeStanzaCompiled): Promise<void> => {
|
|
26
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
27
|
+
try {
|
|
28
|
+
if (!settings.NOAAWeatherWireServiceSettings.CacheSettings.Enabled) { return }
|
|
29
|
+
bootstrap.database
|
|
30
|
+
.prepare(`INSERT OR IGNORE INTO stanzas (type, stanza, issued) VALUES (?, ?, ?)`)
|
|
31
|
+
.run(stanza.getType.type, JSON.stringify(stanza), stanza.attributes.issue)
|
|
32
|
+
const count = bootstrap.database
|
|
33
|
+
.prepare(`SELECT COUNT(*) as total FROM stanzas`)
|
|
34
|
+
.get() as { total: number }
|
|
35
|
+
const max = settings.NOAAWeatherWireServiceSettings.CacheSettings.MaxDatabaseHistory;
|
|
36
|
+
if (count.total > max) {
|
|
37
|
+
const toDelete = count.total - max;
|
|
38
|
+
if (toDelete > 0) {
|
|
39
|
+
bootstrap.database
|
|
40
|
+
.prepare(`DELETE FROM stanzas WHERE id IN (SELECT id FROM stanzas ORDER BY issued ASC LIMIT ?)`)
|
|
41
|
+
.run(toDelete);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
} catch (error) {
|
|
45
|
+
SetWarning({ message: `An error occurred while importing stanza: ${error.message}` })
|
|
46
|
+
}
|
|
47
47
|
}
|
|
@@ -1,59 +1,59 @@
|
|
|
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 { TypeSettings } from "../../@types/
|
|
22
|
-
import { bootstrap } from "../../bootstrap"
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import { existsSync, writeFileSync } from "fs"
|
|
27
|
-
import sqlite3 from 'better-sqlite3'
|
|
28
|
-
|
|
29
|
-
export const
|
|
30
|
-
const settings = bootstrap.settings as TypeSettings;
|
|
31
|
-
try {
|
|
32
|
-
if (!existsSync(settings.Database)) {
|
|
33
|
-
writeFileSync(settings.Database, '')
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
bootstrap.database = new sqlite3(settings.Database);
|
|
37
|
-
bootstrap.database
|
|
38
|
-
.prepare(`CREATE TABLE IF NOT EXISTS stanzas ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT, issued TEXT, stanza TEXT )`)
|
|
39
|
-
.run();
|
|
40
|
-
bootstrap.database
|
|
41
|
-
.prepare(`CREATE TABLE IF NOT EXISTS shapefiles (id TEXT PRIMARY KEY, location TEXT, geometry TEXT)`)
|
|
42
|
-
.run();
|
|
43
|
-
const isNeedingShapefiles = bootstrap.database
|
|
44
|
-
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='shapefiles';`)
|
|
45
|
-
.get();
|
|
46
|
-
const isNeedingBroadcastify = bootstrap.database
|
|
47
|
-
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='broadcastify';`)
|
|
48
|
-
.get();
|
|
49
|
-
|
|
50
|
-
if (!isNeedingShapefiles || !isNeedingBroadcastify) {
|
|
51
|
-
|
|
52
|
-
await
|
|
53
|
-
await
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
} catch (error) {
|
|
57
|
-
|
|
58
|
-
}
|
|
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 { TypeSettings } from "../../@types/Settings"
|
|
22
|
+
import { bootstrap } from "../../bootstrap"
|
|
23
|
+
import { SetWarning } from '../@utilities/SetWarning'
|
|
24
|
+
import { ImportShapefiles } from './ImportShapefiles'
|
|
25
|
+
import { ImportBroadcastify } from "./ImportBroadcastify"
|
|
26
|
+
import { existsSync, writeFileSync } from "fs"
|
|
27
|
+
import sqlite3 from 'better-sqlite3'
|
|
28
|
+
|
|
29
|
+
export const InitializeDatabase = async (): Promise<void> => {
|
|
30
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
31
|
+
try {
|
|
32
|
+
if (!existsSync(settings.Database)) {
|
|
33
|
+
writeFileSync(settings.Database, '')
|
|
34
|
+
SetWarning({ message: `Creating new database at ${settings.Database}` })
|
|
35
|
+
}
|
|
36
|
+
bootstrap.database = new sqlite3(settings.Database);
|
|
37
|
+
bootstrap.database
|
|
38
|
+
.prepare(`CREATE TABLE IF NOT EXISTS stanzas ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT, issued TEXT, stanza TEXT )`)
|
|
39
|
+
.run();
|
|
40
|
+
bootstrap.database
|
|
41
|
+
.prepare(`CREATE TABLE IF NOT EXISTS shapefiles (id TEXT PRIMARY KEY, location TEXT, geometry TEXT)`)
|
|
42
|
+
.run();
|
|
43
|
+
const isNeedingShapefiles = bootstrap.database
|
|
44
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='shapefiles';`)
|
|
45
|
+
.get();
|
|
46
|
+
const isNeedingBroadcastify = bootstrap.database
|
|
47
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='broadcastify';`)
|
|
48
|
+
.get();
|
|
49
|
+
|
|
50
|
+
if (!isNeedingShapefiles || !isNeedingBroadcastify) {
|
|
51
|
+
SetWarning({message: `Required database tables are currently building, please ${bootstrap.ansi_colors.RED}DO NOT${bootstrap.ansi_colors.RESET} close your terminal. The building will not finish and will remain incomplete. If you do mess up, you will need to delete ${settings.Database} and restart the application.` })
|
|
52
|
+
await ImportBroadcastify();
|
|
53
|
+
await ImportShapefiles();
|
|
54
|
+
SetWarning({ message: `Building has completed, you can now continue or close the terminal`})
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
SetWarning({ message: `An error occurred while initializing the database: ${error.message}` })
|
|
58
|
+
}
|
|
59
59
|
}
|