commands/handlers/curl-handler.js

const { default: axios } = require('axios');

const { url_start_regex } = require("../utils");

const definition = {
    command_name: 'curl',
    args: [
        {
            name: 'url',
            type: 'string',
            description: 'Сссылка на ресурс.'
        }
    ],
    limit: 1,
    description: 'Возвращает результат GET запроса к заданному ресурсу.',
    is_inline: false,
};

const condition = true;

/**
 * `/curl` command handler
 * @param {Object} interaction
 * @returns {[String | null, Object | null]} [error, response]
 */

async function handler(interaction) {
    let arg = interaction.args && interaction.args[0];

    if (!arg) {
        return {
            type: 'error',
            text: `Не хватает URL`
        };
    }

    arg = arg.replace(url_start_regex, 'https://');

    let result;
    try {
        result = await axios.get(arg,
            { 
                responseType: 'arraybuffer' 
            }
        );
    }
    catch (err) {
        interaction.logger.error(`Error while curling ${arg}`, { error: err.stack || err });
    }

    if (!result) {
        arg = arg.replace(url_start_regex, 'http://');
        try {
            result = await axios.get(
                arg,
                { 
                    responseType: 'arraybuffer' 
                }
            );
        }
        catch (err) {
            interaction.logger.error(`Error while curling ${arg}`, { error: err.stack || err });
            return {
                type: 'error',
                text: `Что-то пошло не так\nНе могу получить данные по этой ссылке`
            };
        }
    }

    if (!result) {
        return {
            type: 'error',
            text: `Что-то пошло не так\nНе могу получить данные по этой ссылке`
        };
    }
    let filename = arg.split('/').slice(-1)[0] || 'response';

    let type = 'document';

    let caption = `<pre>HTTP/${result.request.res.httpVersion} ${result.status} ${result.statusText}\n`;
    for (const [key, value] of Object.entries(result.headers)) {
        caption += `${key}: ${value}\n`;
    }
    caption += '</pre>';

    if (caption.length >= 1024) {
        caption = `${caption.slice(0, 1015)}...</pre>`;
    }

    if (result.headers['content-type'].includes('text/html')) {
        type = 'document';
        filename = `${filename}.html`;
        result = Buffer.from(result.data);
    }
    else if (result.headers['content-type'].includes('application/json')) {
        type = 'document';
        filename = `${filename}.json`;
        result = Buffer.from(result.data);
    }
    else if (result.headers['content-type'].includes('text/plain')) {
        type = 'document';
        filename = `${filename}.txt`;
        result = Buffer.from(result.data);
    }
    else if (result.headers['content-type'].includes('image/png')
        || result.headers['content-type'].includes('image/jpeg')
        || result.headers['content-type'].includes('image/jpg')
        || result.headers['content-type'].includes('image/gif')) {
        type = 'photo';
        let extension = result.headers['content-type'].split('/')[1];
        if (!filename.endsWith(extension)){
            filename = `${filename}.${extension}`;
        }
        result = Buffer.from(result.data);
    }
    else {
        type = 'document';
        result = Buffer.from(result.data);
    }
    return {
        type: type,
        media: result,
        filename: filename,
        text: caption
    };
}

module.exports = {
    handler,
    definition,
    condition
}