diff --git a/README.md b/README.md index af15644..f1ceb2b 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,25 @@ -# Pest Nocturne ๐ชฒ +# Evergreen Applicator ๐ฒ -A midnight specimen-cabinet study suite for the **WSU EM019** pest management -certification exam. The complete *Study Manual for Pest Management -Professionals* rebuilt as an interactive, illustrated single-page app. +**Washington pesticide applicator exam prep** โ an interactive single-page study +suite for passing the WSDA pesticide applicator license (Core + Structural + +Ornamental & Turf + Agricultural). Built from the *Study Manual for Pest +Management Professionals* (WSU EM019) plus an original question bank. ## Live -**https://nocturne.thetempleofdoom.com** +**https://evergreenapplicator.thetempleofdoom.com** ## What's inside -- **Field guide** โ all 13 chapters with illustrated plates +- **WA Cert** โ WSDA licensing guide: exam format, fees, categories, CE requirements, printable application checklist +- **Field guide** โ all 13 chapters with real pest photos (Wikimedia, CC/PD) - **Identification keys** โ branching keys, walked one couplet at a time - **House faults** โ 22 points of faulty construction/maintenance, in order -- **Flashcards** ๐ โ premium -- **Practice exam** ๐ โ premium (scored, with the official answer key) -- **Glossary** โ every defined term, searchable as you type +- **WA Prep** โ 318 questions (249 original + 69 from the manual) with instant feedback + a timed 50-question mock exam (120 min, 70% pass) +- **Flashcards** ๐ / **Practice exam** ๐ โ premium +- **Glossary** โ every defined term, searchable ## Monetization -Freemium: the field guide, keys, and house faults are free. **Flashcards and -the practice exam are a $5 Bitcoin unlock** via BTCPay. +Freemium: the field guide, keys, house faults, WA Cert, and WA Prep are free. +**Flashcards and the practice exam are a $5 Bitcoin unlock** via BTCPay. - BTCPay store: `FDT6DHWEaA7DF5WFePkp4pufgQ9yy1G6JfzTCwey1jYn` - Price: $5 USD (on-chain BTC) @@ -25,17 +27,20 @@ the practice exam are a $5 Bitcoin unlock** via BTCPay. ## Stack - Single self-contained `index.html` (vanilla JS SPA, no build step) -- Flask (`app.py`) for the paywall + BTCPay webhook +- Flask (`app.py`) for the paywall + BTCPay webhook (HMAC-verified) - nginx reverse proxy โ Flask :5000 - SQLite (`orders.db`) for order state ## Deploy - Proxmox LXC CT **117** (`nocturne`) @ 10.30.20.234 - systemd `nocturne.service`, nginx `sites-enabled/nocturne` -- Cloudflare tunnel `thetemple-fleet` (`1aeb1ac0`), ingress โ `:80` +- Cloudflare tunnel `thetemple-fleet` (`1aeb1ac0-3c49-4801-b61d-bc92e6e4932a`), ingress โ `:80` ## Files -- `index.html` โ the study suite + injected paywall gate + BMAC footer -- `app.py` โ Flask backend (BTCPay invoice, webhook, unlock status) -- `inject.py` โ one-shot script that injects the paywall + footer into the HTML +- `index.html` โ the study suite (paywall gate, photos, WA Prep, BMAC footer injected) +- `app.py` โ Flask backend (BTCPay invoice, webhook, unlock status, image serving) +- `images/` โ 25 real pest photos (Wikimedia Commons) +- `wa_exam_data.py` / `wa_exam_data2.py` โ the original 249-question bank (part 2 imports part 1) +- `rebuild_wa_prep.py` โ build script for the WA Prep view + mock exam +- `inject.py` / `integrate_photos.py` / `add_wa_view.py` / `rename.py` โ one-shot build scripts - `nocturne.service` / `nocturne.nginx` โ service + nginx config diff --git a/add_features.py b/add_features.py new file mode 100644 index 0000000..1fc71b7 --- /dev/null +++ b/add_features.py @@ -0,0 +1,167 @@ +import io + +p = "/Users/drjones/pest-nocturne/index.html" +s = open(p).read() + +# ============ 1. PROGRESS TRACKER (localStorage, per-category) ============ +# add progress state after the mock declaration +s = s.replace( + " let mock = { qs: [], answers: [], secs: 0, timer: null };", + " let mock = { qs: [], answers: [], secs: 0, timer: null };\n" + " let progress = JSON.parse(localStorage.getItem('pn_progress')||'{}');\n" + " function saveProgress(){ localStorage.setItem('pn_progress', JSON.stringify(progress)); }\n" + " function clearProgress(){ progress = {}; localStorage.removeItem('pn_progress'); }", + 1, +) + +# record progress on every practice answer +s = s.replace( + " if (correct) score++;\n answered++;", + " if (correct) score++;\n answered++;\n" + " const pc = q.cat; if (!progress[pc]) progress[pc] = {c:0, t:0};\n" + " progress[pc].t++; if (correct) progress[pc].c++; saveProgress();", + 1, +) + +# progress bars UI (after the category buttons row) +s = s.replace( + "
One-pager ยท WSDA (360) 902-2020 ยท agr.wa.gov ยท Olympia WA 98504
+