sourceapproutescomment.js

import * as https from "https";

import Database from "better-sqlite3";

import grimm from "../grimm.js";
import { probablySpam, tripcodeHash } from "../../shush/shush.js";

const db = new Database("./db/site.db");
db.pragma("journal_mode = DELETE");

const leaveComment = (req, res, next) => {
	const query = Object.assign(req.query, req.body);
	const submitDate = new Date().toISOString();
	const confirmMessage = grimm.translate(
		query.lang || "en",
		"comments.confirmed"
	);

	if (probablySpam(query)) {
		return res.send(confirmMessage);
	}

	let row = {
		page_id: query.pageid,
		name: query.name.trim(),
		hashcode: query.hashcode
			? tripcodeHash(query.name, query.hashcode)
			: null,
		website: query.website.trim() || null,
		content: query.content.trim(),
		submit_date: submitDate,
		country: null,
		lang: query.lang,
		planet: query.planet
	};

	function success() {
		db.transaction(() => {
			db.prepare(
				`Insert Into comments
					(page_id, "name", hashcode, website, content, submit_date, country, lang, planet)
				Values (@page_id, @name, @hashcode, @website, @content, @submit_date, @country, @lang, @planet)`
			).run(row);
		})();
		res.send(confirmMessage);
	}

	https
		.get(`https://api.country.is/${req.headers["x-real-ip"]}`, r => {
			let body = "";

			r.on("data", chunk => {
				body += chunk;
			});

			r.on("end", () => {
				try {
					row.country = JSON.parse(body).country.toLowerCase();
				} catch {}

				success();
			});
		})
		.on("error", error => {
			success();
		});
};

export default leaveComment;