Files
walkbyfaith/src/verse.ts
T

73 lines
1.9 KiB
TypeScript
Raw Normal View History

2026-08-18 18:20:27 -04:00
export interface KJVVerseData {
verse: number
text: string
}
export interface KJVChapterData {
chapter: string
verses: KJVVerseData[]
}
export interface KJVBookData {
book: string
chapters: KJVChapterData[]
}
export interface KJVData {
books: KJVBookData[]
}
export interface Verse {
text: string
reference: string
}
let flat: Verse[] | null = null
2026-08-18 19:19:47 -04:00
const ROLLOVER_LOCAL_HOUR = 2
2026-08-18 18:20:27 -04:00
export function daySeed(now: Date = new Date()): number {
2026-08-18 19:19:47 -04:00
const shifted = new Date(now.getTime() - ROLLOVER_LOCAL_HOUR * 3600_000)
return Math.floor(Date.UTC(shifted.getFullYear(), shifted.getMonth(), shifted.getDate()) / 86_400_000)
2026-08-18 18:20:27 -04:00
}
2026-08-18 19:19:47 -04:00
export function msUntilRollover(now: Date = new Date()): number {
2026-08-18 18:20:27 -04:00
const next = new Date(now)
2026-08-18 19:19:47 -04:00
next.setHours(ROLLOVER_LOCAL_HOUR, 0, 0, 0)
if (next.getTime() <= now.getTime()) next.setDate(next.getDate() + 1)
2026-08-18 18:20:27 -04:00
return next.getTime() - now.getTime()
}
function mulberry32(seed: number): () => number {
let a = seed >>> 0
return () => {
a = (a + 0x6d2b79f5) | 0
let t = Math.imul(a ^ (a >>> 15), 1 | a)
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t
return ((t ^ (t >>> 14)) >>> 0) / 4294967296
}
}
export function pickForDay(verses: Verse[], seed: number): Verse {
const rand = mulberry32(seed)
const index = Math.floor(rand() * verses.length)
return verses[index]
}
export async function loadKJV(): Promise<Verse[]> {
if (flat) return flat
const res = await fetch('/kjv.json')
if (!res.ok) throw new Error(`Failed to load scripture (${res.status})`)
const data = (await res.json()) as KJVData
flat = []
for (const book of data.books) {
const name = book.book === 'Psalms' ? 'Psalm' : book.book
for (const chapter of book.chapters) {
const chapterNumber = Number(chapter.chapter)
for (const v of chapter.verses) {
flat.push({ text: v.text, reference: `${name} ${chapterNumber}:${v.verse}` })
}
}
}
return flat
}