Files
lingxi-web/server/src/business.js
T

77 lines
2.9 KiB
JavaScript

export function telegramAttachment(content = {}) {
const type = content['@type']
if (type === 'messagePhoto') {
const sizes = Array.isArray(content.photo?.sizes) ? content.photo.sizes : []
const file = sizes.at(-1)?.photo
return file?.id ? {
telegramFileId: Number(file.id),
attachmentName: `telegram-photo-${file.id}.jpg`,
attachmentMimeType: 'image/jpeg',
attachmentSize: Number(file.size || file.expected_size || 0),
} : {}
}
if (type === 'messageDocument') {
const document = content.document || {}
const file = document.document
return file?.id ? {
telegramFileId: Number(file.id),
attachmentName: document.file_name || `document-${file.id}`,
attachmentMimeType: document.mime_type || 'application/octet-stream',
attachmentSize: Number(file.size || file.expected_size || 0),
} : {}
}
if (type === 'messageVoiceNote') {
const file = content.voice_note?.voice
return file?.id ? {
telegramFileId: Number(file.id),
attachmentName: `voice-${file.id}.ogg`,
attachmentMimeType: content.voice_note?.mime_type || 'audio/ogg',
attachmentSize: Number(file.size || file.expected_size || 0),
duration: Number(content.voice_note?.duration || 0),
} : {}
}
if (type === 'messageAudio') {
const audio = content.audio || {}
const file = audio.audio
return file?.id ? {
telegramFileId: Number(file.id),
attachmentName: audio.file_name || audio.title || `audio-${file.id}`,
attachmentMimeType: audio.mime_type || 'audio/mpeg',
attachmentSize: Number(file.size || file.expected_size || 0),
duration: Number(audio.duration || 0),
} : {}
}
if (type === 'messageSticker') {
const sticker = content.sticker || {}
const file = sticker.sticker
const format = sticker.format?.['@type']
const extension = format === 'stickerFormatTgs' ? 'tgs' : format === 'stickerFormatWebm' ? 'webm' : 'webp'
return file?.id ? {
telegramFileId: Number(file.id),
attachmentName: `sticker-${file.id}.${extension}`,
attachmentMimeType: extension === 'webp' ? 'image/webp' : extension === 'webm' ? 'video/webm' : 'application/x-tgsticker',
attachmentSize: Number(file.size || file.expected_size || 0),
stickerEmoji: sticker.emoji || '',
} : {}
}
return {}
}
export const dateKey = (value = Date.now()) => {
const date = new Date(value)
return Number.isNaN(date.getTime()) ? '' : date.toISOString().slice(0, 10)
}
export const percent = (numerator, denominator) =>
denominator ? Math.round((numerator / denominator) * 1000) / 10 : 0
export const countBy = (list, key) => {
const counts = new Map()
for (const item of list) {
const value = typeof key === 'function' ? key(item) : item[key]
if (!value) continue
counts.set(String(value), (counts.get(String(value)) || 0) + 1)
}
return counts
}