From d3cc21836298f394665289e71c599520a1f6f94b Mon Sep 17 00:00:00 2001 From: echicken <> Date: Mon, 7 Jan 2019 23:10:57 +0000 Subject: [PATCH] Overhaul of nick/location update process. --- exec/ircbots/weather/weather_commands.js | 66 +++++++------------ exec/ircbots/weather/weather_functions.js | 77 +++++++++++++++++------ 2 files changed, 79 insertions(+), 64 deletions(-) diff --git a/exec/ircbots/weather/weather_commands.js b/exec/ircbots/weather/weather_commands.js index aaa4883350..12ed67d2a5 100644 --- a/exec/ircbots/weather/weather_commands.js +++ b/exec/ircbots/weather/weather_commands.js @@ -1,60 +1,38 @@ Bot_Commands["WEATHER"] = new Bot_Command(0,false,false); -Bot_Commands["WEATHER"].command = function (target,onick,ouh,srv,lvl,cmd) { +Bot_Commands["WEATHER"].command = function (target, onick, ouh, srv, lvl, cmd) { - var i; - var lstr; - var nick = onick; - var res; - var ll; - - // Remove empty cmd args - for (i = 1; i < cmd.length; i++) { + // Remove empty cmd args + for (var i = 1; i < cmd.length; i++) { if (cmd[i].search(/^\s*$/) == 0) { cmd.splice(i, 1); i--; } } - cmd.shift(); - if (cmd[0]) nick = cmd[0]; - - if (typeof srv.users[nick.toUpperCase()] != 'undefined') { - try { - lstr = get_nickcoords(srv.users[nick.toUpperCase()].uh, srv.users[nick.toUpperCase()].servername, nick); - ll = lstr.match(/^(-*\d+\.\d+),(-*\d+\.\d+)$/); - } catch (e) { - log(LOG_DEBUG, 'Failed to get nick coordinates: ' + e); - } - } try { - if (ll) { - res = owm.call_api('weather', { lat: ll[1], lon: ll[2], units: 'metric' }); + const params = get_params(cmd, onick, srv); + if (params) { + const res = owm.call_api('weather', params); + var str = '\1n\1rWeather for \1h\1c' + res.name + '\1n\1r: ' + + '\1h\1c' + res.weather[0].main + ' \1n\1r(\1c' + res.weather[0].description + '\1r), ' + + '\1h\1c' + res.clouds.all + '% cloudy\1n\1r, ' + + 'Current temp: \1h\1c' + temperature_str(res.main.temp) + '\1n\1r, ' + + 'Min temp: \1h\1c' + temperature_str(res.main.temp_min) + '\1n\1r, ' + + 'Max temp: \1h\1c' + temperature_str(res.main.temp_max) + '\1n\1r, ' + + 'Wind: \1h\1c' + res.wind.speed + ' KM/h ' + owm.wind_direction(res.wind.deg) + '\1n\1r, ' + + 'Humidity: \1h\1c' + res.main.humidity + '%\1n\1r, ' + + 'Pressure: \1h\1c' + res.main.pressure + ' hPa\1n\1r, ' + + 'Sunrise: \1h\1c' + system.timestr(res.sys.sunrise) + '\1n\1r, ' + + 'Sunset: \1h\1c' + system.timestr(res.sys.sunset) + + ' \1n\1m(\1h\1mProvided by OpenWeatherMap.org\1n\1m)'; + srv.o(target, ctrl_a_to_mirc(str)); } else { - var usr = new User(system.matchuser(nick)); - if (typeof usr == 'object' && usr.number > 0) { - lstr = usr.location.split(',')[0]; - } else { - lstr = nick; // Could be city name - } - usr = undefined; - res = owm.call_api('weather', { q: lstr, units: 'metric' }); + } - var str = 'Weather for ' + res.name + ': ' - + res.weather[0].main + ' (' + res.weather[0].description + '), ' - + res.clouds.all + '% cloudy, ' - + 'Current temp: ' + temperature_str(res.main.temp) + ', ' - + 'Min temp: ' + temperature_str(res.main.temp_min) + ', ' - + 'Max temp: ' + temperature_str(res.main.temp_max) + ', ' - + 'Wind: ' + res.wind.speed + ' KM/h ' + owm.wind_direction(res.wind.deg) + ', ' - + 'Humidity: ' + res.main.humidity + '%, ' - + 'Pressure: ' + res.main.pressure + ' hPa, ' - + 'Sunrise: ' + system.timestr(res.sys.sunrise) + ', ' - + 'Sunset: ' + system.timestr(res.sys.sunset); - srv.o(target, str); } catch (err) { - log(LOG_DEBUG, 'Failed to display weather conditions for ' + lstr + ': ' + err); - srv.o(target, 'Failed to fetch weather conditions.'); + log(LOG_DEBUG, 'Failed to display weather conditions: ' + err); + srv.o(target, 'Failed to fetch weather conditions: ' + err); } return true; diff --git a/exec/ircbots/weather/weather_functions.js b/exec/ircbots/weather/weather_functions.js index a345074196..2f7d7ad289 100644 --- a/exec/ircbots/weather/weather_functions.js +++ b/exec/ircbots/weather/weather_functions.js @@ -1,27 +1,64 @@ -if(js.global.get_geoip==undefined) - js.global.load(js.global, "geoip.js"); -if(js.global.get_nicklocation==undefined) - js.global.load(js.global, "nicklocate.js"); - -if (!js.global.OpenWeatherMap) { - js.global.load(js.global, 'openweathermap.js'); -} +if (!js.global.get_geoip) js.global.load(js.global, "geoip.js"); +if (!js.global.get_nicklocation) js.global.load(js.global, "nicklocate.js"); +if (!js.global.OpenWeatherMap) js.global.load(js.global, 'openweathermap.js'); const owm = new OpenWeatherMap(); -function get_nickcoords(uh, sn, n) { - var geo=get_nicklocation(uh, sn, n); - if(!geo) - geo = {latitude:0, longitude:0}; - var ret=geo.latitude+','+geo.longitude; - if(ret=='0,0') { - uh=sn; - geo=get_geoip(uh); - ret=geo.latitude+','+geo.longitude; - } - return ret; +function locate_user(nick, srv) { + const ret = { units: 'metric' }; + // If we have data about this IRC user + if (typeof srv.users[nick.toUpperCase()] != 'undefined') { + // Try geolocation + var res = get_nicklocation( + srv.users[nick.toUpperCase()].uh, + srv.users[nick.toUpperCase()].servername, + nick + ); + // If we have coordinates + if (res && (res.latitude != 0 || res.longitude != 0)) { + ret.lat = res.latitude; + ret.lon = res.longitude; + return ret; + } + } + // See if the user exists in the local DB + var usr = new User(system.matchuser(nick)); + if (typeof usr == 'object' && usr.number > 0) { + var loc = usr.location.split(',')[0]; + // Assume loc is a city name + if (loc != '') { + ret.q = loc; + return ret; + } + } + return; // We got nothin' +} + +function get_params(cmd, nick, srv) { + const ret = { units: 'metric' }; + // No parameters given, try to look up the user who issued the command + if (cmd.length < 1) return locate_user(nick, srv); + // Parameters were given + if (cmd.length == 1) { + // This could be a nick + var res = locate_user(cmd[0], srv); + if (res) return res; + // If it's a ZIP code + if (cmd[0].search(/^[0-9]{5}(?:-[0-9]{4})?$/) > -1) { + ret.zip = cmd[0]; + ret.us = ''; + return ret; + // If it's a Canadian postal code + } else if (cmd[0].search(/^[A-Za-z]\d[A-Za-z]\d[A-Za-z]\d$/) > -1) { + ret.zip = cmd[0]; + ret.ca = ''; + return ret; + } + } + // Maybe a city name + return { q : cmd.join(' ').split(',')[0] }; } function temperature_str(n) { - return n + '\xB0C (' + owm.c_to_f(n) + '\xB0F)'; + return n + '\xB0C \1n\1r(\1h\1c' + owm.c_to_f(n) + '\xB0F\1n\1r)'; } -- GitLab