"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PicSearcherApp = void 0; exports.processMessageImages = processMessageImages; exports.getFileBlob = getFileBlob; const App_1 = require("@rocket.chat/apps-engine/definition/App"); const defaultSauceNAOResponse = { header: { user_id: '', account_type: '', short_limit: '', long_limit: '', long_remaining: 0, short_remaining: 0, status: 0, results_requested: 0, index: {}, search_depth: '', minimum_similarity: 0, query_image_display: '', query_image: '', results_returned: 0, }, results: [], }; let myLogger; class PicSearcherApp extends App_1.App { constructor(info, logger, accessors) { super(info, logger, accessors); this.rootUrl = ''; myLogger = logger; } async initialize(configurationExtend, environmentRead) { this.rootUrl = await environmentRead.getEnvironmentVariables().getValueByName('ROOT_URL'); myLogger.log('rootUrl:', this.rootUrl); return super.initialize(configurationExtend, environmentRead); } checkPostMessageSent(message, read, http) { return Promise.resolve(true); } async executePostMessageSent(message, read, http, persistence, modify) { const author = await read.getUserReader().getAppUser(); if (!message.attachments || message.attachments.length <= 0) { return Promise.resolve(); } myLogger.info('message.attachments:', message.attachments); const imageBlobs = await processMessageImages(message, http, read); const result = await searchImageOnSauceNAO(imageBlobs[0].blob, imageBlobs[0].suffix); await sendSearchResults(modify, message.room, result, author); } async sendMessage(textMessage, room, author, modify) { const messageBuilder = modify.getCreator().startMessage({ text: textMessage, }); messageBuilder.setSender(author); messageBuilder.setRoom(room); return modify.getCreator().finish(messageBuilder); } } exports.PicSearcherApp = PicSearcherApp; async function processMessageImages(message, http, context) { const blobs = []; if (!message.attachments || message.attachments.length === 0) { throw new Error('No attachments found in the message.'); } for (const attachment of message.attachments) { if (attachment.imageUrl) { try { const fileId = attachment.imageUrl.split('/')[2]; const r = { blob: await getFileBlob(fileId, context), suffix: attachment.imageUrl.split('.').pop() || '', }; blobs.push(r); } catch (error) { throw new Error(`Error fetching image content: ${error.message}`); } } } return blobs; } async function getFileBlob(fileId, read) { try { const buffer = await read.getUploadReader().getBufferById(fileId); return new Blob([buffer]); } catch (error) { myLogger.error(`Error fetching file content: ${error.message}`); } return new Blob(); } async function searchImageOnSauceNAO(image, suffix) { const formData = new FormData(); formData.append('file', image, 'image.' + suffix); try { const response = await fetch('https://saucenao.com/search.php', { method: 'POST', body: formData, }); if (response.ok) { const results = []; const html = await response.text(); myLogger.info('HTML:', html); const resultBlocks = html.match(/