← back to browse
goat command

screenshot

No description

0
views
0
likes
0
installs

Aliases: ss, webss

raw source
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const stream = require('stream');
const { promisify } = require('util');

const pipeline = promisify(stream.pipeline);
const API_ENDPOINT = "https://dev.oculux.xyz/api/screenshot";
const CACHE_DIR = path.join(__dirname, 'cache');

module.exports = {
  config: {
    name: "screenshot",
    aliases: ["ss", "webss"],
    version: "1.0",
    author: "NeoKEX",
    countDown: 10,
    role: 2,
    longDescription: "Captures a full-page screenshot of a given website URL.",
    category: "tools",
    guide: {
      en: "{pn} <URL> (e.g., {pn} https://google.com)"
    }
  },

  onStart: async function ({ args, message, event }) {
    const userUrl = args[0];

    if (!userUrl) {
      return message.reply("❌ Please provide a URL to capture. Example: `!screenshot https://google.com`");
    }

    // Basic URL validation
    if (!userUrl.startsWith('http://') && !userUrl.startsWith('https://')) {
        return message.reply("❌ Invalid URL. Please include `http://` or `https://`.");
    }

    if (!fs.existsSync(CACHE_DIR)) {
        fs.mkdirSync(CACHE_DIR, { recursive: true });
    }

    message.reaction("⏳", event.messageID);
    
    let tempFilePath;

    try {
      // Construct the full API URL
      const fullApiUrl = `${API_ENDPOINT}?url=${encodeURIComponent(userUrl)}`;
      
      // Request the screenshot image stream
      const imageDownloadResponse = await axios.get(fullApiUrl, {
          responseType: 'stream',
          timeout: 60000 
      });

      if (imageDownloadResponse.status !== 200) {
           throw new Error(`API request failed with status code ${imageDownloadResponse.status}.`);
      }

      // Create a unique temporary file path
      const fileHash = Date.now() + Math.random().toString(36).substring(2, 8);
      tempFilePath = path.join(CACHE_DIR, `screenshot_${fileHash}.png`);
      
      // Pipe the image stream to the file
      await pipeline(imageDownloadResponse.data, fs.createWriteStream(tempFilePath));

      message.reaction("✅", event.messageID);
      
      // Reply with the screenshot
      await message.reply({
        body: `✨ Here is the screenshot for ${userUrl}`,
        attachment: fs.createReadStream(tempFilePath)
      });

    } catch (error) {
      message.reaction("❌", event.messageID);
      
      let errorMessage = "An error occurred during screenshot generation.";
      if (error.response) {
         errorMessage = `HTTP Error: ${error.response.status}. The URL may be invalid or unreachable.`;
      } else if (error.code === 'ETIMEDOUT') {
         errorMessage = `Request timed out (60 seconds).`;
      } else if (error.message) {
         errorMessage = `${error.message}`;
      }

      console.error("Screenshot Command Error:", error);
      message.reply(`❌ ${errorMessage}`);
      
    } finally {
      // Clean up the temporary file
      if (tempFilePath && fs.existsSync(tempFilePath)) {
          fs.unlinkSync(tempFilePath);
      }
    }
  }
};

View raw file