121 lines
5.2 KiB
JavaScript
121 lines
5.2 KiB
JavaScript
/**
|
|
* seed-about — patch about table + site_text role sections with v5 GFE voice copy.
|
|
*
|
|
* Idempotent: safe to run multiple times. Uses UPSERT for site_text entries
|
|
* and UPDATE for the about singleton row.
|
|
* Does NOT touch gallery, rates, tour, or any other table.
|
|
*
|
|
* Usage: bun run src/seed-about.ts
|
|
*/
|
|
import { initSchema, getDb, openDb, getDbUrl, touchLastModified } from './db';
|
|
import { logger } from './logger';
|
|
const bio = `princess in public, total nerd behind closed doors~ I'm brainy AND bimbo, and I genuinely can't decide which I prefer being 💕
|
|
|
|
I'm Quinn — your real-life futanari companion based in the Bay Area, touring cities across the country whenever someone makes it worth my while.
|
|
|
|
The experience with me is warm, genuine, and a little surprising. I show up as your actual girlfriend for the night — curious about you, completely present, and enthusiastic in a way that can't be faked. First time with a trans girl? No awkwardness, I promise. I'll make you comfortable and you'll wonder why you waited so long 💗
|
|
|
|
I'm a switch. I love being taken and I love taking. I love soft morning cuddles and I love getting absolutely wrecked. I love dinner conversation and I love being the most embarrassing nerd in the room about anime and video games. Whatever version of the night you're imagining — I'm probably into it~`;
|
|
const personality = [
|
|
'GFE',
|
|
'Switch',
|
|
'Nerdy',
|
|
'Playful',
|
|
'Affectionate',
|
|
'Bimbo energy',
|
|
'Anime obsessed',
|
|
];
|
|
const availableFor = [
|
|
'Incall',
|
|
'Outcall',
|
|
'Overnight',
|
|
'Dinner dates',
|
|
'Touring',
|
|
'Fly Me To You',
|
|
'Couples',
|
|
];
|
|
const availableTo = [
|
|
'Men',
|
|
'Women',
|
|
'Couples',
|
|
'Trans & NB',
|
|
'First-timers welcome',
|
|
];
|
|
const roleSections = [
|
|
[
|
|
'about',
|
|
'role_section_heading',
|
|
'What kind of night are you looking for?',
|
|
],
|
|
[
|
|
'about',
|
|
'role_use_me_heading',
|
|
'🍑 Want to use me?',
|
|
],
|
|
[
|
|
'about',
|
|
'role_use_me_body',
|
|
`I'm sweet, submissive, and completely yours for the night~ I love being held down, bent over, and reminded exactly who I belong to.
|
|
|
|
I'm eager and enthusiastic in a way that genuinely can't be faked — your loyal girlfriend who lives to please, begging for more and meaning every word of it. I'll give you my whole body and all of my attention. Take what's yours 💗`,
|
|
],
|
|
[
|
|
'about',
|
|
'role_take_control_heading',
|
|
'👠 Want me to take control?',
|
|
],
|
|
[
|
|
'about',
|
|
'role_take_control_body',
|
|
`Sweet domination, nurturing control — I'll make you feel completely safe while guiding you exactly where you need to go~
|
|
|
|
Mommy Dom energy means warmth with authority. I set the pace, I give the direction, and I take genuine pleasure in taking care of you while being completely in charge. Feminization, cuckolding, bi exploration — the things you've been too nervous to ask for? I'm the safe space for all of it. Let me handle everything 💕`,
|
|
],
|
|
[
|
|
'about',
|
|
'role_both_heading',
|
|
'🔄 Want the best of both?',
|
|
],
|
|
[
|
|
'about',
|
|
'role_both_body',
|
|
`Start with you taking me, end with me taking you — or trade off all night long. The chemistry of switching is genuinely electric and this is where I really shine ✨
|
|
|
|
I love the fluid energy of a session that doesn't have a fixed script. We follow the mood, read each other, and go wherever feels best. No pressure, no performance — just two people who are genuinely into each other~`,
|
|
],
|
|
[
|
|
'about',
|
|
'role_fantasy_heading',
|
|
'🎮 Fantasy & role-play',
|
|
],
|
|
[
|
|
'about',
|
|
'role_fantasy_body',
|
|
`Your IRL anime e-girl, your gaming girlfriend, your renaissance faire adventure — I'm a real nerd so this is genuinely fun for me, not just a service 💕
|
|
|
|
Cosplay, character play, specific scenarios — tell me what you're imagining and I'll bring it to life with actual enthusiasm. I have a wardrobe and a commitment to the bit. The weirder and more specific your vision, the more I'm going to enjoy making it happen~`,
|
|
],
|
|
];
|
|
async function main() {
|
|
try {
|
|
openDb(getDbUrl());
|
|
await initSchema();
|
|
const db = getDb();
|
|
const existing = (await db.unsafe('SELECT id FROM about WHERE id = 1'))[0] ?? null;
|
|
if (!existing) {
|
|
logger.error('No about row found — run migrations first to initialize the DB');
|
|
process.exit(1);
|
|
}
|
|
await db.unsafe('UPDATE about SET bio = $1, personality = $2, available_for = $3, available_to = $4, updated_at = now() WHERE id = 1', [bio, JSON.stringify(personality), JSON.stringify(availableFor), JSON.stringify(availableTo)]);
|
|
for (const [namespace, key, value] of roleSections) {
|
|
await db.unsafe('INSERT INTO site_text (namespace, key, value) VALUES ($1, $2, $3) ON CONFLICT (namespace, key) DO UPDATE SET value = EXCLUDED.value', [namespace, key, value]);
|
|
}
|
|
await touchLastModified();
|
|
logger.info('About bio and role sections updated successfully');
|
|
}
|
|
catch (err) {
|
|
logger.error('seed-about failed', { error: String(err) });
|
|
process.exit(1);
|
|
}
|
|
}
|
|
main();
|