irc_bot/components/Weather.js

87 lines
2.5 KiB
JavaScript

import axios from "axios";
import Database from "better-sqlite3";
import Color from "./Color.js";
const Weather = (event) => {
const db = new Database("./db/users.db", null);
let nick = event.nick;
let msg = event.message;
let cmd = msg.match(/^,w (\w+)(.+?)?$/);
const setUserCity = (nick, city) => {
let time = new Date().getTime();
const row = db
.prepare("SELECT city FROM users WHERE nick = (?)")
.get([nick]);
if (row) {
// update user city
const stmt = db.prepare("UPDATE users SET city = (?) WHERE nick = (?);");
stmt.run([city, nick]);
} else {
// add new user with city if not found
const stmt = db.prepare(
"INSERT INTO users (nick, city, createdAt) VALUES (?,?,?);"
);
stmt.run([nick, city, time]);
}
event.reply(
'Your city is now set to "' + city + '". Call ,w to see weather.'
);
};
const getWeather = (city) => {
axios({
method: "get",
url: `https://wttr.in/${encodeURIComponent(city)}?format=j1`,
}).then((r) => {
let weatherDesc = r.data.current_condition[0].weatherDesc[0].value;
let humidity = r.data.current_condition[0].humidity;
let tempC = r.data.current_condition[0].temp_C;
let tempF = r.data.current_condition[0].temp_F;
let windspeedKmph = r.data.current_condition[0].windspeedKmph;
let windspeedMiles = r.data.current_condition[0].windspeedMiles;
let areaName = r.data.nearest_area[0].areaName[0].value;
let country = r.data.nearest_area[0].country[0].value;
let region = r.data.nearest_area[0].region[0].value;
let output = `${Color("Weather")} (${
event.nick
}) ${areaName}, ${region}, ${country} | ${tempC}C/${tempF}F/${
Number(tempC) + 273.15
}K | ${weatherDesc} | Humidity: ${humidity}% | Wind: ${windspeedKmph}km/h/${windspeedMiles}mi/h`;
event.reply(output);
});
};
if (cmd === null) {
// ,w
const row = db.prepare("SELECT * FROM users WHERE nick = (?)").get([nick]);
if (row) {
// get user city from db
getWeather(row.city);
} else {
// user not found
event.reply("usage: ,w [location] OR ,w set [location]");
}
} else if (cmd[1].trim().toLowerCase() === "set") {
// ,w set neustadt an der donau
setUserCity(nick, cmd[2].trim());
} else if (cmd[1].trim()) {
// ,w neustadt an der donau
let cityMore = cmd[2] ? " " + cmd[2].trim() : "";
let city = cmd[1].trim() + cityMore;
getWeather(city);
}
};
export default Weather;