// code from goatstore // api: https://store.agi.bd const axios = require("axios"); const fs = require("fs-extra"); const path = require("path"); const API_JSON_URL = "https://raw.githubusercontent.com/Rahat-Islam10/-Rahat-Boss-/refs/heads/main/api.json"; module.exports = { config: { name: "latti2", // โš ๏ธ Don't change name version: "2.0", author: "๐Ÿ”ฐ๐‘๐€๐‡๐€๐“ ๐ˆ๐’๐‹๐€๐Œ๐Ÿ”ฐ", // โš ๏ธ Don't change credit countDown: 5, role: 0, category: "image", shortDescription: "image generate", longDescription: "Generate latti2 image", guide: "{pn} [@mention/reply/uid/link]" }, onStart: async function ({ api, event, args }) { // ============================== // Get UID by full name // ============================== async function getUIDByFullName(threadID, body) { if (!body || !body.includes("@")) return null; const match = body.match(/@(.+)/); if (!match) return null; const targetName = match[1] .trim() .toLowerCase() .replace(/\s+/g, " "); const threadInfo = await api.getThreadInfo(threadID); const users = threadInfo.userInfo || []; const user = users.find(u => { if (!u.name) return false; const fullName = u.name .trim() .toLowerCase() .replace(/\s+/g, " "); return fullName === targetName; }); return user ? user.id : null; } // ============================== // Get API list // ============================== async function getApiList(commandName) { const res = await axios.get(API_JSON_URL, { timeout: 15000 }); const data = res.data || {}; const cmdData = data[commandName]; if (!cmdData || !cmdData.api) { throw new Error( `โŒ "${commandName}" API เฆชเฆพเฆ“เงŸเฆพ เฆฏเฆพเงŸเฆจเฆฟ` ); } const apiList = [ cmdData.api, ...(cmdData.backupApis || []) ].filter(Boolean); if (!apiList.length) { throw new Error( `โŒ "${commandName}" API เฆชเฆพเฆ“เงŸเฆพ เฆฏเฆพเงŸเฆจเฆฟ` ); } return apiList; } // ============================== // Generate Frame // ============================== async function generateFrameWithFallback({ senderID, mention, credit, apiList }) { let lastError = null; for (const baseApi of apiList) { const cleanBase = baseApi.replace(/\/+$/, ""); const apiUrl = `${cleanBase}/api/frame` + `?type=latti2` + `&senderId=${senderID}` + `&mentionId=${mention}` + `&credit=${encodeURIComponent(credit)}`; try { const response = await axios.get(apiUrl, { timeout: 30000, responseType: "json" }); const data = response.data; if (data.image && data.captionTemplate) { const imageBuffer = Buffer.from( data.image, "base64" ); return { imageBuffer, captionTemplate: data.captionTemplate }; } throw new Error("โŒ API Error"); } catch (error) { lastError = error; if ( error.response?.status === 401 && error.response?.data?.error ) { throw new Error( error.response.data.error ); } } } throw ( lastError || new Error("โŒ API เฆ•เฆพเฆœ เฆ•เฆฐเฆ›เง‡ เฆจเฆพ") ); } // ============================== // Main // ============================== try { let mention; let mentionName; // Reply if (event.messageReply) { mention = event.messageReply.senderID; } // Argument else if (args && args.length > 0) { const input = args.join(" "); // Facebook profile link if (input.includes(".com/")) { mention = await api.getUID(input); } // @mention else if (input.includes("@")) { mention = Object.keys(event.mentions || {})[0]; if (!mention) { mention = await getUIDByFullName( event.threadID, input ); } } // UID else { mention = args[0]; } } // Nothing provided else { return api.sendMessage( "โŒ ๐—ฃ๐—น๐—ฒ๐—ฎ๐˜€๐—ฒ ๐—บ๐—ฒ๐—ป๐˜๐—ถ๐—ผ๐—ป ๐—ฎ ๐˜‚๐˜€๐—ฒ๐—ฟ", event.threadID, event.messageID ); } // User not found if (!mention) { return api.sendMessage( "โŒ ๐—จ๐˜€๐—ฒ๐—ฟ ๐—ป๐—ผ๐˜ ๐—ณ๐—ผ๐˜‚๐—ป๐—ฑ ๐Ÿธ\n" + "๐—ฃ๐—น๐—ฒ๐—ฎ๐˜€๐—ฒ ๐—ฐ๐—ต๐—ฒ๐—ฐ๐—ธ ๐—ต๐—ฒ๐—ฟ ๐—ฝ๐—ฟ๐—ผ๐—ณ๐—ถ๐—น๐—ฒ", event.threadID, event.messageID ); } // Get user info const userInfo = await api.getUserInfo(mention); mentionName = userInfo?.[mention]?.name || "Unknown"; const senderID = event.senderID; const credit = "๐Ÿ”ฐ๐‘๐€๐‡๐€๐“ ๐ˆ๐’๐‹๐€๐Œ๐Ÿ”ฐ"; // Loading const waiting = await api.sendMessage( "โณ๐—ฃ๐—น๐—ฒ๐—ฎ๐˜€๐—ฒ ๐˜„๐—ฎ๐—ถ๐˜....", event.threadID ); // Get API list const apiConfigList = await getApiList("latti2"); // Generate image const { imageBuffer, captionTemplate } = await generateFrameWithFallback({ senderID, mention, credit, apiList: apiConfigList }); // Caption const finalCaption = captionTemplate.replace( /{{name}}/g, mentionName ); // Save image const outPath = path.join( __dirname, `latti2_${Date.now()}.png` ); fs.writeFileSync( outPath, imageBuffer ); // Remove loading try { await api.unsendMessage( waiting.messageID ); } catch (e) {} // Send image const messageInfo = await api.sendMessage( { body: finalCaption, mentions: [ { tag: mentionName, id: mention } ], attachment: fs.createReadStream(outPath) }, event.threadID, event.messageID ); // Delete after 2 minutes setTimeout(async () => { try { if (messageInfo?.messageID) { await api.unsendMessage( messageInfo.messageID ); } if (fs.existsSync(outPath)) { fs.unlinkSync(outPath); } } catch (e) {} }, 120000); } catch (error) { console.error( "latti2 error:", error ); return api.sendMessage( `โš ๏ธ ${error.message}`, event.threadID, event.messageID ); } } };