Thermograph monorepo: graded-climate API + SSR frontend + infra, domain-specific containerized deploys
Find a file
Emi Griffith 024613c06d Deliver unusual-weather alerts as Discord DMs for linked users (#210)
Adds Discord DM as a notification channel beside web push, for users who linked
their Discord account and opted in. It rides the same fan-out point as push
(_dispatch_discord next to _dispatch_push in the notifier pass), reusing the
transport-agnostic title/body/deep-link, and stays best-effort and isolated: the
in-app row is already committed, and push/email remain the fallback for anyone
Discord can't reach (its DM rule requires a shared server / user install).

- discord.py: send_dm() opens the DM channel then posts an embed via the bot token,
  with one capped 429 retry. Absolute deep links (a DM can't resolve a relative
  path the way the service worker can).
- notify.py: _dispatch_discord() delivers only when the subscriber has a linked
  discord_id and discord_dm on; no-ops entirely when no bot token is configured.
- models.py: User.discord_dm (opt-in flag) + migration 002. Linking sets it True
  (an active opt-in); a new POST /discord/dm mutes it without unlinking, and unlink
  clears it. Exposed on UserRead; account popover shows an on/off toggle.

Claude-Session: https://claude.ai/code/session_013dRZmX9D3JEntfMKWMTWZ8
2026-07-20 04:04:45 +00:00
templates Remove em-dashes from site copy and tighten the prose (#206) 2026-07-20 01:48:33 +00:00
tests Deliver unusual-weather alerts as Discord DMs for linked users (#210) 2026-07-20 04:04:45 +00:00
api_accounts.py Push: surface delivery failures (no longer a silent success) (#157) 2026-07-17 00:12:14 +00:00
app.py Link a Thermograph account to Discord via OAuth2 (#208) 2026-07-20 02:26:33 +00:00
audit.py Dashboard: accounts totals only; log client IPs per request (#140) 2026-07-16 21:58:40 +00:00
cities.json SEO: values filter — trim cities in anti-LGBTQ countries, keep notable hubs (#102) 2026-07-16 02:20:41 +00:00
cities.py Lead climate page titles with the city and the payload (#188) 2026-07-19 18:17:13 +00:00
cities_flavor.json SEO: values filter — trim cities in anti-LGBTQ countries, keep notable hubs (#102) 2026-07-16 02:20:41 +00:00
city_events.py Remove em-dashes from site copy and tighten the prose (#206) 2026-07-20 01:48:33 +00:00
climate.py Remove em-dashes from site copy and tighten the prose (#206) 2026-07-20 01:48:33 +00:00
content.py Remove em-dashes from site copy and tighten the prose (#206) 2026-07-20 01:48:33 +00:00
db.py Fix mobile alerts dropdown overflow; add account API tests (#93) 2026-07-15 22:00:47 +00:00
digest.py Remove em-dashes from site copy and tighten the prose (#206) 2026-07-20 01:48:33 +00:00
discord.py Deliver unusual-weather alerts as Discord DMs for linked users (#210) 2026-07-20 04:04:45 +00:00
discord_interactions.py Serve a /grade Discord slash command over HTTP interactions (#207) 2026-07-20 02:19:29 +00:00
discord_link.py Deliver unusual-weather alerts as Discord DMs for linked users (#210) 2026-07-20 04:04:45 +00:00
gen_cities.py SEO: values filter — trim cities in anti-LGBTQ countries, keep notable hubs (#102) 2026-07-16 02:20:41 +00:00
gen_flavor.py SEO: expand city set to 1000 (extended English-speaking / high-proficiency) (#99) 2026-07-16 01:14:30 +00:00
grading.py Render every percentile through one rule (#186) 2026-07-18 09:08:28 +00:00
grid.py Warm neighbor cells server-side (/cell?neighbors=1) (#51) 2026-07-11 20:47:31 +00:00
homepage.py Render every percentile through one rule (#186) 2026-07-18 09:08:28 +00:00
indexnow.py Auto-submit IndexNow on deploy when the URL set changes (#130) 2026-07-16 13:38:59 -07:00
mailer.py Rebuild the homepage as a distribution landing; add an SMTP seam (#178) 2026-07-18 07:39:47 +00:00
metrics.py Rebuild the homepage as a distribution landing; add an SMTP seam (#178) 2026-07-18 07:39:47 +00:00
migrate.py Migrate backend dataframe layer from pandas to polars (#90) 2026-07-15 19:07:38 +00:00
models.py Deliver unusual-weather alerts as Discord DMs for linked users (#210) 2026-07-20 04:04:45 +00:00
notify.py Deliver unusual-weather alerts as Discord DMs for linked users (#210) 2026-07-20 04:04:45 +00:00
places.py Move the suggestion policy into places.py (#45) 2026-07-11 20:00:24 +00:00
push.py Push: surface delivery failures (no longer a silent success) (#157) 2026-07-17 00:12:14 +00:00
requirements-dev.txt Add backend test suite; gate direct pushes; serialize LAN deploys (#41) 2026-07-11 19:37:49 +00:00
requirements.txt Serve a /grade Discord slash command over HTTP interactions (#207) 2026-07-20 02:19:29 +00:00
schemas.py Deliver unusual-weather alerts as Discord DMs for linked users (#210) 2026-07-20 04:04:45 +00:00
scoring.py Simplify the score module and page: dedup builders, consolidate metric metadata (#209) 2026-07-20 04:02:40 +00:00
singleton.py Gate the subscription notifier to one worker (#161) 2026-07-17 12:54:55 +00:00
store.py Compare/calendar mobile polish: overflow fix, sheet load button, 6-yr default, country in names (#80) 2026-07-12 06:32:10 +00:00
users.py Account system with weather-notification subscriptions (#89) 2026-07-15 18:46:46 +00:00
views.py Simplify the score module and page: dedup builders, consolidate metric metadata (#209) 2026-07-20 04:02:40 +00:00
warm_cities.py Rebuild the homepage as a distribution landing; add an SMTP seam (#178) 2026-07-18 07:39:47 +00:00