up
All checks were successful
Deploy to Production / deploy (push) Successful in 8s

This commit is contained in:
lubukhu
2026-01-24 13:35:11 +07:00
parent 6c3e93636e
commit 65fd0158a3
145 changed files with 10262 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
/**
* GameDataHandler - Data Sanitizer & Scorer
*
* Game Codes:
* - G001: Quiz text-text
* - G002: Quiz audio-text (audio question, text answer)
* - G003: Quiz text-audio (text question, audio answer)
* - G004: Quiz image-text (image question, text answer)
* - G005: Quiz text-image (text question, image answer)
*
* - G110: Sequence Word - no audio
* - G111: Sequence Word - có audio, missing_letter_count từ item
* - G112: Sequence Word - có audio, missing_letter_count từ item
* - G113: Sequence Word - có audio, missing_letter_count từ item
*
* - G120: Sequence Sentence - no audio
* - G121: Sequence Sentence - có audio, missing_letter_count từ item
* - G122: Sequence Sentence - có audio, missing_letter_count từ item
* - G123: Sequence Sentence - có audio, missing_letter_count từ item
*/
export type GameCode = 'G001' | 'G002' | 'G003' | 'G004' | 'G005' | 'G110' | 'G111' | 'G112' | 'G113' | 'G120' | 'G121' | 'G122' | 'G123';
export declare const GAME_CODES: {
readonly G001: {
readonly name: "Quiz Text-Text";
readonly category: "quiz";
readonly hasAudio: false;
readonly hasImage: false;
};
readonly G002: {
readonly name: "Quiz Audio-Text";
readonly category: "quiz";
readonly hasAudio: true;
readonly hasImage: false;
};
readonly G003: {
readonly name: "Quiz Text-Audio";
readonly category: "quiz";
readonly hasAudio: true;
readonly hasImage: false;
};
readonly G004: {
readonly name: "Quiz Image-Text";
readonly category: "quiz";
readonly hasAudio: false;
readonly hasImage: true;
};
readonly G005: {
readonly name: "Quiz Text-Image";
readonly category: "quiz";
readonly hasAudio: false;
readonly hasImage: true;
};
readonly G110: {
readonly name: "Sequence Word";
readonly category: "sequence_word";
readonly hasAudio: false;
};
readonly G111: {
readonly name: "Sequence Word Audio";
readonly category: "sequence_word";
readonly hasAudio: true;
};
readonly G112: {
readonly name: "Sequence Word Audio";
readonly category: "sequence_word";
readonly hasAudio: true;
};
readonly G113: {
readonly name: "Sequence Word Audio";
readonly category: "sequence_word";
readonly hasAudio: true;
};
readonly G120: {
readonly name: "Sequence Sentence";
readonly category: "sequence_sentence";
readonly hasAudio: false;
};
readonly G121: {
readonly name: "Sequence Sentence Audio";
readonly category: "sequence_sentence";
readonly hasAudio: true;
};
readonly G122: {
readonly name: "Sequence Sentence Audio";
readonly category: "sequence_sentence";
readonly hasAudio: true;
};
readonly G123: {
readonly name: "Sequence Sentence Audio";
readonly category: "sequence_sentence";
readonly hasAudio: true;
};
};
export declare function getGameCategory(code: GameCode): string;
/**
* Sanitize game data before sending to iframe
* CRITICAL: Never send answers/correct data to client
*/
export declare function sanitizeForClient(code: GameCode, items: any[]): any[];
export interface AnswerCheckResult {
isCorrect: boolean;
score: number;
feedback?: string;
}
/**
* Check if player's answer is correct
*
* @param code - Game code (G001, G110, etc.)
* @param originalItem - Original item from server (has answer field!)
* @param playerAnswer - Player's answer (text for quiz, array for sequence)
*/
export declare function checkAnswer(code: GameCode, originalItem: any, playerAnswer: any): AnswerCheckResult;
//# sourceMappingURL=GameDataHandler.d.ts.map