| 
					
					
						
							
						
					
					
				 | 
				@ -11,7 +11,10 @@ const TABLE_CONFIG = { | 
			
		
		
	
		
			
				 | 
				 | 
				  // },
 | 
				 | 
				 | 
				  // },
 | 
			
		
		
	
		
			
				 | 
				 | 
				  border: getBorderCharacters(`ramac`) | 
				 | 
				 | 
				  border: getBorderCharacters(`ramac`) | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				const CREDIT_MSG = "Powered by Dark Sky: https://darksky.net/poweredby/" | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				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" | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				// https://medium.com/@osiolabs/read-write-json-files-with-node-js-92d03cc82824
 | 
				 | 
				 | 
				// https://medium.com/@osiolabs/read-write-json-files-with-node-js-92d03cc82824
 | 
			
		
		
	
		
			
				 | 
				 | 
				const jsonReader = (filePath, cb) => { | 
				 | 
				 | 
				const jsonReader = (filePath, cb) => { | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -28,6 +31,8 @@ const jsonReader = (filePath, cb) => { | 
			
		
		
	
		
			
				 | 
				 | 
				  }) | 
				 | 
				 | 
				  }) | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				const round5 = x => { return Math.ceil(x / 5) * 5 } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				const logWeatherJson = (jsonFile, loc) => {  | 
				 | 
				 | 
				const logWeatherJson = (jsonFile, loc) => {  | 
			
		
		
	
		
			
				 | 
				 | 
				  return new Promise((resolve, reject) => {  | 
				 | 
				 | 
				  return new Promise((resolve, reject) => {  | 
			
		
		
	
		
			
				 | 
				 | 
				    jsonReader(jsonFile, (err, weatherInfo) => { | 
				 | 
				 | 
				    jsonReader(jsonFile, (err, weatherInfo) => { | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -37,34 +42,44 @@ const logWeatherJson = (jsonFile, loc) => { | 
			
		
		
	
		
			
				 | 
				 | 
				       | 
				 | 
				 | 
				       | 
			
		
		
	
		
			
				 | 
				 | 
				      log(loc) | 
				 | 
				 | 
				      log(loc) | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				      weatherInfo['hourly']['data'][0] = weatherInfo['currently'] | 
			
		
		
	
		
			
				 | 
				 | 
				      if (argv.v) { | 
				 | 
				 | 
				      if (argv.v) { | 
			
		
		
	
		
			
				 | 
				 | 
				        const infoList = [['H', '°C', '%P']] | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        const infoList = [['H', '°C', 'R','%P']] | 
			
		
		
	
		
			
				 | 
				 | 
				        for (let i = 0; i < 12; i++) { | 
				 | 
				 | 
				        for (let i = 0; i < 12; i++) { | 
			
		
		
	
		
			
				 | 
				 | 
				          const hourInfo = weatherInfo['hourly']['data'][i] | 
				 | 
				 | 
				          const hourInfo = weatherInfo['hourly']['data'][i] | 
			
		
		
	
		
			
				 | 
				 | 
				          const date = new Date(hourInfo['time'] * 1000) | 
				 | 
				 | 
				          const date = new Date(hourInfo['time'] * 1000) | 
			
		
		
	
		
			
				 | 
				 | 
				          infoList.push([date.getHours(), | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				          const precipProbability = round5(hourInfo['precipProbability'] * 100) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				          const precipText = ((precipProbability < HIDE_PRECIP_LESS_THAN) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            ? '' : precipProbability) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				          infoList.push([ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            date.getHours(), | 
			
		
		
	
		
			
				 | 
				 | 
				            Math.floor(hourInfo['apparentTemperature']), | 
				 | 
				 | 
				            Math.floor(hourInfo['apparentTemperature']), | 
			
		
		
	
		
			
				 | 
				 | 
				            Math.floor(hourInfo['precipProbability'])]) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            ((hourInfo['summary'].includes('Rain')) ? 'Y' : ''), | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            precipText, | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				          ]) | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				        log(table(infoList, TABLE_CONFIG)); | 
				 | 
				 | 
				        log(table(infoList, TABLE_CONFIG)); | 
			
		
		
	
		
			
				 | 
				 | 
				      } else { | 
				 | 
				 | 
				      } else { | 
			
		
		
	
		
			
				 | 
				 | 
				        // horizontal
 | 
				 | 
				 | 
				        // horizontal
 | 
			
		
		
	
		
			
				 | 
				 | 
				        const hoursList = ['H'] | 
				 | 
				 | 
				        const hoursList = ['H'] | 
			
		
		
	
		
			
				 | 
				 | 
				        const tempsList = ['°C'] | 
				 | 
				 | 
				        const tempsList = ['°C'] | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        const rainList = ['R'] | 
			
		
		
	
		
			
				 | 
				 | 
				        const precipList = ['%P'] | 
				 | 
				 | 
				        const precipList = ['%P'] | 
			
		
		
	
		
			
				 | 
				 | 
				        for (let i = 0; i < 16; i += 2) { | 
				 | 
				 | 
				        for (let i = 0; i < 16; i += 2) { | 
			
		
		
	
		
			
				 | 
				 | 
				          const hourInfo = weatherInfo['hourly']['data'][i] | 
				 | 
				 | 
				          const hourInfo = weatherInfo['hourly']['data'][i] | 
			
		
		
	
		
			
				 | 
				 | 
				          const date = new Date(hourInfo['time'] * 1000) | 
				 | 
				 | 
				          const date = new Date(hourInfo['time'] * 1000) | 
			
		
		
	
		
			
				 | 
				 | 
				          hoursList.push(date.getHours()) | 
				 | 
				 | 
				          hoursList.push(date.getHours()) | 
			
		
		
	
		
			
				 | 
				 | 
				          tempsList.push(Math.floor(hourInfo['apparentTemperature'])) | 
				 | 
				 | 
				          tempsList.push(Math.floor(hourInfo['apparentTemperature'])) | 
			
		
		
	
		
			
				 | 
				 | 
				          const precipProbability = Math.floor(hourInfo['precipProbability']) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				          precipList.push((precipProbability < 20) ? '' : precipProbability) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				          rainList.push((hourInfo['summary'].includes('Rain')) ? 'Y' : '') | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				          const precipProbability = round5(hourInfo['precipProbability'] * 100) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				          precipList.push((precipProbability < HIDE_PRECIP_LESS_THAN) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            ? '' : precipProbability) | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				        const maxTempIndex = tempsList.indexOf(Math.max(...tempsList.slice(1))) | 
				 | 
				 | 
				        const maxTempIndex = tempsList.indexOf(Math.max(...tempsList.slice(1))) | 
			
		
		
	
		
			
				 | 
				 | 
				        const minTempIndex = tempsList.indexOf(Math.min(...tempsList.slice(1))) | 
				 | 
				 | 
				        const minTempIndex = tempsList.indexOf(Math.min(...tempsList.slice(1))) | 
			
		
		
	
		
			
				 | 
				 | 
				        tempsList[maxTempIndex] = `${tempsList[maxTempIndex]}+` | 
				 | 
				 | 
				        tempsList[maxTempIndex] = `${tempsList[maxTempIndex]}+` | 
			
		
		
	
		
			
				 | 
				 | 
				        tempsList[minTempIndex] = `${tempsList[minTempIndex]}-` | 
				 | 
				 | 
				        tempsList[minTempIndex] = `${tempsList[minTempIndex]}-` | 
			
		
		
	
		
			
				 | 
				 | 
				        log(table([hoursList, tempsList, precipList], TABLE_CONFIG)); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        log(table([hoursList, tempsList, rainList, precipList], TABLE_CONFIG)); | 
			
		
		
	
		
			
				 | 
				 | 
				      } | 
				 | 
				 | 
				      } | 
			
		
		
	
		
			
				 | 
				 | 
				      resolve() | 
				 | 
				 | 
				      resolve() | 
			
		
		
	
		
			
				 | 
				 | 
				    }) | 
				 | 
				 | 
				    }) | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -72,14 +87,9 @@ const logWeatherJson = (jsonFile, loc) => { | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				const formatTimeUnit = unit => { return ((unit < 10) ? '0' : '') + unit } | 
				 | 
				 | 
				const formatTimeUnit = unit => { return ((unit < 10) ? '0' : '') + unit } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				log(CREDIT_MSG)  | 
			
		
		
	
		
			
				 | 
				 | 
				logTablePromises = [ | 
				 | 
				 | 
				logTablePromises = [ | 
			
		
		
	
		
			
				 | 
				 | 
				  logWeatherJson('./toronto.json', 'Toronto'), | 
				 | 
				 | 
				  logWeatherJson('./toronto.json', 'Toronto'), | 
			
		
		
	
		
			
				 | 
				 | 
				  logWeatherJson('./markham.json', 'Markham'),  | 
				 | 
				 | 
				  logWeatherJson('./markham.json', 'Markham'),  | 
			
		
		
	
		
			
				 | 
				 | 
				] | 
				 | 
				 | 
				] | 
			
		
		
	
		
			
				 | 
				 | 
				Promise.all(logTablePromises).then(results => {  | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				  // const now = new Date()
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				  // const lastUpdatedTime = `${formatTimeUnit(now.getHours())}:${formatTimeUnit(now.getMinutes())}`
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				  // log(`${CREDIT_MSG}\n\nLast updated: ${lastUpdatedTime}`)
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				  log(CREDIT_MSG) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				}) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				Promise.all(logTablePromises).then(results => {}) |