@stack.thefennec.dev/telegram-export-parser
Version:
TypeScript library for parsing Telegram Desktop's data export with full type safety
214 lines • 8.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MESSAGE_PARSERS = void 0;
const types_1 = require("../types");
const base_1 = require("./base");
const parser_1 = require("../core/parser");
// =====================================================
// SPECIALIZED MESSAGE PARSERS
// =====================================================
const photoMessageParser = (0, parser_1.createParser)({
name: 'photo-message',
priority: 90,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && Boolean(raw.photo),
parse: (raw) => ({
...(0, base_1.parseBaseMessage)(raw),
...(0, base_1.parseMediaWithDimensions)(raw),
...(0, base_1.parseSelfDestructibleMessage)(raw),
photoURL: (0, base_1.parseExportedFile)(raw.photo),
photoFileSize: raw.photo_file_size ?? 0,
mediaSpoiler: raw.media_spoiler ?? false
})
});
const locationMessageParser = (0, parser_1.createParser)({
name: 'location-message',
priority: 85,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && Boolean(raw.location_information),
parse: (raw) => ({
...(0, base_1.parseBaseMessage)(raw),
locationInformation: raw.location_information,
address: raw.address,
placeName: raw.place_name,
liveLocationPeriodSeconds: raw.live_location_period_seconds
})
});
const contactMessageParser = (0, parser_1.createParser)({
name: 'contact-message',
priority: 80,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && Boolean(raw.contact_information),
parse: (raw) => ({
...(0, base_1.parseBaseMessage)(raw),
contactInformation: raw.contact_information,
contactVcardURL: (0, base_1.parseExportedFile)(raw.contact_vcard),
contactVcardFileSize: raw.contact_vcard_file_size
})
});
const pollMessageParser = (0, parser_1.createParser)({
name: 'poll-message',
priority: 75,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && Boolean(raw.poll),
parse: (raw) => ({
...(0, base_1.parseBaseMessage)(raw),
poll: raw.poll
})
});
const gameMessageParser = (0, parser_1.createParser)({
name: 'game-message',
priority: 70,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && Boolean(raw.game_title),
parse: (raw) => ({
...(0, base_1.parseBaseMessage)(raw),
gameTitle: raw.game_title,
gameDescription: raw.game_description,
gameLink: raw.game_link
})
});
const invoiceMessageParser = (0, parser_1.createParser)({
name: 'invoice-message',
priority: 65,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && Boolean(raw.invoice_information),
parse: (raw) => ({
...(0, base_1.parseBaseMessage)(raw),
invoiceInformation: (0, base_1.parseInvoiceInfo)(raw.invoice_information)
})
});
// =====================================================
// MEDIA MESSAGE PARSERS
// =====================================================
const stickerMessageParser = (0, parser_1.createParser)({
name: 'sticker-message',
priority: 60,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && raw.media_type === 'sticker',
parse: (raw) => {
const base = (0, base_1.parseBaseMessage)(raw);
return {
...(0, base_1.parseBaseMediaMessage)(raw, base),
...(0, base_1.parseMediaWithDimensions)(raw),
...(0, base_1.parseMediaWithDuration)(raw),
...(0, base_1.parseMediaWithThumbnail)(raw),
mediaType: types_1.MEDIA_TYPES.STICKER,
emoji: raw.sticker_emoji ?? ''
};
}
});
const animationMessageParser = (0, parser_1.createParser)({
name: 'animation-message',
priority: 55,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && raw.media_type === 'animation',
parse: (raw) => {
const base = (0, base_1.parseBaseMessage)(raw);
return {
...(0, base_1.parseBaseMediaMessage)(raw, base),
...(0, base_1.parseMediaWithDimensions)(raw),
...(0, base_1.parseMediaWithDuration)(raw),
...(0, base_1.parseMediaWithThumbnail)(raw),
mediaType: types_1.MEDIA_TYPES.ANIMATION
};
}
});
const musicMessageParser = (0, parser_1.createParser)({
name: 'music-message',
priority: 50,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && raw.media_type === 'audio_file',
parse: (raw) => {
const base = (0, base_1.parseBaseMessage)(raw);
return {
...(0, base_1.parseBaseMediaMessage)(raw, base),
...(0, base_1.parseMediaWithDuration)(raw),
...(0, base_1.parseMediaWithThumbnail)(raw),
mediaType: types_1.MEDIA_TYPES.AUDIO_FILE,
performer: raw.performer,
title: raw.title
};
}
});
const videoMessageParser = (0, parser_1.createParser)({
name: 'video-message',
priority: 45,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && raw.media_type === 'video_file',
parse: (raw) => {
const base = (0, base_1.parseBaseMessage)(raw);
return {
...(0, base_1.parseBaseMediaMessage)(raw, base),
...(0, base_1.parseMediaWithDimensions)(raw),
...(0, base_1.parseMediaWithDuration)(raw),
...(0, base_1.parseMediaWithThumbnail)(raw),
mediaType: types_1.MEDIA_TYPES.VIDEO_FILE
};
}
});
const videoNoteMessageParser = (0, parser_1.createParser)({
name: 'video-note-message',
priority: 40,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && raw.media_type === 'video_message',
parse: (raw) => {
const base = (0, base_1.parseBaseMessage)(raw);
return {
...(0, base_1.parseBaseMediaMessage)(raw, base),
...(0, base_1.parseMediaWithDimensions)(raw),
...(0, base_1.parseMediaWithDuration)(raw),
...(0, base_1.parseMediaWithThumbnail)(raw),
mediaType: types_1.MEDIA_TYPES.VIDEO_NOTE
};
}
});
const voiceNoteMessageParser = (0, parser_1.createParser)({
name: 'voice-note-message',
priority: 35,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && raw.media_type === 'voice_message',
parse: (raw) => {
const base = (0, base_1.parseBaseMessage)(raw);
return {
...(0, base_1.parseBaseMediaMessage)(raw, base),
...(0, base_1.parseMediaWithDuration)(raw),
mediaType: types_1.MEDIA_TYPES.VOICE_NOTE
};
}
});
const documentMessageParser = (0, parser_1.createParser)({
name: 'document-message',
priority: 30,
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE && raw.media_type === 'file',
parse: (raw) => {
const base = (0, base_1.parseBaseMessage)(raw);
return {
...(0, base_1.parseBaseMediaMessage)(raw, base),
...(0, base_1.parseMediaWithDimensions)(raw),
...(0, base_1.parseMediaWithThumbnail)(raw),
...(0, base_1.parseSelfDestructibleMessage)(raw),
mediaType: types_1.MEDIA_TYPES.FILE
};
}
});
// =====================================================
// TEXT MESSAGE PARSER (FALLBACK)
// =====================================================
const textMessageParser = (0, parser_1.createParser)({
name: 'text-message',
priority: 10, // Lowest priority - catches everything else
canHandle: (raw) => raw.type === types_1.MESSAGE_TYPES.MESSAGE,
parse: (raw) => (0, base_1.parseBaseMessage)(raw)
});
// =====================================================
// EXPORTS
// =====================================================
exports.MESSAGE_PARSERS = [
// Specialized messages (highest priority)
photoMessageParser,
locationMessageParser,
contactMessageParser,
pollMessageParser,
gameMessageParser,
invoiceMessageParser,
// Media messages (medium priority)
stickerMessageParser,
animationMessageParser,
musicMessageParser,
videoMessageParser,
videoNoteMessageParser,
voiceNoteMessageParser,
documentMessageParser,
// Text message fallback (lowest priority)
textMessageParser
];
//# sourceMappingURL=messages.js.map