const log = console.log const fs = require('fs') const {table, getBorderCharacters} = require('table') // const argv = require('yargs').argv const TABLE_CONFIG = { // columns: { // 0: { alignment: 'center' }, // 1: { alignment: 'center' }, // 2: { alignment: 'center' }, // }, border: getBorderCharacters(`ramac`) } const HIDE_PRECIP_LESS_THAN = 10 // const CREDIT_MSG = "Powered by Dark Sky: https://darksky.net/poweredby/" // const CREDIT_MSG = "https://darksky.net/poweredby • https://smol.gq/wthr-src\n" const CREDIT_MSG = "darksky.net/poweredby • smol.gq/wthr-src\n\n" // https://medium.com/@osiolabs/read-write-json-files-with-node-js-92d03cc82824 const jsonReader = (filePath, cb) => { fs.readFile(filePath, (err, fileData) => { if (err) { log(err) return cb && cb(err) } try { const object = JSON.parse(fileData) // log(filePath, object['latitude']) return cb && cb(null, object) } catch(err) { log(err) return cb && cb(err) } }) } const round5 = x => { return Math.ceil(x / 5) * 5 } const updateTempHigh = (temp, index, tempHigh) => { // +1 to offset header return (temp > tempHigh[0]) ? [temp, index + 1] : tempHigh } const updateTempLow = (temp, index, tempLow) => { return (temp < tempLow[0]) ? [temp, index + 1] : tempLow } const getWeatherTable = (jsonFile, loc, orientation) => { return new Promise((resolve, reject) => { jsonReader(jsonFile, (err, weatherInfo) => { if (err) { reject(err) } let output = loc + '\n' // value, index let tempHigh = [-100, -1] let tempLow = [100, -1] weatherInfo['hourly']['data'][0] = weatherInfo['currently'] if (orientation == 'v') { const infoList = [['H', '°C', 'R','%P']] for (let i = 0; i < 12; i++) { const hourInfo = weatherInfo['hourly']['data'][i] const date = new Date(hourInfo['time'] * 1000) const temp = Math.floor(hourInfo['apparentTemperature']) tempHigh = updateTempHigh(temp, i, tempHigh) tempLow = updateTempLow(temp, i, tempHigh) const precipProbability = round5(hourInfo['precipProbability'] * 100) const precipText = ((precipProbability < HIDE_PRECIP_LESS_THAN) ? '' : precipProbability) infoList.push([ date.getHours(), temp, ((hourInfo['summary'].includes('Rain')) ? 'Y' : ''), precipText, ]) } infoList[tempHigh[1]][1] = `${infoList[tempHigh[1]][1]}+` infoList[tempLow[1]][1] = `${infoList[tempLow[1]][1]}-` output += table(infoList, TABLE_CONFIG) } else { // horizontal const hoursList = ['H'] const tempsList = ['°C'] const rainList = ['R'] const precipList = ['%P'] for (let i = 0; i < 16; i += 2) { const hourInfo = weatherInfo['hourly']['data'][i] const date = new Date(hourInfo['time'] * 1000) const temp = Math.floor(hourInfo['apparentTemperature']) tempHigh = updateTempHigh(temp, i/2, tempHigh) tempLow = updateTempLow(temp, i/2, tempHigh) hoursList.push(date.getHours()) tempsList.push(temp) rainList.push((hourInfo['summary'].includes('Rain')) ? 'Y' : '') const precipProbability = round5(hourInfo['precipProbability'] * 100) precipList.push((precipProbability < HIDE_PRECIP_LESS_THAN) ? '' : precipProbability) } tempsList[tempHigh[1]] = `${tempsList[tempHigh[1]]}+` tempsList[tempLow[1]] = `${tempsList[tempLow[1]]}-` output += table([hoursList, tempsList, rainList, precipList], TABLE_CONFIG) } resolve(output) }) }) } const formatTimeUnit = unit => { return ((unit < 10) ? '0' : '') + unit } const getTablePromises = [ getWeatherTable('./markham.json', 'Markham', 'h'), getWeatherTable('./markham.json', 'Markham', 'v'), getWeatherTable('./toronto.json', 'Toronto', 'h'), getWeatherTable('./toronto.json', 'Toronto', 'v'), ] Promise.all(getTablePromises).then(tables => { const mText = tables[0] const mvText = tables[1] const tText = tables[2] const tvText = tables[3] const writeErrorHandler = error => { if (error) { throw error } } fs.writeFile('mt.txt', CREDIT_MSG + mText + '\n' + tText, writeErrorHandler) fs.writeFile('mtv.txt', CREDIT_MSG + mvText + '\n' + tvText, writeErrorHandler) fs.writeFile('m.txt', CREDIT_MSG + mText, writeErrorHandler) fs.writeFile('mv.txt', CREDIT_MSG + mvText, writeErrorHandler) fs.writeFile('t.txt', CREDIT_MSG + tText, writeErrorHandler) fs.writeFile('tv.txt', CREDIT_MSG + tvText, writeErrorHandler) })