Members area: Circle Method lessons 2-10 + Video 8 gated behind position ownership

The product now has a lid. Server refuses the gated video FILES without a
wallet-verified member session (the Mini App bridge session counts, so
Telegram members see no locks). Lesson 1, every poster, and all join-funnel
and transparency videos stay public: free preview + trust engine. Training
page renders locked cards with a one-signature unlock (same SIWE flow as
Messages) and a members-unlocked badge. Chatbot: new members-area canned
answer, Method answer notes the preview, AI prompt routing rule now answers
prospects directly instead of sending locked links; bot lesson command notes
the unlock path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-08-25 04:10:57 -05:00
parent 76a9b449c9
commit ca4b5bf34f
5 changed files with 70 additions and 7 deletions
+1 -1
View File
@@ -282,7 +282,7 @@ async function handleUpdate(update) {
if (/^\/?coach$/i.test(text)) { const d = await fetchMember(linked); await dm(chatId, coachText(d)); return; }
if (/^\/?team$/i.test(text)) { const d = await fetchMember(linked); await dm(chatId, teamText(d)); return; }
const lm = text.match(/^\/?lesson\s+(\d{1,2})$/i);
if (lm) { const n = Number(lm[1]); if (LESSONS[n]) { await dm(chatId, `🎓 Lesson ${n} — ${LESSONS[n]}:\n${lessonLink(n)}\n\nForward this to whoever needs it. The answer to every question is a lesson.`); } else { await dm(chatId, 'Lessons run 1–10. Try: lesson 7'); } return; }
if (lm) { const n = Number(lm[1]); if (LESSONS[n]) { await dm(chatId, `🎓 Lesson ${n} — ${LESSONS[n]}:\n${lessonLink(n)}\n\nForward this to whoever needs it. The answer to every question is a lesson.${n > 1 ? '\n(Lessons 2-10 are members-area — they unlock with a wallet sign-in on the page, or open instantly through the ☰ Mini App.)' : ''}`); } else { await dm(chatId, 'Lessons run 1–10. Try: lesson 7'); } return; }
const rm = text.match(/^\/?rhythm(?:\s+(\S+))?(?:\s+(\d{1,2}))?$/i);
if (rm) {
const d2 = load(); d2.rhythm = d2.rhythm || {}; const key = String(linked);