/** * 音效数据库操作模块 */ import type { DB } from './main'; /** * 音效记录(数据库) */ export interface SoundEffectRecord { id: string; name: string; description?: string; category: string; type: string; audio_source?: string; volume: number; duration?: number; metadata?: string; created_at: number; updated_at: number; is_system: number; } /** * 用户自定义音效记录(数据库) */ export interface UserSoundEffectRecord { id: string; name: string; description?: string; file_path: string; duration?: number; file_size?: number; created_at: number; updated_at: number; } /** * 音效数据库操作类 */ export class SoundEffectDb { private db: DB; constructor(db: DB) { this.db = db; } // ==================== 内置音效操作 ==================== /** * 获取所有系统内置音效 */ async getBuiltinEffects(): Promise { const results = await this.db.select( 'SELECT * FROM sound_effects WHERE is_system = 1 ORDER BY created_at ASC' ); return results || []; } /** * 清除所有系统内置音效(用于重新初始化) */ async clearBuiltinEffects(): Promise { await this.db.execute('DELETE FROM sound_effects WHERE is_system = 1'); console.log('[SoundEffectDb] 已清除所有系统内置音效'); } /** * 根据ID获取音效 */ async getSoundEffectById(id: string): Promise { const result = await this.db.first( 'SELECT * FROM sound_effects WHERE id = ?', [id] ); return result || null; } /** * 保存系统音效 */ async saveBuiltinEffect(effect: SoundEffectRecord): Promise { const existing = await this.getSoundEffectById(effect.id); if (existing) { // 更新 await this.db.execute( `UPDATE sound_effects SET name = ?, description = ?, category = ?, type = ?, audio_source = ?, volume = ?, duration = ?, metadata = ?, updated_at = ? WHERE id = ?`, [ effect.name, effect.description || null, effect.category, effect.type, effect.audio_source || null, effect.volume, effect.duration || null, effect.metadata || null, Date.now(), effect.id ] ); } else { // 插入 await this.db.execute( `INSERT INTO sound_effects ( id, name, description, category, type, audio_source, volume, duration, metadata, created_at, updated_at, is_system ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ effect.id, effect.name, effect.description || null, effect.category, effect.type, effect.audio_source || null, effect.volume, effect.duration || null, effect.metadata || null, Date.now(), Date.now(), 1 ] ); } } // ==================== 用户自定义音效操作 ==================== /** * 获取所有用户自定义音效 */ async getUserEffects(): Promise { const results = await this.db.select( 'SELECT * FROM user_sound_effects ORDER BY created_at DESC' ); return results || []; } /** * 根据ID获取用户音效 */ async getUserEffectById(id: string): Promise { const result = await this.db.first( 'SELECT * FROM user_sound_effects WHERE id = ?', [id] ); return result || null; } /** * 保存用户自定义音效 */ async saveUserEffect(effect: UserSoundEffectRecord): Promise { const existing = await this.getUserEffectById(effect.id); if (existing) { // 更新 await this.db.execute( `UPDATE user_sound_effects SET name = ?, description = ?, file_path = ?, duration = ?, file_size = ?, updated_at = ? WHERE id = ?`, [ effect.name, effect.description || null, effect.file_path, effect.duration || null, effect.file_size || null, Date.now(), effect.id ] ); } else { // 插入 await this.db.execute( `INSERT INTO user_sound_effects ( id, name, description, file_path, duration, file_size, created_at, updated_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [ effect.id, effect.name, effect.description || null, effect.file_path, effect.duration || null, effect.file_size || null, Date.now(), Date.now() ] ); } } /** * 删除用户自定义音效 */ async deleteUserEffect(id: string): Promise { await this.db.execute( 'DELETE FROM user_sound_effects WHERE id = ?', [id] ); } /** * 检查音效名称是否已存在 */ async isNameExists(name: string, excludeId?: string): Promise { let sql = 'SELECT COUNT(*) as count FROM user_sound_effects WHERE name = ?'; const params: any[] = [name]; if (excludeId) { sql += ' AND id != ?'; params.push(excludeId); } const result = await this.db.first(sql, params); return result && result.count > 0; } }