piclets / src /lib /db /schema.ts
Fraser's picture
user hf connection
6b45861
import type { PicletType } from '../types/picletTypes';
// Discovery Status
export enum DiscoveryStatus {
NEW = 'new',
VARIATION = 'variation',
EXISTING = 'existing'
}
// PicletInstance - Individual monster instances discovered by players
export interface PicletInstance {
id?: number;
// Basic Info
typeId: string; // Unique identifier for this specific Piclet
objectName: string; // Canonical object name (e.g., "pillow", "pyramid")
nickname?: string;
primaryType: PicletType;
tier: string; // 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary'
// Discovery Metadata
isCanonical: boolean; // True if this is the canonical version
canonicalId?: string; // Reference to canonical Piclet if this is a variation
variationAttributes?: string[]; // e.g., ["velvet", "blue"] for variations
discoveredBy?: string; // DEPRECATED: Legacy username field (use discovererUsername)
discovererSub?: string; // HF user ID (stable primary key)
discovererUsername?: string; // HF username (cached for display)
discovererName?: string; // Display name (cached)
discovererPicture?: string; // Avatar URL (cached)
discoveredAt: Date; // When first discovered
scanCount: number; // Total times this Piclet has been scanned
// Collection Management
isInCollection: boolean; // Whether player has discovered this
collectedAt?: Date; // When player discovered it
// Visual Data
imageUrl: string;
imageData?: string; // Base64 encoded image with transparency
imageCaption: string; // Original caption from image
visualDetails?: string; // Extra visual details for monster generation
concept: string; // Generated monster concept
description: string; // Generated monster description
imagePrompt: string; // Prompt used for image generation
// Physical Characteristics
height?: string; // e.g., "1.2m", "3'5\""
weight?: string; // e.g., "15kg", "33 lbs"
personality?: string; // e.g., "Playful and curious", "Shy but loyal"
}
// ActivityEntry - Recent discoveries and leaderboard
export interface ActivityEntry {
id?: number;
// Type
type: 'discovery' | 'variation' | 'milestone';
// Details
title: string;
description: string;
picletTypeId: string;
discovererName: string;
discovererPicture?: string; // Avatar URL
discovererSub?: string; // For linking to user profiles
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary';
// Timing
createdAt: Date;
}
// GameState - Discovery progress and stats
export interface GameState {
id?: number;
// Timing
lastActivityRefresh: Date;
lastPlayed: Date;
// Discovery Stats
totalDiscoveries: number;
uniqueDiscoveries: number; // Canonical Piclets found
variationsFound: number;
rarityScore: number; // Sum of rarity points
currentStreak: number; // Days in a row with discoveries
// Cached server data
lastServerSync?: Date;
cachedLeaderboard?: LeaderboardEntry[];
}
// LeaderboardEntry - For activity feed
export interface LeaderboardEntry {
username: string;
totalDiscoveries: number;
uniqueDiscoveries: number;
rarityScore: number;
rank: number;
}
// UserProfile - HuggingFace user profile data
export interface UserProfile {
sub: string; // HF user ID (primary key)
preferred_username: string; // Current username
name?: string; // Display name
picture?: string; // Avatar URL
lastSeen: Date; // Last OAuth login
totalDiscoveries: number; // Cached stat
uniqueDiscoveries: number; // Cached stat
visibility: 'public' | 'private'; // Privacy setting (default: public)
}
// Trainer Scanning Progress - Track automated trainer piclet generation
export interface TrainerScanProgress {
id?: number;
// Image Info
imagePath: string; // e.g., "trainer_images/001_Willow_Snap/image_001.jpg"
trainerName: string; // e.g., "001_Willow_Snap"
imageIndex: number; // e.g., 1, 2, 3 for multiple images per trainer
// Processing Status
status: 'pending' | 'processing' | 'completed' | 'failed';
// Results
picletInstanceId?: number; // ID of generated piclet if successful
errorMessage?: string; // Error details if failed
// Timing
startedAt?: Date;
completedAt?: Date;
// Remote URL for reference
remoteUrl: string; // Full HuggingFace URL
}