@atmosx/event-product-parser 3.0.51 → 3.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{CODE_OF_CONDUCT.md → .github/CODE_OF_CONDUCT.md} +9 -9
- package/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +29 -29
- package/{LICENSE → .github/LICENSE} +17 -17
- package/{README.md → .github/README.md} +466 -444
- package/{SECURITY.md → .github/SECURITY.md} +20 -20
- package/{SUPPORTED_EVENTS.md → .github/SUPPORTED_EVENTS.md} +369 -368
- package/.vscode/settings.json +3 -3
- package/dist/cjs/index.cjs +243 -213
- package/dist/esm/index.mjs +242 -212
- package/package.json +52 -52
- package/src/@building/building.attachments.ts +82 -82
- package/src/@building/building.clean.ts +29 -29
- package/src/@building/building.create.ts +55 -55
- package/src/@building/building.enhance.ts +59 -59
- package/src/@building/building.geometry.ts +47 -47
- package/src/@building/building.headers.ts +36 -36
- package/src/@building/building.office.ts +42 -42
- package/src/@building/building.polygon.ts +69 -69
- package/src/@building/building.properties.ts +95 -95
- package/src/@building/building.signature.ts +60 -60
- package/src/@building/building.tags.ts +23 -23
- package/src/@building/building.tracking.ts +67 -67
- package/src/@building/building.validate.ts +152 -151
- package/src/@core/core.clearEvents.ts +30 -30
- package/src/@core/core.createListener.ts +23 -23
- package/src/@core/core.getEvents.ts +23 -23
- package/src/@core/core.getNodes.ts +23 -23
- package/src/@core/core.getRandomEvent.ts +23 -23
- package/src/@core/core.getVersion.ts +23 -23
- package/src/@core/core.manualEvent.ts +38 -0
- package/src/@core/core.query.ts +38 -38
- package/src/@core/core.setNode.ts +80 -80
- package/src/@core/core.start.ts +60 -60
- package/src/@core/core.stop.ts +31 -31
- package/src/@dictionaries/dictionaries.actions.ts +27 -27
- package/src/@dictionaries/dictionaries.awips.ts +363 -363
- package/src/@dictionaries/dictionaries.cancellation.ts +30 -30
- package/src/@dictionaries/dictionaries.causes.ts +35 -35
- package/src/@dictionaries/dictionaries.correlations.ts +42 -42
- package/src/@dictionaries/dictionaries.enhanced.ts +66 -109
- package/src/@dictionaries/dictionaries.events.ts +82 -82
- package/src/@dictionaries/dictionaries.expressions.ts +28 -28
- package/src/@dictionaries/dictionaries.global.ts +24 -0
- package/src/@dictionaries/dictionaries.hail.ts +35 -35
- package/src/@dictionaries/dictionaries.icao.ts +258 -258
- package/src/@dictionaries/dictionaries.matches.ts +54 -35
- package/src/@dictionaries/dictionaries.products.ts +24 -24
- package/src/@dictionaries/dictionaries.records.ts +25 -25
- package/src/@dictionaries/dictionaries.severity.ts +27 -27
- package/src/@dictionaries/dictionaries.shapefiles.ts +35 -35
- package/src/@dictionaries/dictionaries.states.ts +71 -71
- package/src/@dictionaries/dictionaries.status.ts +30 -30
- package/src/@dictionaries/dictionaries.tags.ts +92 -92
- package/src/@dictionaries/dictionaries.testing.ts +24 -24
- package/src/@events/events.api.ts +116 -116
- package/src/@events/events.text.ts +84 -80
- package/src/@events/events.ugc.ts +89 -85
- package/src/@events/events.vtec.ts +86 -86
- package/src/@manager/manager.mkEvent.ts +97 -93
- package/src/@manager/manager.rmEvent.ts +56 -51
- package/src/@manager/manager.setHash.ts +35 -35
- package/src/@manager/manager.updateEvents.ts +32 -32
- package/src/@manager/manager.updateListener.ts +179 -154
- package/src/@manager/manager.updateNodes.ts +53 -53
- package/src/@modules/@database/database.broadcastify.ts +66 -66
- package/src/@modules/@database/database.cache.ts +49 -49
- package/src/@modules/@database/database.init.ts +58 -58
- package/src/@modules/@database/database.shapefiles.ts +92 -92
- package/src/@modules/@database/database.stanza.ts +46 -46
- package/src/@modules/@eas/eas.getCleanDescription.ts +91 -91
- package/src/@modules/@eas/eas.getFloatPCM16.ts +29 -29
- package/src/@modules/@eas/eas.getMergedPCM16.ts +32 -32
- package/src/@modules/@eas/eas.getPCM16.ts +52 -52
- package/src/@modules/@eas/eas.getPCMToFloat.ts +26 -26
- package/src/@modules/@eas/eas.getSampledPCM16.ts +36 -36
- package/src/@modules/@eas/eas.getTTS.ts +54 -54
- package/src/@modules/@eas/eas.getWavPCM16.ts +52 -52
- package/src/@modules/@eas/eas.setAFSK.ts +51 -51
- package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -31
- package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
- package/src/@modules/@eas/eas.setEasTone.ts +151 -151
- package/src/@modules/@eas/eas.setNoise.ts +32 -32
- package/src/@modules/@eas/eas.setRadioEffect.ts +50 -50
- package/src/@modules/@eas/eas.setSameHeader.ts +44 -44
- package/src/@modules/@stanza/stanza.getAwipsType.ts +45 -45
- package/src/@modules/@stanza/stanza.validate.ts +49 -49
- package/src/@modules/@utilities/utilities.createHttp.ts +83 -70
- package/src/@modules/@utilities/utilities.getFormattedTime.ts +43 -43
- package/src/@modules/@utilities/utilities.getLatestIssuance.ts +32 -32
- package/src/@modules/@utilities/utilities.getMatched.ts +33 -33
- package/src/@modules/@utilities/utilities.getSettings.ts +25 -25
- package/src/@modules/@utilities/utilities.getShapeNearestPoint.ts +114 -114
- package/src/@modules/@utilities/utilities.setCronSchedule.ts +94 -94
- package/src/@modules/@utilities/utilities.setDebug.ts +38 -38
- package/src/@modules/@utilities/utilities.setEventEmit.ts +41 -41
- package/src/@modules/@utilities/utilities.setListener.ts +30 -30
- package/src/@modules/@utilities/utilities.setSettings.ts +42 -42
- package/src/@modules/@utilities/utilities.setSleep.ts +33 -33
- package/src/@modules/@utilities/utilities.setTimeoutAction.ts +62 -62
- package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
- package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -57
- package/src/@modules/@xmpp/xmpp.xError.ts +26 -26
- package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -36
- package/src/@modules/@xmpp/xmpp.xOnline.ts +45 -44
- package/src/@modules/@xmpp/xmpp.xReconnect.ts +64 -64
- package/src/@modules/@xmpp/xmpp.xStanza.ts +62 -62
- package/src/@parsers/@hvtec/hvtec.extract.ts +39 -39
- package/src/@parsers/@pvtec/pvtec.expires.ts +25 -25
- package/src/@parsers/@pvtec/pvtec.extract.ts +48 -48
- package/src/@parsers/@text/text.getDescriptionFromProduct.ts +52 -52
- package/src/@parsers/@text/text.getEmbed.ts +55 -55
- package/src/@parsers/@text/text.getPolygonFromProduct.ts +53 -32
- package/src/@parsers/@text/text.getRaw.ts +54 -0
- package/src/@parsers/@text/text.getTextFromProduct.ts +42 -42
- package/src/@parsers/@text/text.getXML.ts +60 -60
- package/src/@parsers/@ugc/ugc.coordinates.ts +110 -110
- package/src/@parsers/@ugc/ugc.expiry.ts +31 -31
- package/src/@parsers/@ugc/ugc.extract.ts +36 -36
- package/src/@parsers/@ugc/ugc.getCache.ts +23 -23
- package/src/@parsers/@ugc/ugc.header.ts +29 -29
- package/src/@parsers/@ugc/ugc.locations.ts +56 -56
- package/src/@parsers/@ugc/ugc.setCache.ts +27 -27
- package/src/@parsers/@ugc/ugc.zones.ts +51 -51
- package/src/@types/type.attributes.ts +28 -28
- package/src/@types/type.compiled.ts +34 -34
- package/src/@types/type.event.ts +69 -69
- package/src/@types/type.hash.ts +24 -24
- package/src/@types/type.hvtec.ts +25 -25
- package/src/@types/type.listener.ts +37 -32
- package/src/@types/type.properties.ts +77 -77
- package/src/@types/type.pvtec.ts +30 -30
- package/src/@types/type.settings.ts +93 -84
- package/src/@types/type.stanza.ts +37 -37
- package/src/@types/type.ugc.ts +24 -24
- package/src/bootstrap.ts +124 -115
- package/src/index.ts +74 -74
- package/{test.js → testing/init.js} +105 -92
- package/tsconfig.json +13 -13
- package/tsup.config.ts +15 -15
- package/src/@core/core.createEvent.ts +0 -82
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
/*
|
|
2
|
-
_ _ _ __ __
|
|
3
|
-
/\ | | | | (_) \ \ / /
|
|
4
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
-
| |
|
|
9
|
-
|_|
|
|
10
|
-
|
|
11
|
-
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
-
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
-
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
-
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
-
|
|
16
|
-
Internal Package: @atmosx/event-product-parser
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { dict_expressions } from "../../@dictionaries/dictionaries.expressions";
|
|
21
|
-
|
|
22
|
-
interface GetDescriptionFromProductOptions {
|
|
23
|
-
message: string
|
|
24
|
-
handle?: string
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const getDescriptionFromProduct = (options: GetDescriptionFromProductOptions): string => {
|
|
28
|
-
let message = options.message;
|
|
29
|
-
const dates = Array.from(message.matchAll(dict_expressions.dateline));
|
|
30
|
-
if (dates.length) {
|
|
31
|
-
const lastMatch = dates[dates.length - 1][0];
|
|
32
|
-
const sIndx = message.lastIndexOf(lastMatch);
|
|
33
|
-
if (sIndx !== -1) {
|
|
34
|
-
const endIndx = message.indexOf('&&', sIndx);
|
|
35
|
-
message = message.substring(sIndx + lastMatch.length, endIndx !== -1 ? endIndx : undefined).trimStart();
|
|
36
|
-
if (message.startsWith('/')) message = message.slice(1).trimStart();
|
|
37
|
-
if (options.handle && message.includes(options.handle)) {
|
|
38
|
-
const handleIdx = message.indexOf(options.handle);
|
|
39
|
-
message = message.substring(handleIdx + options.handle.length).trimStart();
|
|
40
|
-
if (message.startsWith('/')) message = message.slice(1).trimStart();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
} else if (options.handle) {
|
|
44
|
-
const handleIndx = message.indexOf(options.handle);
|
|
45
|
-
if (handleIndx !== -1) {
|
|
46
|
-
let afterHandle = message.substring(handleIndx + options.handle.length).trimStart();
|
|
47
|
-
if (afterHandle.startsWith('/')) afterHandle = afterHandle.slice(1).trimStart();
|
|
48
|
-
const latEnd = afterHandle.indexOf('&&')
|
|
49
|
-
message = latEnd !== -1 ? afterHandle.substring(0, latEnd).trim() : afterHandle.trim();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return message.trim();
|
|
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 { dict_expressions } from "../../@dictionaries/dictionaries.expressions";
|
|
21
|
+
|
|
22
|
+
interface GetDescriptionFromProductOptions {
|
|
23
|
+
message: string
|
|
24
|
+
handle?: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const getDescriptionFromProduct = (options: GetDescriptionFromProductOptions): string => {
|
|
28
|
+
let message = options.message;
|
|
29
|
+
const dates = Array.from(message.matchAll(dict_expressions.dateline));
|
|
30
|
+
if (dates.length) {
|
|
31
|
+
const lastMatch = dates[dates.length - 1][0];
|
|
32
|
+
const sIndx = message.lastIndexOf(lastMatch);
|
|
33
|
+
if (sIndx !== -1) {
|
|
34
|
+
const endIndx = message.indexOf('&&', sIndx);
|
|
35
|
+
message = message.substring(sIndx + lastMatch.length, endIndx !== -1 ? endIndx : undefined).trimStart();
|
|
36
|
+
if (message.startsWith('/')) message = message.slice(1).trimStart();
|
|
37
|
+
if (options.handle && message.includes(options.handle)) {
|
|
38
|
+
const handleIdx = message.indexOf(options.handle);
|
|
39
|
+
message = message.substring(handleIdx + options.handle.length).trimStart();
|
|
40
|
+
if (message.startsWith('/')) message = message.slice(1).trimStart();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} else if (options.handle) {
|
|
44
|
+
const handleIndx = message.indexOf(options.handle);
|
|
45
|
+
if (handleIndx !== -1) {
|
|
46
|
+
let afterHandle = message.substring(handleIndx + options.handle.length).trimStart();
|
|
47
|
+
if (afterHandle.startsWith('/')) afterHandle = afterHandle.slice(1).trimStart();
|
|
48
|
+
const latEnd = afterHandle.indexOf('&&')
|
|
49
|
+
message = latEnd !== -1 ? afterHandle.substring(0, latEnd).trim() : afterHandle.trim();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return message.trim();
|
|
53
53
|
}
|
|
@@ -1,56 +1,56 @@
|
|
|
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
|
-
|
|
22
|
-
export const getEmebed = (event: TypeEvent): string => {
|
|
23
|
-
const line = (label: string, value: unknown, condition = true) => condition && value ? `${label} ${value}` : null;
|
|
24
|
-
const isStatement = event.properties.status_metadata.is_statement;
|
|
25
|
-
const isExpired = event.properties.status_metadata.is_expired;
|
|
26
|
-
return [
|
|
27
|
-
line(`**Locations:**`, event?.properties?.locations?.slice(0, 100)),
|
|
28
|
-
line(`**Issued:**`, `<t:${Math.floor(new Date(event.properties.issued).getTime() / 1000)}:R>`, !isExpired),
|
|
29
|
-
line(`**Expires:**`, `<t:${Math.floor(new Date(event.properties.expires).getTime() / 1000)}:R>`, !isStatement),
|
|
30
|
-
line(`**Damage Threat:**`, event?.properties?.parameters?.damage_threat, !isExpired),
|
|
31
|
-
line(`**Flood Threat:**`, event?.properties?.parameters?.flood_threat, !isExpired),
|
|
32
|
-
line(`**Tornado Threat:**`, event?.properties?.parameters?.tornado_threat, !isExpired),
|
|
33
|
-
line(`**Estimated Wind Gusts:**`, `${event?.properties?.parameters?.estimated_wind_gusts} ${event?.properties?.parameters?.wind_threat ? ` (${event?.properties?.parameters?.wind_threat})` : ''}`, !isExpired && event?.properties?.parameters?.estimated_wind_gusts != null),
|
|
34
|
-
line(`**Estimated Hail Size:**`, `${event?.properties?.parameters?.estimated_hail_size} ${event?.properties?.parameters?.hail_threat ? ` (${event?.properties?.parameters?.hail_threat})` : ''}`, !isExpired && event?.properties?.parameters?.estimated_hail_size != null),
|
|
35
|
-
line(`**Discussion:**`, event?.properties?.discussion_parameters?.discussion_number, !isExpired),
|
|
36
|
-
line(`**Concern:**`, event?.properties?.discussion_parameters?.discussion_concerning, !isExpired),
|
|
37
|
-
line(`**SPC Max Tornado Threat:**`, event?.properties?.discussion_parameters?.discussion_max_tornado, !isExpired),
|
|
38
|
-
line(`**SPC Max Hail Threat:**`, event?.properties?.discussion_parameters?.discussion_max_hail, !isExpired),
|
|
39
|
-
line(`**SPC Max Wind Threat:**`, event?.properties?.discussion_parameters?.discussion_max_wind, !isExpired),
|
|
40
|
-
line(`**SPC Watch Issuance Probability:**`, event?.properties?.discussion_parameters?.discussion_watch_issuance ? `${event?.properties?.discussion_parameters?.discussion_watch_issuance}%` : null, !isExpired),
|
|
41
|
-
line(`**Watch Number:**`, event?.properties?.watch_parameters?.watch_number, !isExpired),
|
|
42
|
-
line(`**Strong Tornadoes Probability:**`, event?.properties?.watch_parameters?.strong_tornadoes_probability ? `${event?.properties?.watch_parameters?.strong_tornadoes_probability}%` : null, !isExpired),
|
|
43
|
-
line(`**Additional Tornadoes Probability:**`, event?.properties?.watch_parameters?.additional_tornadoes_probability ? `${event?.properties?.watch_parameters?.additional_tornadoes_probability}%` : null, !isExpired),
|
|
44
|
-
line(`**Combined Hail/Wind Probability:**`, event?.properties?.watch_parameters?.combined_hail_wind_probability ? `${event?.properties?.watch_parameters?.combined_hail_wind_probability}%` : null, !isExpired),
|
|
45
|
-
line(`**Severe Hail Probability:**`, event?.properties?.watch_parameters?.severe_hail_probability ? `${event?.properties?.watch_parameters?.severe_hail_probability}%` : null, !isExpired),
|
|
46
|
-
line(`**Hail >2in Probability:**`, event?.properties?.watch_parameters?.hail_2in_probability ? `${event?.properties?.watch_parameters?.hail_2in_probability}%` : null, !isExpired),
|
|
47
|
-
line(`**Max Hail Inches:**`, event?.properties?.watch_parameters?.max_hail_in, !isExpired),
|
|
48
|
-
line(`**Severe Wind Probability:**`, event?.properties?.watch_parameters?.severe_wind_probability ? `${event?.properties?.watch_parameters?.severe_wind_probability}%` : null, !isExpired),
|
|
49
|
-
line(`**Max Surface Wind:**`, event?.properties?.watch_parameters?.max_wind_surface, !isExpired),
|
|
50
|
-
line(`**Max Tops (x100 feet):**`, event?.properties?.watch_parameters?.max_tops_x100feet, !isExpired),
|
|
51
|
-
line(`**Tags:**`, event?.properties?.parameters?.tags?.length > 0 ? event?.properties?.parameters?.tags.join(', ') : null, !isExpired),
|
|
52
|
-
line(`**Sender:**`, event?.properties?.geocode?.office?.name ? `${event?.properties?.geocode?.office?.name} (${event?.properties?.geocode?.office?.office})` : event?.properties?.geocode?.office?.office),
|
|
53
|
-
line(`**Tracking:**`, event?.properties?.metadata?.tracking),
|
|
54
|
-
line(`**Logs:**`, event?.properties?.metadata?.history?.length > 0 ? event?.properties?.metadata?.history.length : null),
|
|
55
|
-
].filter(Boolean).join('\n');
|
|
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
|
+
|
|
22
|
+
export const getEmebed = (event: TypeEvent): string => {
|
|
23
|
+
const line = (label: string, value: unknown, condition = true) => condition && value ? `${label} ${value}` : null;
|
|
24
|
+
const isStatement = event.properties.status_metadata.is_statement;
|
|
25
|
+
const isExpired = event.properties.status_metadata.is_expired;
|
|
26
|
+
return [
|
|
27
|
+
line(`**Locations:**`, event?.properties?.locations?.slice(0, 100)),
|
|
28
|
+
line(`**Issued:**`, `<t:${Math.floor(new Date(event.properties.issued).getTime() / 1000)}:R>`, !isExpired),
|
|
29
|
+
line(`**Expires:**`, `<t:${Math.floor(new Date(event.properties.expires).getTime() / 1000)}:R>`, !isStatement),
|
|
30
|
+
line(`**Damage Threat:**`, event?.properties?.parameters?.damage_threat, !isExpired),
|
|
31
|
+
line(`**Flood Threat:**`, event?.properties?.parameters?.flood_threat, !isExpired),
|
|
32
|
+
line(`**Tornado Threat:**`, event?.properties?.parameters?.tornado_threat, !isExpired),
|
|
33
|
+
line(`**Estimated Wind Gusts:**`, `${event?.properties?.parameters?.estimated_wind_gusts} ${event?.properties?.parameters?.wind_threat ? ` (${event?.properties?.parameters?.wind_threat})` : ''}`, !isExpired && event?.properties?.parameters?.estimated_wind_gusts != null),
|
|
34
|
+
line(`**Estimated Hail Size:**`, `${event?.properties?.parameters?.estimated_hail_size} ${event?.properties?.parameters?.hail_threat ? ` (${event?.properties?.parameters?.hail_threat})` : ''}`, !isExpired && event?.properties?.parameters?.estimated_hail_size != null),
|
|
35
|
+
line(`**Discussion:**`, event?.properties?.discussion_parameters?.discussion_number, !isExpired),
|
|
36
|
+
line(`**Concern:**`, event?.properties?.discussion_parameters?.discussion_concerning, !isExpired),
|
|
37
|
+
line(`**SPC Max Tornado Threat:**`, event?.properties?.discussion_parameters?.discussion_max_tornado, !isExpired),
|
|
38
|
+
line(`**SPC Max Hail Threat:**`, event?.properties?.discussion_parameters?.discussion_max_hail, !isExpired),
|
|
39
|
+
line(`**SPC Max Wind Threat:**`, event?.properties?.discussion_parameters?.discussion_max_wind, !isExpired),
|
|
40
|
+
line(`**SPC Watch Issuance Probability:**`, event?.properties?.discussion_parameters?.discussion_watch_issuance ? `${event?.properties?.discussion_parameters?.discussion_watch_issuance}%` : null, !isExpired),
|
|
41
|
+
line(`**Watch Number:**`, event?.properties?.watch_parameters?.watch_number, !isExpired),
|
|
42
|
+
line(`**Strong Tornadoes Probability:**`, event?.properties?.watch_parameters?.strong_tornadoes_probability ? `${event?.properties?.watch_parameters?.strong_tornadoes_probability}%` : null, !isExpired),
|
|
43
|
+
line(`**Additional Tornadoes Probability:**`, event?.properties?.watch_parameters?.additional_tornadoes_probability ? `${event?.properties?.watch_parameters?.additional_tornadoes_probability}%` : null, !isExpired),
|
|
44
|
+
line(`**Combined Hail/Wind Probability:**`, event?.properties?.watch_parameters?.combined_hail_wind_probability ? `${event?.properties?.watch_parameters?.combined_hail_wind_probability}%` : null, !isExpired),
|
|
45
|
+
line(`**Severe Hail Probability:**`, event?.properties?.watch_parameters?.severe_hail_probability ? `${event?.properties?.watch_parameters?.severe_hail_probability}%` : null, !isExpired),
|
|
46
|
+
line(`**Hail >2in Probability:**`, event?.properties?.watch_parameters?.hail_2in_probability ? `${event?.properties?.watch_parameters?.hail_2in_probability}%` : null, !isExpired),
|
|
47
|
+
line(`**Max Hail Inches:**`, event?.properties?.watch_parameters?.max_hail_in, !isExpired),
|
|
48
|
+
line(`**Severe Wind Probability:**`, event?.properties?.watch_parameters?.severe_wind_probability ? `${event?.properties?.watch_parameters?.severe_wind_probability}%` : null, !isExpired),
|
|
49
|
+
line(`**Max Surface Wind:**`, event?.properties?.watch_parameters?.max_wind_surface, !isExpired),
|
|
50
|
+
line(`**Max Tops (x100 feet):**`, event?.properties?.watch_parameters?.max_tops_x100feet, !isExpired),
|
|
51
|
+
line(`**Tags:**`, event?.properties?.parameters?.tags?.length > 0 ? event?.properties?.parameters?.tags.join(', ') : null, !isExpired),
|
|
52
|
+
line(`**Sender:**`, event?.properties?.geocode?.office?.name ? `${event?.properties?.geocode?.office?.name} (${event?.properties?.geocode?.office?.office})` : event?.properties?.geocode?.office?.office),
|
|
53
|
+
line(`**Tracking:**`, event?.properties?.metadata?.tracking),
|
|
54
|
+
line(`**Logs:**`, event?.properties?.metadata?.history?.length > 0 ? event?.properties?.metadata?.history.length : null),
|
|
55
|
+
].filter(Boolean).join('\n');
|
|
56
56
|
}
|
|
@@ -1,32 +1,53 @@
|
|
|
1
|
-
/*
|
|
2
|
-
_ _ _ __ __
|
|
3
|
-
/\ | | | | (_) \ \ / /
|
|
4
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
-
| |
|
|
9
|
-
|_|
|
|
10
|
-
|
|
11
|
-
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
-
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
-
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
-
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
-
|
|
16
|
-
Internal Package: @atmosx/event-product-parser
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
export const getPolygonFromProduct = (message: string): number[][] => {
|
|
21
|
-
const coordinates: [
|
|
22
|
-
const match = message.match(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (
|
|
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
|
+
export const getPolygonFromProduct = (message: string): number[][] => {
|
|
21
|
+
const coordinates: number[][] = [];
|
|
22
|
+
const match = message.match(
|
|
23
|
+
/LAT\.\.\.LON\s+([\s\S]*?)(?=\n[A-Z]{2,}(?:\.\.\.|:)|\$\$|&&|$)/i
|
|
24
|
+
);
|
|
25
|
+
if (!match) return coordinates;
|
|
26
|
+
const text = match[1];
|
|
27
|
+
const values = text.match(/\d{4,8}/g);
|
|
28
|
+
if (!values) return coordinates;
|
|
29
|
+
|
|
30
|
+
if (values.every(v => v.length === 8)) {
|
|
31
|
+
for (const value of values) {
|
|
32
|
+
const lat = parseInt(value.slice(0, 4), 10) / 100;
|
|
33
|
+
const lon = -parseInt(value.slice(4, 8), 10) / 100;
|
|
34
|
+
if (Number.isFinite(lat) && Number.isFinite(lon)) {
|
|
35
|
+
coordinates.push([lon, lat]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
else {
|
|
41
|
+
for (let i = 0; i + 1 < values.length; i += 2) {
|
|
42
|
+
const lat = parseInt(values[i], 10) / 100;
|
|
43
|
+
const lon = -parseInt(values[i + 1], 10) / 100;
|
|
44
|
+
if (Number.isFinite(lat) && Number.isFinite(lon)) {
|
|
45
|
+
coordinates.push([lon, lat]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (coordinates.length > 2) {
|
|
50
|
+
coordinates.push([...coordinates[0]]);
|
|
51
|
+
}
|
|
52
|
+
return coordinates;
|
|
53
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/*
|
|
2
|
+
_ _ _ __ __
|
|
3
|
+
/\ | | | | (_) \ \ / /
|
|
4
|
+
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
+
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
+
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
+
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
+
| |
|
|
9
|
+
|_|
|
|
10
|
+
|
|
11
|
+
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
+
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
+
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
+
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
+
|
|
16
|
+
Internal Package: @atmosx/event-product-parser
|
|
17
|
+
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { TypeEvent } from "../../@types/type.event"
|
|
21
|
+
|
|
22
|
+
export const getRaw = (event: TypeEvent): string => {
|
|
23
|
+
const line = (label: string, value: unknown, condition = true) => condition && value ? `${label} ${value}` : null;
|
|
24
|
+
const isStatement = event.properties.status_metadata.is_statement;
|
|
25
|
+
const isExpired = event.properties.status_metadata.is_expired;
|
|
26
|
+
return [
|
|
27
|
+
line(`Locations:`, event?.properties?.locations?.slice(0, 100)),
|
|
28
|
+
line(`Issued:`, new Date(event.properties.issued).toUTCString(), !isExpired),
|
|
29
|
+
line(`Expires:`, new Date(event.properties.expires).toUTCString(), !isStatement),
|
|
30
|
+
line(`Damage Threat:`, event?.properties?.parameters?.damage_threat, !isExpired),
|
|
31
|
+
line(`Flood Threat:`, event?.properties?.parameters?.flood_threat, !isExpired),
|
|
32
|
+
line(`Tornado Threat:`, event?.properties?.parameters?.tornado_threat, !isExpired),
|
|
33
|
+
line(`Estimated Wind Gusts:`, `${event?.properties?.parameters?.estimated_wind_gusts} ${event?.properties?.parameters?.wind_threat ? ` (${event?.properties?.parameters?.wind_threat})` : ''}`, !isExpired && event?.properties?.parameters?.estimated_wind_gusts != null),
|
|
34
|
+
line(`Estimated Hail Size:`, `${event?.properties?.parameters?.estimated_hail_size} ${event?.properties?.parameters?.hail_threat ? ` (${event?.properties?.parameters?.hail_threat})` : ''}`, !isExpired && event?.properties?.parameters?.estimated_hail_size != null),
|
|
35
|
+
line(`Discussion:`, event?.properties?.discussion_parameters?.discussion_number, !isExpired),
|
|
36
|
+
line(`Concern:`, event?.properties?.discussion_parameters?.discussion_concerning, !isExpired),
|
|
37
|
+
line(`SPC Max Tornado Threat:`, event?.properties?.discussion_parameters?.discussion_max_tornado, !isExpired),
|
|
38
|
+
line(`SPC Max Hail Threat:`, event?.properties?.discussion_parameters?.discussion_max_hail, !isExpired),
|
|
39
|
+
line(`SPC Max Wind Threat:`, event?.properties?.discussion_parameters?.discussion_max_wind, !isExpired),
|
|
40
|
+
line(`SPC Watch Issuance Probability:`, event?.properties?.discussion_parameters?.discussion_watch_issuance ? `${event?.properties?.discussion_parameters?.discussion_watch_issuance}%` : null, !isExpired),
|
|
41
|
+
line(`Watch Number:`, event?.properties?.watch_parameters?.watch_number, !isExpired),
|
|
42
|
+
line(`Strong Tornadoes Probability:`, event?.properties?.watch_parameters?.strong_tornadoes_probability ? `${event?.properties?.watch_parameters?.strong_tornadoes_probability}%` : null, !isExpired),
|
|
43
|
+
line(`Additional Tornadoes Probability:`, event?.properties?.watch_parameters?.additional_tornadoes_probability ? `${event?.properties?.watch_parameters?.additional_tornadoes_probability}%` : null, !isExpired),
|
|
44
|
+
line(`Combined Hail/Wind Probability:`, event?.properties?.watch_parameters?.combined_hail_wind_probability ? `${event?.properties?.watch_parameters?.combined_hail_wind_probability}%` : null, !isExpired),
|
|
45
|
+
line(`Severe Hail Probability:`, event?.properties?.watch_parameters?.severe_hail_probability ? `${event?.properties?.watch_parameters?.severe_hail_probability}%` : null, !isExpired),
|
|
46
|
+
line(`Hail >2in Probability:`, event?.properties?.watch_parameters?.hail_2in_probability ? `${event?.properties?.watch_parameters?.hail_2in_probability}%` : null, !isExpired),
|
|
47
|
+
line(`Max Hail Inches:`, event?.properties?.watch_parameters?.max_hail_in, !isExpired),
|
|
48
|
+
line(`Severe Wind Probability:`, event?.properties?.watch_parameters?.severe_wind_probability ? `${event?.properties?.watch_parameters?.severe_wind_probability}%` : null, !isExpired),
|
|
49
|
+
line(`Max Surface Wind:`, event?.properties?.watch_parameters?.max_wind_surface, !isExpired),
|
|
50
|
+
line(`Max Tops (x100 feet):`, event?.properties?.watch_parameters?.max_tops_x100feet, !isExpired),
|
|
51
|
+
line(`Sender:`, event?.properties?.geocode?.office?.name ? `${event?.properties?.geocode?.office?.name} (${event?.properties?.geocode?.office?.office})` : event?.properties?.geocode?.office?.office),
|
|
52
|
+
line(`Tracking:`, event?.properties?.metadata?.tracking),
|
|
53
|
+
].filter(Boolean).join('\n');
|
|
54
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
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
|
-
interface GetTextFromProductOptions {
|
|
21
|
-
message: string
|
|
22
|
-
find: string[]
|
|
23
|
-
append?: string
|
|
24
|
-
removal?: string[]
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const getTextFromProduct = (options: GetTextFromProductOptions): string => {
|
|
28
|
-
const lines = options.message.split(`\n`);
|
|
29
|
-
for (const line of lines) {
|
|
30
|
-
const matchedFind = options.find.find((find) => line.includes(find));
|
|
31
|
-
if (matchedFind) {
|
|
32
|
-
let result = line.slice(line.indexOf(matchedFind) + matchedFind.length).trim();
|
|
33
|
-
if (options.removal) {
|
|
34
|
-
for (const str of options.removal) {
|
|
35
|
-
result = result.toLowerCase().split(str.toLowerCase()).join('');
|
|
36
|
-
}
|
|
37
|
-
result = result.replace(matchedFind, '').replace('<', '').trim();
|
|
38
|
-
}
|
|
39
|
-
return result.toUpperCase() + (options?.append ?? ``);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return null;
|
|
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
|
+
interface GetTextFromProductOptions {
|
|
21
|
+
message: string
|
|
22
|
+
find: string[]
|
|
23
|
+
append?: string
|
|
24
|
+
removal?: string[]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const getTextFromProduct = (options: GetTextFromProductOptions): string => {
|
|
28
|
+
const lines = options.message.split(`\n`);
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
const matchedFind = options.find.find((find) => line.includes(find));
|
|
31
|
+
if (matchedFind) {
|
|
32
|
+
let result = line.slice(line.indexOf(matchedFind) + matchedFind.length).trim();
|
|
33
|
+
if (options.removal) {
|
|
34
|
+
for (const str of options.removal) {
|
|
35
|
+
result = result.toLowerCase().split(str.toLowerCase()).join('');
|
|
36
|
+
}
|
|
37
|
+
result = result.replace(matchedFind, '').replace('<', '').trim();
|
|
38
|
+
}
|
|
39
|
+
return result.toUpperCase() + (options?.append ?? ``);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
43
|
}
|
|
@@ -1,61 +1,61 @@
|
|
|
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
|
-
interface GetXMLOptions {
|
|
21
|
-
message: string
|
|
22
|
-
targets: string[]
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const getXML = (options: GetXMLOptions): Record<string, string> => {
|
|
26
|
-
const extracted: Record<string, any> = {};
|
|
27
|
-
const findValueByKey = (obj: any, searchKey: string) => {
|
|
28
|
-
const results = [];
|
|
29
|
-
if (obj === null || typeof obj !== 'object') {
|
|
30
|
-
return results;
|
|
31
|
-
}
|
|
32
|
-
const searchKeyLower = searchKey.toLowerCase();
|
|
33
|
-
for (const key in obj) {
|
|
34
|
-
if (obj.hasOwnProperty(key) && key.toLowerCase() === searchKeyLower) {
|
|
35
|
-
results.push(obj[key]);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
if (Array.isArray(obj)) {
|
|
39
|
-
for (const item of obj) {
|
|
40
|
-
if (item.valueName && item.valueName.toLowerCase() === searchKeyLower && item.value !== undefined) {
|
|
41
|
-
results.push(item.value);
|
|
42
|
-
}
|
|
43
|
-
const nestedResults = findValueByKey(item, searchKey);
|
|
44
|
-
results.push(...nestedResults);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
for (const key in obj) {
|
|
48
|
-
if (obj.hasOwnProperty(key)) {
|
|
49
|
-
const nestedResults = findValueByKey(obj[key], searchKey);
|
|
50
|
-
results.push(...nestedResults);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return results;
|
|
54
|
-
};
|
|
55
|
-
for (const key of options.targets) {
|
|
56
|
-
const values = findValueByKey(options.message, key);
|
|
57
|
-
const uniqueValues = [...new Set(values)];
|
|
58
|
-
extracted[key] = uniqueValues.length === 0 ? null : (uniqueValues.length === 1 ? uniqueValues[0] : uniqueValues);
|
|
59
|
-
}
|
|
60
|
-
return extracted;
|
|
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
|
+
interface GetXMLOptions {
|
|
21
|
+
message: string
|
|
22
|
+
targets: string[]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const getXML = (options: GetXMLOptions): Record<string, string> => {
|
|
26
|
+
const extracted: Record<string, any> = {};
|
|
27
|
+
const findValueByKey = (obj: any, searchKey: string) => {
|
|
28
|
+
const results = [];
|
|
29
|
+
if (obj === null || typeof obj !== 'object') {
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
32
|
+
const searchKeyLower = searchKey.toLowerCase();
|
|
33
|
+
for (const key in obj) {
|
|
34
|
+
if (obj.hasOwnProperty(key) && key.toLowerCase() === searchKeyLower) {
|
|
35
|
+
results.push(obj[key]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (Array.isArray(obj)) {
|
|
39
|
+
for (const item of obj) {
|
|
40
|
+
if (item.valueName && item.valueName.toLowerCase() === searchKeyLower && item.value !== undefined) {
|
|
41
|
+
results.push(item.value);
|
|
42
|
+
}
|
|
43
|
+
const nestedResults = findValueByKey(item, searchKey);
|
|
44
|
+
results.push(...nestedResults);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const key in obj) {
|
|
48
|
+
if (obj.hasOwnProperty(key)) {
|
|
49
|
+
const nestedResults = findValueByKey(obj[key], searchKey);
|
|
50
|
+
results.push(...nestedResults);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return results;
|
|
54
|
+
};
|
|
55
|
+
for (const key of options.targets) {
|
|
56
|
+
const values = findValueByKey(options.message, key);
|
|
57
|
+
const uniqueValues = [...new Set(values)];
|
|
58
|
+
extracted[key] = uniqueValues.length === 0 ? null : (uniqueValues.length === 1 ? uniqueValues[0] : uniqueValues);
|
|
59
|
+
}
|
|
60
|
+
return extracted;
|
|
61
61
|
}
|