data endpoint for entity 90008 (aka. a website)

feat: check if client bot or not when counting visits

ptr.pet 98878514 b7d6f2ad

verified
bun.lockb

This is a binary file and will not be displayed.

+2 -1
package.json
···
"@std/toml": "npm:@jsr/std__toml",
"base64url": "^3.0.1",
"rehype-autolink-headings": "^7.1.0",
-
"rehype-slug": "^6.0.0"
+
"rehype-slug": "^6.0.0",
+
"typescript-svelte-plugin": "^0.3.42"
},
"trustedDependencies": [
"@sveltejs/kit",
+19 -14
src/routes/+layout.server.ts
···
export const prerender = 'auto';
export const trailingSlash = 'always';
-
export async function load({ cookies, url, setHeaders }) {
-
setHeaders({ 'Cache-Control': 'no-cache' })
+
export async function load({ request, cookies, url, setHeaders }) {
+
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, '/')
// 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
-
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())
+
// 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: currentVisitCount,
-
}
-
}
+
}
+
return {
+
route: url.pathname,
+
visitCount: currentVisitCount,
+
}
+
}
+5 -1
tsconfig.json
···
"sourceMap": true,
"strict": true,
"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
// except $lib which is handled by https://kit.svelte.dev/docs/configuration#files