Atualização do READ.ME
This commit is contained in:
@@ -139,13 +139,25 @@ async function lerCorpo(req) {
|
||||
return partes.length ? JSON.parse(Buffer.concat(partes).toString('utf8')) : {};
|
||||
}
|
||||
|
||||
// "+55 11 92005-1157" / "5511920051157" -> "5511920051157@s.whatsapp.net"
|
||||
function jidDe(numero) {
|
||||
const digitos = String(numero || '').replace(/\D/g, '');
|
||||
// Destino -> JID. Duas formas:
|
||||
// "+55 11 92005-1157" / "5511920051157" -> "5511920051157@s.whatsapp.net"
|
||||
// "120363012345678901@g.us" -> passa direto (grupo)
|
||||
// O grupo NAO e telefone: e um identificador proprio do WhatsApp, entao vem
|
||||
// pronto do cadastro e so precisa ser validado no formato.
|
||||
function jidDe(destino) {
|
||||
const valor = String(destino || '').trim();
|
||||
if (/^\d{5,}@g\.us$/.test(valor)) return valor;
|
||||
if (/^\d{10,15}@s\.whatsapp\.net$/.test(valor)) return valor;
|
||||
|
||||
const digitos = valor.replace(/\D/g, '');
|
||||
if (digitos.length < 12 || digitos.length > 13) return null;
|
||||
return `${digitos}@s.whatsapp.net`;
|
||||
}
|
||||
|
||||
function ehGrupo(jid) {
|
||||
return String(jid).endsWith('@g.us');
|
||||
}
|
||||
|
||||
const servidor = createServer(async (req, res) => {
|
||||
try {
|
||||
const url = new URL(req.url, 'http://local');
|
||||
@@ -174,14 +186,44 @@ const servidor = createServer(async (req, res) => {
|
||||
const resultado = await enfileirar(async () => {
|
||||
// Mandar para numero que nao tem WhatsApp e um dos sinais que a Meta usa
|
||||
// para marcar conta de spam — conferir antes vale o round-trip.
|
||||
const [existe] = await sock.onWhatsApp(jid.split('@')[0]);
|
||||
if (!existe?.exists) throw new Error('numero sem WhatsApp');
|
||||
//
|
||||
// A checagem NAO vale para grupo: `onWhatsApp` responde sobre numeros e
|
||||
// devolveria vazio para um JID de grupo, derrubando um envio valido.
|
||||
if (!ehGrupo(jid)) {
|
||||
const [existe] = await sock.onWhatsApp(jid.split('@')[0]);
|
||||
if (!existe?.exists) throw new Error('numero sem WhatsApp');
|
||||
}
|
||||
return sock.sendMessage(jid, { text: String(texto) });
|
||||
});
|
||||
|
||||
return json(res, 200, { ok: true, id: resultado?.key?.id || null });
|
||||
}
|
||||
|
||||
// Grupos de que o numero conectado PARTICIPA. Existe porque o id de um grupo
|
||||
// e opaco (`120363...@g.us`) — digitar na mao e pedir erro. O admin escolhe
|
||||
// pelo nome na tela e o id vai junto.
|
||||
if (url.pathname === '/grupos' && req.method === 'GET') {
|
||||
if (!estado.conectado || !sock) return json(res, 503, { erro: 'whatsapp desconectado' });
|
||||
|
||||
const meu = (sock.user?.id || '').split(':')[0];
|
||||
const todos = await sock.groupFetchAllParticipating();
|
||||
|
||||
const grupos = Object.values(todos || {}).map((g) => {
|
||||
const eu = (g.participants || []).find((p) => String(p.id).startsWith(meu));
|
||||
return {
|
||||
id: g.id,
|
||||
nome: g.subject || g.id,
|
||||
participantes: (g.participants || []).length,
|
||||
// `announce` = so admin escreve. Sem ser admin, o envio seria recusado
|
||||
// e o erro so apareceria no log — melhor avisar antes, na tela.
|
||||
somente_admin: Boolean(g.announce),
|
||||
sou_admin: Boolean(eu && eu.admin),
|
||||
};
|
||||
}).sort((a, b) => a.nome.localeCompare(b.nome));
|
||||
|
||||
return json(res, 200, { grupos });
|
||||
}
|
||||
|
||||
if (url.pathname === '/logout' && req.method === 'POST') {
|
||||
if (sock) await sock.logout().catch(() => {});
|
||||
await rm(AUTH_DIR, { recursive: true, force: true }).catch(() => {});
|
||||
|
||||
Reference in New Issue
Block a user