SPB Git forge

spb/spinza

Public
8commits 1branches 0releases
1.6 MBsize
maindefault branch
16 days agolast push
TypeScript 97.6% SQL 1.4% JavaScript 0.5%
8.1 KB · 89 lines typescript
Raw Blame History
1import { MAX_LEVEL, levelUpReward, xpForLevel, xpThreshold, RESCUE_CREDITS_AMOUNT, RESCUE_CREDITS_COOLDOWN_HOURS, DAILY_REWARDS } from "@spinza/shared";2import { GAMES } from "@spinza/games";3import { closeDb, getDb } from "./index";4import { achievements, featureFlags, missions, platformSettings, playerLevels } from "./schema";5import { syncGames } from "./sync-games";67const ACHIEVEMENTS: (typeof achievements.$inferInsert)[] = [8  { key: "first-spin", name: "First Spin", description: "Play your very first round.", category: "milestone", metric: "spins", target: 1, rewardCredits: 250, rewardXp: 50, icon: "sparkle", sortOrder: 1 },9  { key: "spins-100", name: "Warming Up", description: "Play 100 spins.", category: "milestone", metric: "spins", target: 100, rewardCredits: 500, rewardXp: 150, icon: "repeat", sortOrder: 2 },10  { key: "spins-1000", name: "Reel Regular", description: "Play 1,000 spins.", category: "milestone", metric: "spins", target: 1000, rewardCredits: 2500, rewardXp: 600, icon: "repeat", sortOrder: 3 },11  { key: "spins-10000", name: "Spin Master", description: "Play 10,000 spins.", category: "milestone", metric: "spins", target: 10000, rewardCredits: 15000, rewardXp: 3000, icon: "crown", sortOrder: 4 },12  { key: "first-big-win", name: "First Big Win", description: "Land a win of 20× your bet or more.", category: "wins", metric: "big_wins", target: 1, rewardCredits: 500, rewardXp: 150, icon: "flame", sortOrder: 10 },13  { key: "big-wins-25", name: "Big Win Collector", description: "Land 25 big wins.", category: "wins", metric: "big_wins", target: 25, rewardCredits: 5000, rewardXp: 1000, icon: "flame", sortOrder: 11 },14  { key: "club-100x", name: "100× Club", description: "Win 100× your bet in a single round.", category: "wins", metric: "multiplier", target: 100, rewardCredits: 2000, rewardXp: 500, icon: "bolt", sortOrder: 12 },15  { key: "club-1000x", name: "1,000× Club", description: "Win 1,000× your bet in a single round.", category: "wins", metric: "multiplier", target: 1000, rewardCredits: 20000, rewardXp: 3000, icon: "bolt", sortOrder: 13 },16  { key: "first-bonus", name: "First Bonus", description: "Trigger any bonus feature or free spins.", category: "features", metric: "bonuses", target: 1, rewardCredits: 500, rewardXp: 150, icon: "gift", sortOrder: 20 },17  { key: "bonus-50", name: "Feature Hunter", description: "Trigger 50 bonus features.", category: "features", metric: "bonuses", target: 50, rewardCredits: 5000, rewardXp: 1200, icon: "gift", sortOrder: 21 },18  { key: "jackpot-hunter", name: "Jackpot Hunter", description: "Land any fictional jackpot tier.", category: "features", metric: "jackpots", target: 1, rewardCredits: 2500, rewardXp: 500, icon: "diamond", sortOrder: 22 },19  { key: "explorer", name: "Explorer", description: "Play 3 different Spinza games.", category: "discovery", metric: "games_played", target: 3, rewardCredits: 750, rewardXp: 200, icon: "compass", sortOrder: 30 },20  { key: "play-10-games", name: "Curious Mind", description: "Play 10 different Spinza games.", category: "discovery", metric: "games_played", target: 10, rewardCredits: 3000, rewardXp: 800, icon: "compass", sortOrder: 31 },21  { key: "play-all-games", name: "Play Every Spinza Game", description: "Play every game in the library.", category: "discovery", metric: "games_played", target: GAMES.length, rewardCredits: 10000, rewardXp: 2500, icon: "globe", sortOrder: 32 },22  { key: "level-10", name: "Rising Star", description: "Reach level 10.", category: "progression", metric: "level", target: 10, rewardCredits: 2000, rewardXp: 0, icon: "star", sortOrder: 40 },23  { key: "level-25", name: "Veteran", description: "Reach level 25.", category: "progression", metric: "level", target: 25, rewardCredits: 7500, rewardXp: 0, icon: "star", sortOrder: 41 },24  { key: "level-50", name: "Legend", description: "Reach level 50.", category: "progression", metric: "level", target: 50, rewardCredits: 25000, rewardXp: 0, icon: "star", sortOrder: 42 },25  { key: "streak-7", name: "Full Week", description: "Claim the daily reward 7 days in a row.", category: "progression", metric: "daily_streak", target: 7, rewardCredits: 3000, rewardXp: 500, icon: "calendar", sortOrder: 43 },26];2728const MISSIONS: (typeof missions.$inferInsert)[] = [29  { key: "daily-spins-50", name: "Warm the reels", description: "Play 50 spins today.", period: "daily", metric: "spins", target: 50, rewardCredits: 400, rewardXp: 80, sortOrder: 1 },30  { key: "daily-wins-10", name: "Ten hits", description: "Win 10 rounds today.", period: "daily", metric: "wins", target: 10, rewardCredits: 300, rewardXp: 60, sortOrder: 2 },31  { key: "daily-games-3", name: "Tour the floor", description: "Play 3 different games today.", period: "daily", metric: "games", target: 3, rewardCredits: 500, rewardXp: 100, sortOrder: 3 },32  { key: "daily-bonus-1", name: "Feature time", description: "Trigger a bonus or free spins today.", period: "daily", metric: "bonuses", target: 1, rewardCredits: 600, rewardXp: 120, sortOrder: 4 },33  { key: "weekly-spins-1000", name: "Marathon", description: "Play 1,000 spins this week.", period: "weekly", metric: "spins", target: 1000, rewardCredits: 4000, rewardXp: 800, sortOrder: 10 },34  { key: "weekly-bonus-5", name: "Bonus streak", description: "Trigger 5 bonus features this week.", period: "weekly", metric: "bonuses", target: 5, rewardCredits: 3000, rewardXp: 600, sortOrder: 11 },35  { key: "weekly-100x", name: "Century", description: "Win 100× your bet this week.", period: "weekly", metric: "multiplier", target: 100, rewardCredits: 5000, rewardXp: 1000, sortOrder: 12 },36  { key: "weekly-games-8", name: "Explorer's week", description: "Play 8 different games this week.", period: "weekly", metric: "games", target: 8, rewardCredits: 3500, rewardXp: 700, sortOrder: 13 },37];3839const FLAGS: (typeof featureFlags.$inferInsert)[] = [40  { key: "dailyRewards.enabled", enabled: true, description: "Daily reward claims" },41  { key: "leaderboards.enabled", enabled: true, description: "Public leaderboards" },42  { key: "missions.enabled", enabled: true, description: "Daily & weekly missions" },43  { key: "achievements.enabled", enabled: true, description: "Achievements" },44  { key: "rescue.enabled", enabled: true, description: "Rescue credits at zero balance" },45  { key: "registration.enabled", enabled: true, description: "New account creation" },46  ...GAMES.map((g) => ({ key: `game.${g.slug}.enabled`, enabled: true, description: `Game: ${g.name}` })),47];4849const SETTINGS: (typeof platformSettings.$inferInsert)[] = [50  { key: "maintenance", value: { enabled: false, message: "Spinza is getting an upgrade. Your credits and progress are safe." } },51  { key: "rescue", value: { amount: RESCUE_CREDITS_AMOUNT, cooldownHours: RESCUE_CREDITS_COOLDOWN_HOURS, threshold: 0 } },52  { key: "dailyRewards", value: { schedule: DAILY_REWARDS } },53  { key: "profanity", value: { words: [] } },54];5556const TITLES = ["Rookie", "Player", "Regular", "Spinner", "Ace", "Pro", "Expert", "Master", "Grandmaster", "Legend"];5758async function main() {59  const db = getDb();60  console.log("[seed] games");61  await syncGames(db, console.log);6263  console.log("[seed] achievements");64  for (const a of ACHIEVEMENTS) await db.insert(achievements).values(a).onConflictDoUpdate({ target: achievements.key, set: { ...a } });6566  console.log("[seed] missions");67  for (const m of MISSIONS) await db.insert(missions).values(m).onConflictDoUpdate({ target: missions.key, set: { ...m } });6869  console.log("[seed] player levels");70  for (let l = 1; l <= MAX_LEVEL; l++) {71    const row = { level: l, xpRequired: l < MAX_LEVEL ? xpForLevel(l) : 0, xpCumulative: xpThreshold(l), rewardCredits: l === 1 ? 0 : levelUpReward(l), title: TITLES[Math.min(TITLES.length - 1, Math.floor((l - 1) / 10))] };72    await db.insert(playerLevels).values(row).onConflictDoUpdate({ target: playerLevels.level, set: row });73  }7475  console.log("[seed] feature flags");76  for (const f of FLAGS) await db.insert(featureFlags).values(f).onConflictDoNothing();7778  console.log("[seed] platform settings");79  for (const s of SETTINGS) await db.insert(platformSettings).values(s).onConflictDoNothing();8081  console.log("[seed] done");82  await closeDb();83}8485main().catch((e) => {86  console.error("[seed] failed", e);87  process.exit(1);88});89