v3.3.0-metars #14

Merged
voidf1sh merged 16 commits from v3.3.0-metars into main 2024-09-24 01:04:49 +00:00
4 changed files with 104 additions and 12 deletions
Showing only changes of commit 444bad7935 - Show all commits

File diff suppressed because one or more lines are too long

24
dot-commands/datis.js Normal file
View File

@ -0,0 +1,24 @@
const fn = require('../functions');
module.exports = {
name: 'datis',
description: 'Lookup dATIS for an airport',
usage: 'ICAO.datis',
alias: [ 'atis' ],
async execute(message, commandData) {
try {
const icaoId = commandData.args;
if (icaoId.length !== 4) throw new Error('Not enough or too many ICAO IDs!')
const datisData = await fn.avWx.datis.getData(icaoId);
const messagePayload = fn.avWx.datis.parseData(datisData[0]);
message.reply(messagePayload);
} catch (e) {
try {
message.reply(`Something went wrong while retrieving the METAR: ${e.name}\n\n${e.message}`);
console.error(e);
} catch (e) {
console.error(e);
}
}
}
}

View File

@ -14,6 +14,7 @@ const ownerId = process.env.ownerId;
// filesystem
const fs = require('fs');
const zlib = require('zlib');
// Discord.js
const Discord = require('discord.js');
@ -25,6 +26,9 @@ const FuzzySearch = require('fuzzy-search');
// const OpenAI = require("openai");
// const openai = new OpenAI();
// Axios for APIs
const axios = require('axios');
// Various imports from other files
const config = require('./config.json');
const strings = require('./strings.json');
@ -34,7 +38,6 @@ const dotCommandFiles = fs.readdirSync('./dot-commands/').filter(file => file.en
// MySQL database connection
const mysql = require('mysql');
const { GifData, PastaData } = require('./CustomModules/NodBot');
const axios = require('axios');
const db = new mysql.createPool({
connectionLimit: 10,
host: dbHost,
@ -401,18 +404,32 @@ const functions = {
});
const embed = new Discord.MessageEmbed()
.setAuthor({ name: `${metarData.name} [${metarData.icaoId}] METAR`, iconURL: "https://aviationweather.gov/img/icons/awc-logo-180.png"})
.setImage("https://media.discordapp.net/stickers/1175134632845516821.webp")
// .setImage("https://media.discordapp.net/stickers/1175134632845516821.webp")
.setDescription(`**Not for real world use!**\n\n${metarData.rawOb}`)
.setFooter({ text: "METAR by AviationWeather.gov for CumbHub LLC" })
.addFields(
{ name: 'Observation Time', value: `${metarData.reportTime}Z` },
{ name: 'Temperature', value: `${metarData.temp}ºC/${metarData.dewp}ºC`},
{ name: 'Winds', value: `${metarData.wdir}º@${metarData.wspd}${wgst} kts`},
{ name: 'Winds', value: `${metarData.wdir.toString().padStart(3, '0')}º@${metarData.wspd}${wgst} kts`},
{ name: 'Visibility', value: `${metarData.visib} SM` },
{ name: 'Clouds', value: clouds.join('\n') },
{ name: 'Altimeter', value: `${altim} inHg` }
)
return { embeds: [embed] };
},
datis(datisData) {
const messageEmbed = new Discord.MessageEmbed()
.setAuthor({ name: `${datisData.airport} Digital ATIS` })
// .setImage('https://media.discordapp.net/stickers/1175134632845516821.webp')
.setDescription(`**Do not use for real world flight planning or navigation.**\n\n${datisData.datis}`)
.addFields(
{ name: 'Information', value: `${datisData.code}` },
{ name: 'Retreival Time', value: `${new Date().toISOString()}` }
)
.setFooter({ text: 'D-ATIS by Clowd.io for CumbHub LLC' })
const messagePayload = { embeds: [ messageEmbed ] };
return messagePayload;
}
}
},
@ -760,13 +777,42 @@ const functions = {
},
metar: {
async getAllICAOs() {
const reqUrl = `https://aviationweather.gov/api/data/metar?format=json`
const response = await axios.get(reqUrl);
let icaoArray = [];
response.data.forEach(e => {
icaoArray.push(e.icaoId)
});
return icaoArray;
const reqUrl = `https://aviationweather.gov/data/cache/stations.cache.json.gz`
try {
// Step 1: Download the GZipped file
const response = await axios({
url: reqUrl,
method: 'GET',
responseType: 'arraybuffer', // Ensure we get the raw binary data
headers: {
'Accept-Encoding': 'gzip' // Ensure the server sends gzipped content
}
});
// Step 2: Decompress the GZipped content
const buffer = Buffer.from(response.data);
zlib.gunzip(buffer, (err, decompressedBuffer) => {
if (err) {
console.error('An error occurred during decompression:', err);
return;
}
// Step 3: Parse the decompressed JSON
const jsonString = decompressedBuffer.toString('utf-8');
try {
const jsonData = JSON.parse(jsonString);
// console.log('Parsed JSON data:', jsonData);
jsonData.forEach(airport => {
config.icaoIds.push(airport.icaoId);
});
// console.log(`ICAO IDs: ${config.icaoIds.length}\n\n${config.icaoIds}`)
} catch (jsonError) {
console.error('An error occurred while parsing JSON:', jsonError);
}
});
} catch (error) {
console.error('An error occurred during the HTTP request:', error);
}
},
async getData(icaoList) {
const reqUrl = `https://aviationweather.gov/api/data/metar?ids=${icaoList}&format=json`;
@ -780,6 +826,27 @@ const functions = {
})
return messages;
}
},
datis: {
async getAllICAOs() {
const reqUrl = 'https://datis.clowd.io/api/stations';
const response = await axios.get(reqUrl);
response.forEach(icaoId => {
config.datisICAOs.push(icaoId);
});
},
validate(icaoId) {
return config.datisICAOs.includes(icaoId);
},
async getData(icaoId) {
const reqUrl = `https://datis.clowd.io/api/${icaoId}`;
const response = await axios.get(reqUrl);
if (response.error !== undefined) throw new Error('The D-ATIS API returned an error:\n' + response.error);
return response.data;
},
parseData(datisData) {
return functions.embeds.avWx.datis(datisData);
}
}
},
generateErrorId() {

View File

@ -42,7 +42,7 @@ client.once('ready', async () => {
await fn.download.strains(client);
await fn.download.medicalAdvice(client);
console.log('Ready!');
// const icaoArray = await fn.avWx.metar.getAllICAOs();
await fn.avWx.metar.getAllICAOs();
// console.log(JSON.stringify(icaoArray));
client.channels.fetch(statusChannelId).then(channel => {
channel.send(`${new Date().toISOString()} -- <@${process.env.ownerId}>\nStartup Sequence Complete`);