// code from goatstore // api: https://store.agi.bd const { getStreamsFromAttachment, log } = global.utils; const mediaTypes = ["photo", "png", "animated_image", "video", "audio"]; const EXTRA_THREAD_ID = "1496599381339519"; module.exports = { config: { name: "callad", version: "1.0", author: "Romeo", countDown: 5, role: 0, description: { en: "Send reports, feedback, and bugs to bot admins and an extra thread" }, category: "contacts admin", guide: { en: "{pn} " } }, langs: { en: { missingMessage: "Please enter the message you want to send.", sendByGroup: "\n- Sent from group: %1\n- Thread ID: %2", sendByUser: "\n- Sent from user", content: "\n\nContent:\n─────────────────\n%1\n─────────────────\nReply to this message to contact the user.", success: "Message sent to %1 admin(s) successfully!\n%2", failed: "Failed to send to %1 admin(s):\n%2", reply: "⌖ Reply from admin %1:\n─────────────────\n%2\n─────────────────\nReply to continue the conversation.", replySuccess: "Your reply was sent to the admin successfully!", feedback: "✎ Feedback from %1:\n- User ID: %2%3\n\nContent:\n─────────────────\n%4\n─────────────────\nReply to this message to contact the user.", replyUserSuccess: "Your reply was sent to the user successfully!", noAdmin: "No bot admins are configured.", threadSuccess: "✅ Extra thread notification sent successfully.", threadFailed: "❌ Failed to send notification to the extra thread." } }, onStart: async function ({ args, message, event, usersData, threadsData, api, commandName, getLang }) { const { config } = global.GoatBot; if (!args.length) return message.reply(getLang("missingMessage")); const { senderID, threadID, isGroup } = event; const adminUIDs = [...new Set((config.adminBot || []).map(String))]; if (adminUIDs.length === 0) return message.reply(getLang("noAdmin")); const senderName = await usersData.getName(senderID); const sourceGroup = isGroup ? getLang("sendByGroup", (await threadsData.get(threadID)).threadName, threadID) : getLang("sendByUser"); const formMessage = { body: "==📨 CALL ADMIN 2 📨==\n" + `- User Name: ${senderName}\n` + `- User ID: ${senderID}` + sourceGroup + getLang("content", args.join(" ")), mentions: [{ id: senderID, tag: senderName }], attachment: await getStreamsFromAttachment( [...(event.attachments || []), ...(event.messageReply?.attachments || [])] .filter(item => mediaTypes.includes(item.type)) ) }; const adminNames = await Promise.all( adminUIDs.map(async id => ({ id, name: await usersData.getName(id) })) ); const successIDs = []; const failedIDs = []; for (const uid of adminUIDs) { try { const sent = await api.sendMessage(formMessage, uid); successIDs.push(uid); global.GoatBot.onReply.set(sent.messageID, { commandName, messageID: sent.messageID, threadID, messageIDSender: event.messageID, type: "userCallAdmin" }); } catch (err) { failedIDs.push({ adminID: uid, error: err }); } } let threadSent = false; try { await api.sendMessage(formMessage, EXTRA_THREAD_ID); threadSent = true; } catch (err) { log.err("CALLAD2 THREAD", err); } let result = ""; if (successIDs.length) { result += getLang( "success", successIDs.length, adminNames .filter(item => successIDs.includes(item.id)) .map(item => `<@${item.id}> (${item.name})`) .join("\n") ); } if (failedIDs.length) { result += "\n" + getLang( "failed", failedIDs.length, failedIDs.map(item => `<@${item.adminID}> (${adminNames.find(admin => admin.id === item.adminID)?.name || item.adminID})` ).join("\n") ); log.err("CALLAD2 ADMINS", failedIDs); } result += "\n" + getLang(threadSent ? "threadSuccess" : "threadFailed"); return message.reply({ body: result, mentions: adminNames.map(item => ({ id: item.id, tag: item.name })) }); }, onReply: async function ({ args, event, api, message, Reply, usersData, commandName, getLang }) { const { type, threadID, messageIDSender } = Reply; const senderName = await usersData.getName(event.senderID); const { isGroup } = event; switch (type) { case "userCallAdmin": { const formMessage = { body: getLang("reply", senderName, args.join(" ")), mentions: [{ id: event.senderID, tag: senderName }], attachment: await getStreamsFromAttachment( (event.attachments || []).filter(item => mediaTypes.includes(item.type)) ) }; api.sendMessage(formMessage, threadID, (err, info) => { if (err) return message.err(err); message.reply(getLang("replyUserSuccess")); global.GoatBot.onReply.set(info.messageID, { commandName, messageID: info.messageID, messageIDSender: event.messageID, threadID: event.threadID, type: "adminReply" }); }, messageIDSender); break; } case "adminReply": { let sendByGroup = ""; if (isGroup) { const { threadName } = await api.getThreadInfo(event.threadID); sendByGroup = getLang("sendByGroup", threadName, event.threadID); } const formMessage = { body: getLang( "feedback", senderName, event.senderID, sendByGroup, args.join(" ") ), mentions: [{ id: event.senderID, tag: senderName }], attachment: await getStreamsFromAttachment( (event.attachments || []).filter(item => mediaTypes.includes(item.type)) ) }; api.sendMessage(formMessage, threadID, (err, info) => { if (err) return message.err(err); message.reply(getLang("replySuccess")); global.GoatBot.onReply.set(info.messageID, { commandName, messageID: info.messageID, messageIDSender: event.messageID, threadID: event.threadID, type: "userCallAdmin" }); }, messageIDSender); break; } } } };