|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const MediaProcessor = require('./MediaProcessor'); |
|
|
const { getContentType } = require('@whiskeysockets/baileys'); |
|
|
|
|
|
class StickerViewOnceHandler { |
|
|
constructor(sock, config) { |
|
|
this.sock = sock; |
|
|
this.config = config; |
|
|
this.media = new MediaProcessor(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async handleSticker(m, userData, texto, ehGrupo) { |
|
|
try { |
|
|
const { nome: userName } = userData; |
|
|
|
|
|
|
|
|
let quoted = m.message?.extendedTextMessage?.contextInfo?.quotedMessage; |
|
|
if (quoted?.viewOnceMessageV2?.message) quoted = quoted.viewOnceMessageV2.message; |
|
|
else if (quoted?.viewOnceMessageV2Extension?.message) quoted = quoted.viewOnceMessageV2Extension.message; |
|
|
else if (quoted?.viewOnceMessage?.message) quoted = quoted.viewOnceMessage.message; |
|
|
|
|
|
const hasImage = m.message?.imageMessage || quoted?.imageMessage; |
|
|
const hasSticker = quoted?.stickerMessage; |
|
|
|
|
|
if (!hasImage && !hasSticker) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'πΈ *COMANDO #sticker*\n\n' + |
|
|
'β
Envie uma imagem com legenda `#sticker`\n' + |
|
|
'β
OU responda uma imagem com `#sticker`\n' + |
|
|
'β
OU responda um sticker com `#sticker`\n\n' + |
|
|
'β οΈ Para stickers animados de vΓdeos, use `#gif`\n\n' + |
|
|
'π Metadados:\n' + |
|
|
'π·οΈ Pack: akira-bot-[seu_nome]\n' + |
|
|
'π€ Autor: akira-bot\n' + |
|
|
'β¨ Automaticamente personalizados!' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
if (hasSticker) { |
|
|
const stickerMsg = quoted.stickerMessage; |
|
|
const stickerBuf = await this.media.downloadMedia(stickerMsg, 'sticker'); |
|
|
|
|
|
if (!stickerBuf) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao baixar sticker.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
const out = await this.media.addStickerMetadata( |
|
|
stickerBuf, |
|
|
`akira-bot-${userName.split(' ')[0].toLowerCase()}`, |
|
|
'akira-bot' |
|
|
); |
|
|
|
|
|
if (!out) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao personalizar sticker.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
sticker: out |
|
|
}, { quoted: m }); |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
if (hasImage) { |
|
|
const mediaMsg = quoted?.imageMessage || m.message.imageMessage; |
|
|
const imgBuf = await this.media.downloadMedia(mediaMsg, 'image'); |
|
|
|
|
|
if (!imgBuf) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao baixar imagem.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
const result = await this.media.createStickerFromImage(imgBuf, { |
|
|
userName, |
|
|
author: 'akira-bot' |
|
|
}); |
|
|
|
|
|
if (!result.sucesso) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: `β ${result.error}` |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
sticker: result.buffer |
|
|
}, { quoted: m }); |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
} catch (e) { |
|
|
console.error('β Erro em handleSticker:', e); |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao processar sticker.' |
|
|
}, { quoted: m }); |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async handleGif(m, userData, texto, ehGrupo) { |
|
|
try { |
|
|
const { nome: userName } = userData; |
|
|
|
|
|
let quoted = m.message?.extendedTextMessage?.contextInfo?.quotedMessage; |
|
|
if (quoted?.viewOnceMessageV2?.message) quoted = quoted.viewOnceMessageV2.message; |
|
|
else if (quoted?.viewOnceMessageV2Extension?.message) quoted = quoted.viewOnceMessageV2Extension.message; |
|
|
else if (quoted?.viewOnceMessage?.message) quoted = quoted.viewOnceMessage.message; |
|
|
|
|
|
const hasVideo = m.message?.videoMessage || quoted?.videoMessage; |
|
|
const hasSticker = quoted?.stickerMessage; |
|
|
|
|
|
if (!hasVideo && !hasSticker) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'π₯ *COMANDO #gif*\n\n' + |
|
|
'β
Envie um vΓdeo com legenda `#gif`\n' + |
|
|
'β
OU responda um vΓdeo com `#gif`\n' + |
|
|
'β
OU responda um sticker animado com `#gif`\n\n' + |
|
|
'β±οΈ MΓ‘ximo: 30 segundos\n' + |
|
|
'π DimensΓ£o: 512x512 (automΓ‘tico)\n' + |
|
|
'πΎ MΓ‘ximo: 500KB\n\n' + |
|
|
'β¨ Seu sticker serΓ‘ automaticamente personalizado!' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
if (hasSticker) { |
|
|
const stickerMsg = quoted.stickerMessage; |
|
|
const stickerBuf = await this.media.downloadMedia(stickerMsg, 'sticker'); |
|
|
|
|
|
if (!stickerBuf) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao baixar sticker.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
const out = await this.media.addStickerMetadata( |
|
|
stickerBuf, |
|
|
`akira-bot-${userName.split(' ')[0].toLowerCase()}`, |
|
|
'akira-bot' |
|
|
); |
|
|
|
|
|
if (out) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
sticker: out |
|
|
}, { quoted: m }); |
|
|
} else { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao personalizar sticker animado.' |
|
|
}, { quoted: m }); |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
if (hasVideo) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β³ Processando vΓdeo... Isto pode levar alguns segundos.' |
|
|
}, { quoted: m }); |
|
|
|
|
|
const vidMsg = quoted?.videoMessage || m.message.videoMessage; |
|
|
const vidBuf = await this.media.downloadMedia(vidMsg, 'video'); |
|
|
|
|
|
if (!vidBuf) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao baixar vΓdeo.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
const result = await this.media.createAnimatedStickerFromVideo(vidBuf, 30, { |
|
|
userName, |
|
|
author: 'akira-bot' |
|
|
}); |
|
|
|
|
|
if (!result.sucesso) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: `β ${result.error}` |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
sticker: result.buffer |
|
|
}, { quoted: m }); |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
} catch (e) { |
|
|
console.error('β Erro em handleGif:', e); |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao criar sticker animado.' |
|
|
}, { quoted: m }); |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async handleReveal(m, userData, ehGrupo, isOwnerOrAdmin) { |
|
|
try { |
|
|
if (!isOwnerOrAdmin) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'π« Comando restrito ao dono ou admin do grupo.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
const quoted = m.message?.extendedTextMessage?.contextInfo?.quotedMessage; |
|
|
|
|
|
if (!quoted) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'ποΈ *COMANDO #reveal*\n\n' + |
|
|
'Responda uma mensagem view-once com `#reveal`\n\n' + |
|
|
'β
Imagens view-once\n' + |
|
|
'β
VΓdeos view-once\n' + |
|
|
'β
Γudios view-once\n' + |
|
|
'β
Stickers animados view-once\n\n' + |
|
|
'π Apenas dono/admin podem usar.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
const result = await this.media.extractViewOnceContent(quoted); |
|
|
|
|
|
if (!result.sucesso) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: `β ${result.error}` |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
const tipoEmoji = { |
|
|
'image': 'πΌοΈ', |
|
|
'video': 'π¬', |
|
|
'audio': 'π€', |
|
|
'sticker': 'π¨' |
|
|
}; |
|
|
|
|
|
const caption = `${tipoEmoji[result.tipo] || 'π¦'} *ConteΓΊdo Revelado (View-Once)*\n\nTipo: ${result.tipo}\nTamanho: ${(result.size / 1024).toFixed(2)}KB`; |
|
|
|
|
|
const msgObj = {}; |
|
|
if (result.tipo === 'image') { |
|
|
msgObj.image = result.buffer; |
|
|
msgObj.caption = caption; |
|
|
} else if (result.tipo === 'video') { |
|
|
msgObj.video = result.buffer; |
|
|
msgObj.mimetype = 'video/mp4'; |
|
|
msgObj.caption = caption; |
|
|
} else if (result.tipo === 'audio') { |
|
|
msgObj.audio = result.buffer; |
|
|
msgObj.mimetype = 'audio/mpeg'; |
|
|
msgObj.ptt = false; |
|
|
} else if (result.tipo === 'sticker') { |
|
|
msgObj.sticker = result.buffer; |
|
|
} |
|
|
|
|
|
await this.sock.sendMessage(m.key.remoteJid, msgObj, { quoted: m }); |
|
|
return true; |
|
|
|
|
|
} catch (e) { |
|
|
console.error('β Erro em handleReveal:', e); |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao revelar view-once.' |
|
|
}, { quoted: m }); |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async handleToImage(m, userData, texto, ehGrupo) { |
|
|
try { |
|
|
let quoted = m.message?.extendedTextMessage?.contextInfo?.quotedMessage; |
|
|
if (quoted?.viewOnceMessageV2?.message) quoted = quoted.viewOnceMessageV2.message; |
|
|
else if (quoted?.viewOnceMessageV2Extension?.message) quoted = quoted.viewOnceMessageV2Extension.message; |
|
|
else if (quoted?.viewOnceMessage?.message) quoted = quoted.viewOnceMessage.message; |
|
|
|
|
|
const hasSticker = m.message?.stickerMessage || quoted?.stickerMessage; |
|
|
|
|
|
if (!hasSticker) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'πΌοΈ *COMANDO #toimg*\n\n' + |
|
|
'β
Envie um sticker com legenda `#toimg`\n' + |
|
|
'β
OU responda um sticker com `#toimg`\n\n' + |
|
|
'π Converte qualquer sticker para imagem PNG\n' + |
|
|
'β οΈ Stickers animados nΓ£o podem ser convertidos para imagem estΓ‘tica' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β³ Convertendo sticker para imagem...' |
|
|
}, { quoted: m }); |
|
|
|
|
|
const stickerMsg = quoted?.stickerMessage || m.message.stickerMessage; |
|
|
const stickerBuf = await this.media.downloadMedia(stickerMsg, 'sticker'); |
|
|
|
|
|
if (!stickerBuf) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao baixar sticker.' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
const result = await this.media.convertStickerToImage(stickerBuf); |
|
|
|
|
|
if (!result.sucesso) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: `β ${result.error || 'Erro ao converter sticker.'}` |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
image: result.buffer, |
|
|
caption: 'πΌοΈ Convertido de sticker para imagem PNG' |
|
|
}, { quoted: m }); |
|
|
|
|
|
return true; |
|
|
|
|
|
} catch (e) { |
|
|
console.error('β Erro em handleToImage:', e); |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao converter sticker para imagem.' |
|
|
}, { quoted: m }); |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async handleViewOnceToSticker(m, userData, ehGrupo) { |
|
|
try { |
|
|
const { nome: userName } = userData; |
|
|
const quoted = m.message?.extendedTextMessage?.contextInfo?.quotedMessage; |
|
|
|
|
|
if (!quoted) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'ποΈβ‘οΈπ¨ *COMANDO #vosticker*\n\n' + |
|
|
'Converte imagem/vΓdeo view-once em sticker\n\n' + |
|
|
'Uso: Responda uma imagem/vΓdeo view-once com `#vosticker`\n\n' + |
|
|
'β
View-once image β sticker\n' + |
|
|
'β
View-once video β sticker animado (atΓ© 30s)\n' + |
|
|
'β
Metadados: akira-bot-[seu_nome]' |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
const result = await this.media.extractViewOnceContent(quoted); |
|
|
|
|
|
if (!result.sucesso) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: `β ${result.error}` |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
let stickerResult; |
|
|
|
|
|
if (result.tipo === 'image') { |
|
|
stickerResult = await this.media.createStickerFromImage(result.buffer, { |
|
|
userName, |
|
|
author: 'akira-bot' |
|
|
}); |
|
|
} else if (result.tipo === 'video') { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β³ Convertendo vΓdeo view-once para sticker animado...' |
|
|
}, { quoted: m }); |
|
|
|
|
|
stickerResult = await this.media.createAnimatedStickerFromVideo(result.buffer, 30, { |
|
|
userName, |
|
|
author: 'akira-bot' |
|
|
}); |
|
|
} else { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: `β Tipo ${result.tipo} nΓ£o pode ser convertido para sticker.` |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
if (!stickerResult.sucesso) { |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: `β ${stickerResult.error}` |
|
|
}, { quoted: m }); |
|
|
return true; |
|
|
} |
|
|
|
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
sticker: stickerResult.buffer |
|
|
}, { quoted: m }); |
|
|
|
|
|
return true; |
|
|
|
|
|
} catch (e) { |
|
|
console.error('β Erro em handleViewOnceToSticker:', e); |
|
|
await this.sock.sendMessage(m.key.remoteJid, { |
|
|
text: 'β Erro ao converter view-once para sticker.' |
|
|
}, { quoted: m }); |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
module.exports = StickerViewOnceHandler; |
|
|
|