Back

Upfile to github

75 views
rapp Code by: @rapp

Description

Base url: https://github.com Fitur yang dapat digunakan untuk mengupload file ke repository github

Features

Code (javascript)

upfile.js
import { Octokit } from '@octokit/rest';
import AdmZip from 'adm-zip';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const octokit = new Octokit({ 
  auth: "ghp_123",
  userAgent: 'WhatsApp-Bot v1.0'
});

const MAX_FILE_SIZE = 100 * 1024 * 1024; // 100MB

async function uploadToGitHub(repoName, filePath, fileContent, isBase64 = false) {
  try {
    const content = isBase64 ? fileContent : Buffer.from(fileContent).toString('base64');
    
    let sha = null;
    try {
      const { data } = await octokit.repos.getContent({
        owner: (await octokit.users.getAuthenticated()).data.login,
        repo: repoName,
        path: filePath
      });
      sha = data.sha;
    } catch (error) {
      if (error.status !== 404) throw error;
    }

    await octokit.repos.createOrUpdateFileContents({
      owner: (await octokit.users.getAuthenticated()).data.login,
      repo: repoName,
      path: filePath,
      message: `Upload ${filePath}`,
      content: content,
      sha: sha
    });

    return true;
  } catch (error) {
    console.error('GitHub upload error:', error);
    throw new Error(`Failed to upload to GitHub: ${error.message}`);
  }
}

function GetType(Data) {
  return new Promise((resolve, reject) => {
    let Result, Status;
    if (Buffer.isBuffer(Data)) {
      Result = Buffer.from(Data).toString("base64");
      Status = 0;
    } else {
      Status = 1;
    }
    resolve({
      status: Status,
      result: Result,
    });
  });
}

const handler = async (m, { conn, text, usedPrefix, command }) => {
  if (!m.quoted) {
    throw `❌ Mohon reply file ZIP yang akan diupload!\n\nContoh: ${usedPrefix + command} nama-repo`;
  }

  if (!text) {
    throw `❌ Format salah!\nGunakan: ${usedPrefix + command} <nama-repo>`;
  }

  let tempFilePath;
  try {
    const repoName = text.trim();
    
    let media;
    try {
      media = await conn.downloadMediaMessage(m.quoted, 'buffer', {}, {
        reuploadRequest: conn.updateMediaMessage
      });
    } catch (downloadError) {
      console.error('Download error:', downloadError);
      throw "❌ Gagal mendownload file. Pastikan Anda mereply file ZIP yang valid.";
    }

    if (!media || media.length === 0) {
      throw "❌ File kosong atau tidak valid!";
    }

    const tempDir = './tmp/';
    if (!fs.existsSync(tempDir)) {
      fs.mkdirSync(tempDir, { recursive: true });
    }
    
    let fileName = `upload_${Date.now()}.zip`;
    const quotedMsg = m.quoted.message;
    const docMsg = quotedMsg?.documentMessage || 
                  quotedMsg?.extendedTextMessage?.contextInfo?.quotedMessage?.documentMessage;
    
    if (docMsg?.fileName) {
      fileName = docMsg.fileName;
    }

    tempFilePath = path.join(tempDir, fileName);
    fs.writeFileSync(tempFilePath, media);

    const zip = new AdmZip(tempFilePath);
    const zipEntries = zip.getEntries();
    let extractedCount = 0;
    let uploadedFolders = new Set();
    let rootFolder = null;

    // Cari root folder
    for (const entry of zipEntries) {
      if (entry.isDirectory) {
        const pathParts = entry.entryName.split('/').filter(p => p);
        if (pathParts.length === 1) {
          rootFolder = pathParts[0];
          break;
        }
      }
    }

    // Upload file-file dari ZIP
    for (const entry of zipEntries) {
      if (entry.isDirectory) continue;

      const fullPath = entry.entryName;
      let targetPath = fullPath;

      // Hilangkan root folder dari path jika ada
      if (rootFolder && fullPath.startsWith(rootFolder + '/')) {
        targetPath = fullPath.substring(rootFolder.length + 1);
      }

      // Buat folder structure
      const pathParts = targetPath.split('/').filter(p => p);
      if (pathParts.length > 1) {
        let currentPath = '';
        for (let i = 0; i < pathParts.length - 1; i++) {
          currentPath += (currentPath ? '/' : '') + pathParts[i];
          if (!uploadedFolders.has(currentPath)) {
            await uploadToGitHub(repoName, currentPath + '/.gitkeep', Buffer.from(''), false);
            uploadedFolders.add(currentPath);
          }
        }
      }

      // Upload file
      await uploadToGitHub(repoName, targetPath, entry.getData());
      extractedCount++;
    }

    // Upload file ZIP asli juga
    await uploadToGitHub(repoName, fileName, media);

    const userInfo = await octokit.users.getAuthenticated();
    const githubUrl = `https://github.com/${userInfo.data.login}/${repoName}`;
    
    m.reply(`✅ Berhasil mengupload file ke GitHub!\n\n📦 File diupload: ${extractedCount}\n📁 Folder dibuat: ${uploadedFolders.size}\n🔗 Repository: ${githubUrl}`);
    
  } catch (e) {
    console.error('Error:', e);
    throw `❌ Gagal memproses: ${e.message}`;
  } finally {
    // Cleanup temporary file
    if (tempFilePath && fs.existsSync(tempFilePath)) {
      fs.unlinkSync(tempFilePath);
    }
  }
}

handler.help = ['upfile <nama_repo>'];
handler.tags = ['tools'];
handler.command = ['upfile', 'uploadfile'];

export default handler;