feat: check if client bot or not when counting visits
All checks were successful
create archive with lfs / tag (push) Successful in 9s
All checks were successful
create archive with lfs / tag (push) Successful in 9s
This commit is contained in:
parent
b7d6f2ad3e
commit
988785147c
@ -42,7 +42,8 @@
|
|||||||
"@std/toml": "npm:@jsr/std__toml",
|
"@std/toml": "npm:@jsr/std__toml",
|
||||||
"base64url": "^3.0.1",
|
"base64url": "^3.0.1",
|
||||||
"rehype-autolink-headings": "^7.1.0",
|
"rehype-autolink-headings": "^7.1.0",
|
||||||
"rehype-slug": "^6.0.0"
|
"rehype-slug": "^6.0.0",
|
||||||
|
"typescript-svelte-plugin": "^0.3.42"
|
||||||
},
|
},
|
||||||
"trustedDependencies": [
|
"trustedDependencies": [
|
||||||
"@sveltejs/kit",
|
"@sveltejs/kit",
|
||||||
|
@ -7,26 +7,31 @@ export const ssr = true;
|
|||||||
export const prerender = 'auto';
|
export const prerender = 'auto';
|
||||||
export const trailingSlash = 'always';
|
export const trailingSlash = 'always';
|
||||||
|
|
||||||
export async function load({ cookies, url, setHeaders }) {
|
export async function load({ request, cookies, url, setHeaders }) {
|
||||||
setHeaders({ 'Cache-Control': 'no-cache' })
|
setHeaders({ 'Cache-Control': 'no-cache' })
|
||||||
|
let currentVisitCount = get(visitCount)
|
||||||
|
// check whether the request is from a bot or not (this doesnt need to be accurate we just want to filter out honest bots)
|
||||||
|
const ua = request.headers.get('user-agent')
|
||||||
|
const isBot = ua ? ua.toLowerCase().match(/(bot|crawl|spider|walk)/) !== null : true
|
||||||
|
if (!isBot) {
|
||||||
const scopedCookies = scopeCookies(cookies, '/')
|
const scopedCookies = scopeCookies(cookies, '/')
|
||||||
// parse the last visit timestamp from cookies if it exists
|
// parse the last visit timestamp from cookies if it exists
|
||||||
const visitedTimestamp = parseInt(scopedCookies.get('visitedTimestamp') || "0")
|
const visitedTimestamp = parseInt(scopedCookies.get('visitedTimestamp') || "0")
|
||||||
// get unix timestamp
|
// get unix timestamp
|
||||||
const currentTime = new Date().getTime()
|
const currentTime = new Date().getTime()
|
||||||
const timeSinceVisit = currentTime - visitedTimestamp
|
const timeSinceVisit = currentTime - visitedTimestamp
|
||||||
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
|
// 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) {
|
if (visitedTimestamp === 0 || timeSinceVisit > 1000 * 60 * 60 * 24) {
|
||||||
// increment current and write to the store
|
// increment current and write to the store
|
||||||
currentVisitCount += 1; visitCount.set(currentVisitCount)
|
currentVisitCount += 1; visitCount.set(currentVisitCount)
|
||||||
// update the cookie with the current timestamp
|
// update the cookie with the current timestamp
|
||||||
scopedCookies.set('visitedTimestamp', currentTime.toString())
|
scopedCookies.set('visitedTimestamp', currentTime.toString())
|
||||||
// write the visit count to a file so we can load it later again
|
// write the visit count to a file so we can load it later again
|
||||||
writeFileSync(visitCountFile, currentVisitCount.toString())
|
writeFileSync(visitCountFile, currentVisitCount.toString())
|
||||||
}
|
|
||||||
return {
|
|
||||||
route: url.pathname,
|
|
||||||
visitCount: currentVisitCount,
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
route: url.pathname,
|
||||||
|
visitCount: currentVisitCount,
|
||||||
|
}
|
||||||
}
|
}
|
@ -10,7 +10,11 @@
|
|||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"allowImportingTsExtensions": true
|
"allowImportingTsExtensions": true,
|
||||||
|
"plugins": [{
|
||||||
|
"name": "typescript-svelte-plugin",
|
||||||
|
"enabled": true
|
||||||
|
}]
|
||||||
}
|
}
|
||||||
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
|
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
|
||||||
// except $lib which is handled by https://kit.svelte.dev/docs/configuration#files
|
// except $lib which is handled by https://kit.svelte.dev/docs/configuration#files
|
||||||
|
Loading…
Reference in New Issue
Block a user