From fe82c60fe5549b46ba19494c8b0756e84cdad75b Mon Sep 17 00:00:00 2001 From: dusk Date: Tue, 1 Oct 2024 03:35:53 +0300 Subject: [PATCH] feat: save the visitcount to working dir --- .gitignore | 1 + src/routes/+layout.server.ts | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index ef35f27..52bb891 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules .vercel /.svelte-kit /build +/visitcount # OS .DS_Store diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index f33adb7..b89ebab 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,4 +1,5 @@ import { scopeCookies } from '$lib'; +import { existsSync, readFileSync, writeFileSync } from 'fs'; import { get, writable } from 'svelte/store'; export const csr = true; @@ -6,20 +7,29 @@ export const ssr = true; export const prerender = true; export const trailingSlash = 'always'; -const visitCount = writable(0); +const visitCountFile = 'visitcount' +const visitCount = writable(parseInt(existsSync(visitCountFile) ? readFileSync(visitCountFile).toString() : '0')); export async function load({ cookies, url, setHeaders }) { setHeaders({ 'Cache-Control': 'no-cache' }) const scopedCookies = scopeCookies(cookies, '/') + // parse the last visit timestamp from cookies if it exists const visitedTimestamp = parseInt(scopedCookies.get('visitedTimestamp') || "0") + // get unix timestamp const currentTime = new Date().getTime() const timeSinceVisit = currentTime - visitedTimestamp - if (visitedTimestamp === 0 || timeSinceVisit > 1000 * 60 * 60) { - visitCount.set(get(visitCount) + 1) + let currentVisitCount = get(visitCount) + // check if this is the first time a client is visiting or if an hour has passed since they last visited + if (visitedTimestamp === 0 || timeSinceVisit > 1000 * 60 * 60 * 24) { + // increment current and write to the store + currentVisitCount += 1; visitCount.set(currentVisitCount) + // update the cookie with the current timestamp scopedCookies.set('visitedTimestamp', currentTime.toString()) + // write the visit count to a file so we can load it later again + writeFileSync(visitCountFile, currentVisitCount.toString()) } return { route: url.pathname, - visitCount: get(visitCount), + visitCount: currentVisitCount, } } \ No newline at end of file