ws4kp/server/scripts/modules/icons.js

336 lines
8.4 KiB
JavaScript
Raw Normal View History

/* spell-checker: disable */
2020-09-04 18:02:20 +00:00
// eslint-disable-next-line no-unused-vars
const icons = (() => {
2020-10-29 21:44:28 +00:00
const getWeatherRegionalIconFromIconLink = (link, _isNightTime) => {
// extract day or night if not provided
2020-10-29 21:44:28 +00:00
const isNightTime = _isNightTime ?? link.indexOf('/night/') >= 0;
// internal function to add path to returned icon
const addPath = (icon) => `images/r/${icon}`;
2020-09-04 18:02:20 +00:00
// grab everything after the last slash ending at any of these: ?&,
const afterLastSlash = link.toLowerCase().match(/[^/]+$/)[0];
let conditionName = afterLastSlash.match(/(.*?)[,?&.]/)[1];
2021-01-04 17:58:58 +00:00
// using probability as a crude heavy/light indication where possible
const value = +(link.match(/,(\d{2,3})/) ?? [0, 100])[1];
2020-09-04 18:02:20 +00:00
// if a 'DualImage' is captured, adjust to just the j parameter
if (conditionName === 'dualimage') {
const match = link.match(/&j=(.*)&/);
2020-10-29 21:44:28 +00:00
[, conditionName] = match;
2020-09-04 18:02:20 +00:00
}
// find the icon
2020-10-29 21:44:28 +00:00
switch (conditionName + (isNightTime ? '-n' : '')) {
2020-09-04 18:02:20 +00:00
case 'skc':
case 'hot':
case 'haze':
return addPath('Sunny.gif');
case 'skc-n':
case 'nskc':
case 'nskc-n':
2022-11-14 19:53:57 +00:00
case 'cold-n':
2020-09-04 18:02:20 +00:00
return addPath('Clear-1992.gif');
case 'bkn':
return addPath('Mostly-Cloudy-1994-2.gif');
case 'bkn-n':
case 'few-n':
case 'nfew-n':
case 'nfew':
return addPath('Partly-Clear-1994-2.gif');
case 'sct':
case 'few':
return addPath('Partly-Cloudy.gif');
case 'sct-n':
case 'nsct':
case 'nsct-n':
return addPath('Mostly-Clear.gif');
case 'ovc':
2020-09-09 01:07:09 +00:00
case 'ovc-n':
2020-09-04 18:02:20 +00:00
return addPath('Cloudy.gif');
case 'fog':
case 'fog-n':
2020-09-04 18:02:20 +00:00
return addPath('Fog.gif');
case 'rain_sleet':
return addPath('Sleet.gif');
case 'rain_showers':
case 'rain_showers_high':
return addPath('Scattered-Showers-1994-2.gif');
case 'rain_showers-n':
case 'rain_showers_high-n':
return addPath('Scattered-Showers-Night-1994-2.gif');
case 'rain':
2020-10-21 01:04:51 +00:00
case 'rain-n':
2020-09-04 18:02:20 +00:00
return addPath('Rain-1992.gif');
// case 'snow':
// return addPath('Light-Snow.gif');
// break;
// case 'cc_snowshowers.gif':
// //case "heavy-snow.gif":
// return addPath('AM-Snow-1994.gif');
// break;
case 'snow':
2020-12-29 15:58:01 +00:00
case 'snow-n':
2021-01-04 17:58:58 +00:00
if (value > 50) return addPath('Heavy-Snow-1994-2.gif');
return addPath('Light-Snow.gif');
2020-09-04 18:02:20 +00:00
case 'rain_snow':
return addPath('Rain-Snow-1992.gif');
case 'snow_fzra':
2020-12-29 15:58:01 +00:00
case 'snow_fzra-n':
2020-09-04 18:02:20 +00:00
return addPath('Freezing-Rain-Snow-1992.gif');
case 'fzra':
2020-12-29 15:58:01 +00:00
case 'fzra-n':
2020-09-04 18:02:20 +00:00
return addPath('Freezing-Rain-1992.gif');
case 'snow_sleet':
2020-12-29 15:58:01 +00:00
case 'snow_sleet-n':
return addPath('Snow and Sleet.gif');
case 'sleet':
case 'sleet-n':
return addPath('Sleet.gif');
2020-09-04 18:02:20 +00:00
case 'tsra_sct':
case 'tsra':
return addPath('Scattered-Tstorms-1994-2.gif');
case 'tsra_sct-n':
case 'tsra-n':
return addPath('Scattered-Tstorms-Night-1994-2.gif');
case 'tsra_hi':
case 'tsra_hi-n':
case 'hurricane':
2020-10-29 02:29:58 +00:00
case 'tropical_storm':
2020-09-04 18:02:20 +00:00
return addPath('Thunderstorm.gif');
case 'wind_few':
case 'wind_sct':
case 'wind_bkn':
case 'wind_ovc':
return addPath('Wind.gif');
case 'wind_skc':
return addPath('Sunny-Wind-1994.gif');
case 'wind_skc-n':
2021-05-01 18:21:14 +00:00
case 'wind_sct-n':
2020-09-04 18:02:20 +00:00
return addPath('Clear-Wind-1994.gif');
case 'blizzard':
return addPath('Blowing Snow.gif');
2022-11-14 19:53:57 +00:00
case 'cold':
return addPath('cold.gif');
2020-09-04 18:02:20 +00:00
default:
console.log(`Unable to locate regional icon for ${conditionName} ${link} ${isNightTime}`);
2020-09-04 18:02:20 +00:00
return false;
}
};
2020-10-29 21:44:28 +00:00
const getWeatherIconFromIconLink = (link, _isNightTime) => {
2022-11-14 19:53:57 +00:00
if (!link) return false;
2022-07-29 21:12:42 +00:00
// internal function to add path to returned icon
const addPath = (icon) => `images/${icon}`;
// extract day or night if not provided
2020-10-29 21:44:28 +00:00
const isNightTime = _isNightTime ?? link.indexOf('/night/') >= 0;
// grab everything after the last slash ending at any of these: ?&,
2020-09-04 18:02:20 +00:00
const afterLastSlash = link.toLowerCase().match(/[^/]+$/)[0];
let conditionName = afterLastSlash.match(/(.*?)[,?&.]/)[1];
2021-01-04 17:58:58 +00:00
// using probability as a crude heavy/light indication where possible
const value = +(link.match(/,(\d{2,3})/) ?? [0, 100])[1];
2020-09-04 18:02:20 +00:00
// if a 'DualImage' is captured, adjust to just the j parameter
if (conditionName === 'dualimage') {
const match = link.match(/&j=(.*)&/);
2020-10-29 21:44:28 +00:00
[, conditionName] = match;
2020-09-04 18:02:20 +00:00
}
// find the icon
2020-10-29 21:44:28 +00:00
switch (conditionName + (isNightTime ? '-n' : '')) {
2020-09-04 18:02:20 +00:00
case 'skc':
case 'hot':
case 'haze':
2022-11-14 19:53:57 +00:00
case 'cold':
return addPath('CC_Clear1.gif');
2020-09-04 18:02:20 +00:00
case 'skc-n':
case 'nskc':
case 'nskc-n':
2022-11-14 19:53:57 +00:00
case 'cold-n':
return addPath('CC_Clear0.gif');
2020-09-04 18:02:20 +00:00
case 'sct':
case 'few':
case 'bkn':
return addPath('CC_PartlyCloudy1.gif');
2020-09-04 18:02:20 +00:00
case 'bkn-n':
case 'few-n':
case 'nfew-n':
case 'nfew':
case 'sct-n':
case 'nsct':
case 'nsct-n':
return addPath('CC_PartlyCloudy0.gif');
2020-09-04 18:02:20 +00:00
case 'ovc':
case 'novc':
case 'ovc-n':
return addPath('CC_Cloudy.gif');
2020-09-04 18:02:20 +00:00
case 'fog':
2020-11-25 16:47:00 +00:00
case 'fog-n':
return addPath('CC_Fog.gif');
2020-09-04 18:02:20 +00:00
case 'rain_sleet':
2020-09-04 18:02:20 +00:00
return addPath('Sleet.gif');
case 'rain_showers':
case 'rain_showers_high':
return addPath('CC_Showers.gif');
2020-09-04 18:02:20 +00:00
case 'rain_showers-n':
case 'rain_showers_high-n':
return addPath('CC_Showers.gif');
2020-09-04 18:02:20 +00:00
case 'rain':
2020-12-10 03:55:48 +00:00
case 'rain-n':
return addPath('CC_Rain.gif');
2020-09-04 18:02:20 +00:00
// case 'snow':
// return addPath('Light-Snow.gif');
// break;
2020-09-04 18:02:20 +00:00
// case 'cc_snowshowers.gif':
// //case "heavy-snow.gif":
// return addPath('AM-Snow-1994.gif');
// break;
2020-09-04 18:02:20 +00:00
case 'snow':
2020-11-25 16:47:00 +00:00
case 'snow-n':
2021-01-04 17:58:58 +00:00
if (value > 50) return addPath('CC_Snow.gif');
return addPath('CC_SnowShowers.gif');
2020-09-04 18:02:20 +00:00
case 'rain_snow':
return addPath('CC_RainSnow.gif');
2020-09-04 18:02:20 +00:00
case 'snow_fzra':
2020-12-29 15:58:01 +00:00
case 'snow_fzra-n':
case 'fzra':
2020-12-29 15:58:01 +00:00
case 'fzra-n':
return addPath('CC_FreezingRain.gif');
2020-09-04 18:02:20 +00:00
case 'snow_sleet':
return addPath('Snow-Sleet.gif');
2020-09-04 18:02:20 +00:00
case 'tsra_sct':
case 'tsra':
return addPath('EF_ScatTstorms.gif');
2020-09-04 18:02:20 +00:00
case 'tsra_sct-n':
case 'tsra-n':
return addPath('CC_TStorm.gif');
2020-09-04 18:02:20 +00:00
case 'tsra_hi':
case 'tsra_hi-n':
case 'hurricane':
2020-10-29 02:29:58 +00:00
case 'tropical_storm':
2020-09-09 19:29:03 +00:00
return addPath('CC_TStorm.gif');
2020-09-04 18:02:20 +00:00
case 'wind_few':
case 'wind_sct':
case 'wind_bkn':
case 'wind_ovc':
return addPath('CC_Windy.gif');
2020-09-04 18:02:20 +00:00
case 'wind_skc':
case 'wind_skc-n':
2021-05-01 18:21:14 +00:00
case 'wind_sct-n':
return addPath('CC_Windy.gif');
2020-09-04 18:02:20 +00:00
case 'blizzard':
2020-09-04 18:02:20 +00:00
return addPath('Blowing-Snow.gif');
default:
console.log(`Unable to locate icon for ${conditionName} ${link} ${isNightTime}`);
2020-09-04 18:02:20 +00:00
return false;
}
};
const getHourlyIcon = (skyCover, weather, iceAccumulation, probabilityOfPrecipitation, snowfallAmount, windSpeed, isNight = false) => {
2020-10-20 21:37:11 +00:00
// internal function to add path to returned icon
const addPath = (icon) => `images/r/${icon}`;
2020-10-29 02:29:58 +00:00
// possible phenomenon
let thunder = false;
let snow = false;
let ice = false;
2020-10-29 21:44:28 +00:00
let fog = false;
2020-10-29 02:29:58 +00:00
let wind = false;
// test the phenomenon for various value if it is provided.
2020-10-29 21:44:28 +00:00
weather.forEach((phenomenon) => {
2020-10-29 02:29:58 +00:00
if (!phenomenon.weather) return;
if (phenomenon.weather.toLowerCase().includes('thunder')) thunder = true;
if (phenomenon.weather.toLowerCase().includes('snow')) snow = true;
if (phenomenon.weather.toLowerCase().includes('ice')) ice = true;
if (phenomenon.weather.toLowerCase().includes('fog')) fog = true;
if (phenomenon.weather.toLowerCase().includes('wind')) wind = true;
});
2020-10-20 21:37:11 +00:00
// first item in list is highest priority, units are metric where applicable
2020-10-29 02:29:58 +00:00
if (iceAccumulation > 0 || ice) return addPath('Freezing-Rain-1992.gif');
2020-10-20 21:37:11 +00:00
if (snowfallAmount > 10) {
2020-10-29 02:29:58 +00:00
if (windSpeed > 30 || wind) return addPath('Blowing Snow.gif');
2020-10-20 21:37:11 +00:00
return addPath('Heavy-Snow-1994.gif');
}
2020-10-29 02:29:58 +00:00
if ((snowfallAmount > 0 || snow) && thunder) return addPath('ThunderSnow.gif');
if (snowfallAmount > 0 || snow) return addPath('Light-Snow.gif');
2020-10-29 21:44:28 +00:00
if (thunder) return (addPath('Thunderstorm.gif'));
2020-10-20 21:37:11 +00:00
if (probabilityOfPrecipitation > 70) return addPath('Rain-1992.gif');
if (probabilityOfPrecipitation > 50) return addPath('Shower.gif');
if (probabilityOfPrecipitation > 30) {
if (!isNight) return addPath('Scattered-Showers-1994.gif');
return addPath('Scattered-Showers-Night.gif');
}
2020-10-29 02:29:58 +00:00
if (fog) return addPath('Fog.gif');
2020-10-20 21:37:11 +00:00
if (skyCover > 70) return addPath('Cloudy.gif');
if (skyCover > 50) {
if (!isNight) return addPath('Mostly-Cloudy-1994.gif');
return addPath('Partly-Clear-1994.gif');
}
if (skyCover > 30) {
if (!isNight) return addPath('Partly-Cloudy.gif');
return addPath('Mostly-Clear.gif');
}
if (isNight) return addPath('Clear-1992.gif');
return addPath('Sunny.gif');
};
2020-09-04 18:02:20 +00:00
return {
getWeatherIconFromIconLink,
getWeatherRegionalIconFromIconLink,
2020-10-20 21:37:11 +00:00
getHourlyIcon,
2020-09-04 18:02:20 +00:00
};
})();