save user city

This commit is contained in:
Sebastian Korotkiewicz 2022-03-26 21:58:59 +01:00
parent bb0b9c93df
commit d7aa3024d6
Signed by: grizzly
GPG Key ID: 5BDC557B496BDB0D
5 changed files with 119 additions and 25 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
node_modules
db/users.db

View File

@ -1,34 +1,110 @@
import axios from "axios";
import sqlite3 from "sqlite3";
import Color from "./Color.js";
const Weather = (event) => {
let reqCity = event.message.match(/,w ([A-Za-z0-9 ]+)/);
// let city = event.message.split(" ");
let city = encodeURIComponent(reqCity[1].trim());
// check if user posted a city TODO
const db = new sqlite3.Database("./db/users.db");
axios({
method: "get",
url: `https://wttr.in/${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 nick = event.nick;
let msg = event.message;
let cmd = msg.match(/^,w (\w+)(.+?)?$/);
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`;
const setUserCity = (nick, city) => {
let time = new Date().getTime();
db.serialize(() => {
//
event.reply(output);
});
let stmt = db.prepare("SELECT city FROM users WHERE nick = (?);");
stmt.each(
[nick],
(err, row) => {
// console.log(err, row);
},
(err, count) => {
if (count === 0) {
// add new user with city if not found
let stmt = db.prepare(
"INSERT INTO users (nick, city, createdAt) VALUES (?,?,?);"
);
stmt.run([nick, city, time]);
stmt.finalize();
} else {
// update user city
let stmt = db.prepare(
"UPDATE users SET city = (?) WHERE nick = (?);"
);
stmt.run([city, nick]);
stmt.finalize();
}
event.reply(
'Your city is now set to "' + city + '". Call ,w to see weather.'
);
stmt.finalize();
}
);
//
});
};
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
db.serialize(() => {
let stmt = db.prepare("SELECT city FROM users WHERE nick = (?);");
stmt.each(
[nick],
(err, row) => {
// get user city from db
getWeather(row.city);
},
(err, count) => {
if (count === 0) {
// user not found
event.reply("usage: ,w [location] OR ,w set [location]");
}
}
);
stmt.finalize();
});
} 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;

14
components/db.js Normal file
View File

@ -0,0 +1,14 @@
import sqlite3 from "sqlite3";
const InitDB = () => {
const db = new sqlite3.Database("./db/users.db");
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
nick TEXT,
city TEXT,
createdAt TEXT
)`);
db.close();
};
export default InitDB;

0
db/.gitkeep Normal file
View File

View File

@ -1,6 +1,9 @@
import { Client } from "irc-framework";
import Weather from "./components/Weather.js";
import UrlTitle from "./components/UrlTitle.js";
import InitDB from "./components/db.js";
InitDB();
function middleware() {
return function (client, raw_events, parsed_events) {
@ -35,7 +38,7 @@ bot.on("close", () => {
console.log("Connection close");
});
bot.matchMessage(/^,w /, async (event) => {
bot.matchMessage(/^,w/, async (event) => {
return Weather(event);
});