Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ID da Mensagem com Inconsistência #1233

Open
pedromagnox opened this issue May 17, 2023 · 14 comments
Open

ID da Mensagem com Inconsistência #1233

pedromagnox opened this issue May 17, 2023 · 14 comments
Labels
bug Something isn't working needs triage

Comments

@pedromagnox
Copy link

pedromagnox commented May 17, 2023

Quando a mensagem chega pelo webhook e o FromMe = "no" o ID vem em uma string "id"
Quando o FromMe = "yes" o ID vem em um objeto "id" em uma string "_serialized"

Essa inconsistência entre objeto e string faz com que a manipulação de mensagens se torne algo inviável em aplicações no-code
Fica obrigatório o uso de um intermediário como o Make para tratar o JSON
Além de ser caro, pois estamos falando de mensagens, é lento também

Por que existe essa diferença estrutural?
Existe algum arquivo no código onde isso pode ser editado facilmente no meu servidor?

@pedromagnox pedromagnox added bug Something isn't working needs triage labels May 17, 2023
@pedromagnox pedromagnox closed this as not planned Won't fix, can't repro, duplicate, stale May 17, 2023
@pedromagnox pedromagnox reopened this May 17, 2023
@icleitoncosta
Copy link
Collaborator

Ola Pedro, bom dia.
Irei verificar a inconsistência, e corrigir.

@pedromagnox
Copy link
Author

Esse daqui subiu nessa atualização tb já @icleitoncosta? Acho que era só colocar mais coisas pra chegar um objeto sempre

@icleitoncosta
Copy link
Collaborator

Esse daqui subiu nessa atualização tb já @icleitoncosta? Acho que era só colocar mais coisas pra chegar um objeto sempre

Opa @pedromagnox , rapaz... por algum motivo acabei não vendo ele.
Hoje já estou bem cansado, mas amanhã vou dar uma olhadinha e acertar, pois não é aqui, tenho que verificar, pois acho que está vindo do wa-js assim.

@pedromagnox
Copy link
Author

pedromagnox commented Jun 2, 2023

Quando eu mando mensagem chega object
true

Quando eu recebo mensagem chega String
false

Espero ter ajudando em relação ao tempo para identificar o problema @icleitoncosta

@icleitoncosta
Copy link
Collaborator

Quando eu mando mensagem chega object

true

Quando eu recebo mensagem chega String

false

Espero ter ajudando em relação ao tempo para identificar o problema @icleitoncosta

Perfeito, ajudou muito.
Realmente é no WAJS. Vou ajustar

@icleitoncosta
Copy link
Collaborator

Olá @pedromagnox , eu estava avaliando as possibilidades, e defini que não posso executar o ajuste.
E porque não posso:

Se eu fizer essa alteração agora, independende de onde eu mexa, vou quebrar a aplicação de todos os usuários, e nós evitamos de mais fazermos isso, exceto quando lançamos uma versão completamente nova, que aí muda tudo.

Vou pedir para você fazer o seguinte:

Faz um fork do repositório, e usa o seu repósitorio para instalar, faz a seguinte alteração em seu código e faça o commit da sua alteração em seu projeto.

Caminho: src/controllers/messageController.ts
A partir da linha 57, troque o código e coloque dessa forma:

try {
    const results: any = [];
    for (const contato of phone) {
      const result = await req.client.sendText(contato, message, options);
      result.id = result.id.toString();
      results.push(result);
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    req.io.emit('mensagem-enviada', results);
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }

Talvez não seja o correto, mas infelizmente temos que manter assim, pra evitar quebrar todas as aplicações que já foram criadas em cima do server.

Fazendo o fork dessa forma, você conseguirá manter as atualizações do server normalmente, com seu código.

Irei fechar a issue, qualquer coisa, só reabrir.

Abraços

@pedromagnox
Copy link
Author

pedromagnox commented Jun 3, 2023

Não deu certo @icleitoncosta

serializedid

Não serial melhor criar uma string nova logo abaixo do id chamada serialized padronizada para todas as respostas de webhook?
Dessa forma não quebraria o código de ninguém e traria uma solução para toda a comunidade, e não só para mim

Tipo criar uma cópia desse serialized fora do object id

@icleitoncosta
Copy link
Collaborator

Não deu certo @icleitoncosta

serializedid

Não serial melhor criar uma string nova logo abaixo do id chamada serialized padronizada para todas as respostas de webhook?

Dessa forma não quebraria o código de ninguém e traria uma solução para toda a comunidade, e não só para mim

Tipo criar uma cópia desse serialized fora do object id

Sobre criar esse novo objeto, tenho que conversar com os outros responsáveis pelo projeto, pois a regra geral é priorizar o mesmo código que vem do WhatsApp mesmo, então mudamos apenas quando o WhatsApp muda completamente algumas coisas.

Em relação ao código tá dizendo que está faltando um colchete. Manda o código completo do sendMessage que ajusto aqui.

@pedromagnox
Copy link
Author

pedromagnox commented Jun 3, 2023

Vixe. Entendi em relação a regra geral. E faz sentido existir ela.
Segue os dois eventos. Lembrando que o id tem que chegar em mensagens de mídia também, localização, etc...

Outra coisa. Gostaria de retribuir financeiramente pela sua assistência. E se você tiver interesse, gostaria de te apresentar o que eu construí com esse repositório. Vc vai ficar de cara! rs

{
"event": "onack",
"session": "1685824587892x804543417014026200",
"id": {
"fromMe": true,
"remote": "[email protected]",
"id": "A4AAED96042A8645D7E335AD8BC8AE0F",
"_serialized": "[email protected]_A4AAED96042A8645D7E335AD8BC8AE0F"
},
"body": "Teste",
"type": "chat",
"t": 1685824633,
"notifyName": "Pedro Magno",
"from": "[email protected]",
"to": "[email protected]",
"author": "[email protected]",
"self": "in",
"ack": 2,
"isNewMsg": true,
"star": false,
"kicNotified": false,
"recvFresh": true,
"isFromTemplate": false,
"thumbnail": "",
"richPreviewType": 0,
"pollInvalidated": false,
"isSentCagPollCreation": false,
"latestEditMsgKey": null,
"latestEditSenderTimestampMs": null,
"broadcast": false,
"mentionedJidList": [],
"groupMentions": [],
"isVcardOverMmsDocument": false,
"hasReaction": false,
"ephemeralDuration": 0,
"ephemeralSettingTimestamp": 1659358518,
"disappearingModeInitiator": "chat",
"inviteGrpType": "DEFAULT",
"productHeaderImageRejected": false,
"lastPlaybackProgress": 0,
"isDynamicReplyButtonsMsg": false,
"isMdHistoryMsg": false,
"stickerSentTs": 0,
"isAvatar": false,
"requiresDirectConnection": false,
"pttForwardedFeaturesEnabled": true
}

{
"event": "onmessage",
"session": "1685824587892x804543417014026200",
"id": "[email protected]_64097396E755A172F1FE76F218C197D5",
"body": "Oi",
"type": "chat",
"t": 1685824659,
"notifyName": "OrganiZap",
"from": "[email protected]",
"to": "[email protected]",
"self": "in",
"ack": 1,
"isNewMsg": true,
"star": false,
"kicNotified": false,
"recvFresh": true,
"isFromTemplate": false,
"pollInvalidated": false,
"isSentCagPollCreation": false,
"latestEditMsgKey": null,
"latestEditSenderTimestampMs": null,
"broadcast": false,
"mentionedJidList": [],
"groupMentions": [],
"isVcardOverMmsDocument": false,
"isForwarded": false,
"hasReaction": false,
"productHeaderImageRejected": false,
"lastPlaybackProgress": 0,
"isDynamicReplyButtonsMsg": false,
"isMdHistoryMsg": false,
"stickerSentTs": 0,
"isAvatar": false,
"requiresDirectConnection": false,
"pttForwardedFeaturesEnabled": true,
"chatId": "[email protected]",
"fromMe": false,
"sender": {
"id": "[email protected]",
"name": "Meu numero:",
"shortName": "Meu numero:",
"pushname": "OrganiZap",
"type": "in",
"verifiedName": "OrganiZap",
"isBusiness": true,
"isEnterprise": false,
"isSmb": true,
"verifiedLevel": 0,
"privacyMode": null,
"isContactSyncCompleted": 0,
"formattedName": "Meu numero:",
"isMe": false,
"isMyContact": true,
"isPSA": false,
"isUser": true,
"isWAContact": true,
"profilePicThumbObj": {
"eurl": "https://pps.whatsapp.net/v/t61.24694-24/343289219_633695681992839_2281219304740550732_n.jpg?ccb=11-4&oh=01_AdRw2q6NYsF_fDm-DLqSA_91XBB73MmumdFbpqMpt-L4hg&oe=64889DF0",
"id": "[email protected]",
"img": "https://pps.whatsapp.net/v/t61.24694-24/343289219_633695681992839_2281219304740550732_n.jpg?stp=dst-jpg_s96x96&ccb=11-4&oh=01_AdRF3hODZXRRWS8TrLqqI1TQNOEA8Ce1COXJKOQhNxD2wA&oe=64889DF0",
"imgFull": "https://pps.whatsapp.net/v/t61.24694-24/343289219_633695681992839_2281219304740550732_n.jpg?ccb=11-4&oh=01_AdRw2q6NYsF_fDm-DLqSA_91XBB73MmumdFbpqMpt-L4hg&oe=64889DF0",
"tag": "1683606972"
},
"msgs": null
},
"timestamp": 1685824659,
"content": "Oi",
"isGroupMsg": false,
"isMedia": false,
"isNotification": false,
"isPSA": false,
"mediaData": {}
}

@icleitoncosta icleitoncosta reopened this Jun 3, 2023
@icleitoncosta
Copy link
Collaborator

Opa Pedro, vi que você tinha respondido com o código do sendMessage, por favor, coloca ele aqui de novo, apenas o código da função, que só vejo o colchete que faltou e já acerta em seu código.
Em relação a contribuição, o projeto tem a parte de Sponsors, pode me chamar pelo discord ou pelo whatsapp, tendo um tempo eu respondo por lá

@pedromagnox
Copy link
Author

pedromagnox commented Jun 3, 2023

Ah sim! Segue o messageController.ts com a sua sugestão se alteração já.
é só dar um Ctrl + F com req.client.sendText(contato

@pedromagnox
Copy link
Author

/*

  • Copyright 2021 WPPConnect Team
  • Licensed under the Apache License, Version 2.0 (the "License");
  • you may not use this file except in compliance with the License.
  • You may obtain a copy of the License at
  • http://www.apache.org/licenses/LICENSE-2.0
    
  • Unless required by applicable law or agreed to in writing, software
  • distributed under the License is distributed on an "AS IS" BASIS,
  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  • See the License for the specific language governing permissions and
  • limitations under the License.
    */

import { Request, Response } from 'express';

import { unlinkAsync } from '../util/functions';

function returnError(req: Request, res: Response, error: any) {
req.logger.error(error);
res.status(500).json({
status: 'Error',
message: 'Erro ao enviar a mensagem.',
error: error,
});
}

async function returnSucess(res: any, data: any) {
res.status(201).json({ status: 'success', response: data, mapper: 'return' });
}

export async function sendMessage(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $message: 'Hello, welcome to WPPConnect',
    $isGroup: false,
    }
    }
    */
    const { phone, message } = req.body;

const options = req.body.options || {};

try {
const results: any = [];
for (const contato of phone) {
const result = await req.client.sendText(contato, message, options);
result.id = result.id.toString();
results.push(result);
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
req.io.emit('mensagem-enviada', results);
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}

export async function sendFile(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: false,
    $filename: 'file name lol',
    $caption: 'caption for my file',
    $base64: ' string',
    }
    }
    */
    const { phone, path, base64, filename = 'file', message, caption } = req.body;

if (!path && !req.file && !base64)
return res.status(401).send({
message: 'Sending the file is mandatory',
});

const pathFile = path || base64 || req.file?.path;
const msg = message || caption;

try {
const results: any = [];
for (const contato of phone) {
results.push(
await req.client.sendFile(contato, pathFile, {
filename: filename,
caption: msg,
})
);
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
if (req.file) await unlinkAsync(pathFile);
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendVoice(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: false,
    $path: '<path_file>',
    $quotedMessageId: undefined,
    }
    }
    */
    const {
    phone,
    path,
    filename = 'Voice Audio',
    message,
    quotedMessageId,
    } = req.body;

try {
const results: any = [];
for (const contato of phone) {
results.push(
await req.client.sendPtt(
contato,
path,
filename,
message,
quotedMessageId
)
);
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendVoice64(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: false,
    $base64Ptt: '<base64_string>',
    }
    }
    */
    const { phone, base64Ptt } = req.body;

try {
const results: any = [];
for (const contato of phone) {
results.push(
await req.client.sendPttFromBase64(contato, base64Ptt, 'Voice Audio')
);
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendLinkPreview(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: false,
    $url: 'http://www.link.com',
    $caption: 'Text for describe link',
    }
    }
    */
    const { phone, url, caption } = req.body;

try {
const results: any = [];
for (const contato of phone) {
results.push(
await req.client.sendLinkPreview(${contato}, url, caption)
);
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendLocation(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: false,
    $lat: '-89898322',
    $lng: '-545454',
    $title: 'Rio de Janeiro',
    $address: 'Av. N. S. de Copacabana, 25, Copacabana',
    }
    }
    */
    const { phone, lat, lng, title, address } = req.body;

try {
const results: any = [];
for (const contato of phone) {
results.push(
await req.client.sendLocation(contato, {
lat: lat,
lng: lng,
address: address,
name: title,
})
);
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendButtons(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA',
    }
    #swagger.deprecated=true
    */
    const { phone, message, options } = req.body;

try {
const results: any = [];

for (const contact of phone) {
  results.push(await req.client.sendText(contact, message, options));
}

if (results.length === 0)
  return returnError(req, res, 'Error sending message with buttons');

returnSucess(res, phone);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendListMessage(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA',
    }
    #swagger.deprecated=true
    */
    const {
    phone,
    description = '',
    sections,
    buttonText = 'SELECIONE UMA OPÇÃO',
    } = req.body;

try {
const results: any = [];

for (const contact of phone) {
  results.push(
    await req.client.sendListMessage(contact, {
      buttonText: buttonText,
      description: description,
      sections: sections,
    })
  );
}

if (results.length === 0)
  return returnError(req, res, 'Error sending list buttons');

returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendPollMessage(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.requestBody = {
    required: true,
    "@content": {
    "application/json": {
    schema: {
    type: "object",
    properties: {
    phone: { type: "string" },
    isGroup: { type: "boolean" },
    name: { type: "string" },
    choices: { type: "array" },
    options: { type: "object" },
    }
    },
    examples: {
    "Default": {
    value: {
    phone: '5521999999999',
    isGroup: false,
    name: 'Poll name',
    choices: ['Option 1', 'Option 2', 'Option 3'],
    options: {
    selectableCount: 1,
    }
    }
    },
    }
    }
    }
    }
    */
    const { phone, name, choices, options } = req.body;

try {
const results: any = [];

for (const contact of phone) {
  results.push(
    await req.client.sendPollMessage(contact, name, choices, options)
  );
}

if (results.length === 0)
  return returnError(req, res, 'Error sending poll message');

returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendStatusText(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $message: 'Post text status',
    }
    }
    */
    const { message } = req.body;

try {
const results: any = [];
results.push(await req.client.sendText('status@broadcast', message));

if (results.length === 0)
  return res.status(400).json('Error sending message');
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function replyMessage(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: false,
    $message: 'Reply to message',
    $messageId: '<id_message>',
    }
    }
    */
    const { phone, message, messageId } = req.body;

try {
const results: any = [];
for (const contato of phone) {
results.push(await req.client.reply(contato, message, messageId));
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
req.io.emit('mensagem-enviada', { message: message, to: phone });
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

export async function sendMentioned(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: true,
    $message: 'Your text message',
    $mentioned: ["@[email protected]"],
    }
    }
    */
    const { phone, message, mentioned } = req.body;

try {
let response;
for (const contato of phone) {
response = await req.client.sendMentioned(
${contato},
message,
mentioned
);
}

return res.status(201).json({ status: 'success', response: response });

} catch (error) {
req.logger.error(error);
return res.status(500).json({
status: 'error',
message: 'Error on send message mentioned',
error: error,
});
}
}
export async function sendImageAsSticker(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: true,
    $path: '<path_file>',
    }
    }
    */
    const { phone, path } = req.body;

if (!path && !req.file)
return res.status(401).send({
message: 'Sending the file is mandatory',
});

const pathFile = path || req.file?.path;

try {
const results: any = [];
for (const contato of phone) {
results.push(await req.client.sendImageAsSticker(contato, pathFile));
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
if (req.file) await unlinkAsync(pathFile);
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}
export async function sendImageAsStickerGif(req: Request, res: Response) {
/**

  • #swagger.tags = ["Messages"]
    #swagger.autoBody=false
    #swagger.security = [{
    "bearerAuth": []
    }]
    #swagger.parameters["session"] = {
    schema: 'NERDWHATS_AMERICA'
    }
    #swagger.parameters["obj"] = {
    in: 'body',
    schema: {
    $phone: '5521999999999',
    $isGroup: true,
    $path: '<path_file>',
    }
    }
    */
    const { phone, path } = req.body;

if (!path && !req.file)
return res.status(401).send({
message: 'Sending the file is mandatory',
});

const pathFile = path || req.file?.path;

try {
const results: any = [];
for (const contato of phone) {
results.push(await req.client.sendImageAsStickerGif(contato, pathFile));
}

if (results.length === 0)
  return res.status(400).json('Error sending message');
if (req.file) await unlinkAsync(pathFile);
returnSucess(res, results);

} catch (error) {
returnError(req, res, error);
}
}

@icleitoncosta
Copy link
Collaborator

Ola @pedromagnox
Cola esse código no messagesController, estou bolando uma alternativa pra facilitar os low-code, já que bastante usa aqui na plataforma.

/*
 * Copyright 2021 WPPConnect Team
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { Request, Response } from 'express';

import { unlinkAsync } from '../util/functions';

function returnError(req: Request, res: Response, error: any) {
  req.logger.error(error);
  res.status(500).json({
    status: 'Error',
    message: 'Erro ao enviar a mensagem.',
    error: error,
  });
}

async function returnSucess(res: any, data: any) {
  res.status(201).json({ status: 'success', response: data, mapper: 'return' });
}

export async function sendMessage(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
        required: true,
        "@content": {
          "application/json": {
            schema: {
              type: "object",
              properties: {
                $phone: { type: "string" },
                $isGroup: { type: "boolean" },
                $message: { type: "string" }
              }
            },
            examples: {
              "Default": {
                value: {
                  phone: '5521999999999',
                  isGroup: false,
                  message: 'Hello, welcome to WPPConnect'
                },
              },
            },
          }
        }
      }
   */
  const { phone, message } = req.body;

  const options = req.body.options || {};

  try {
    const results: any = [];
    for (const contato of phone) {
      const result = await req.client.sendText(contato, message, options);
      result.id = result.id.toString();
      results.push(result);
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    req.io.emit('mensagem-enviada', results);
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendFile(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
      required: true,
      "@content": {
        "application/json": {
            schema: {
                type: "object",
                properties: {
                    "phone": { type: "string" },
                    "isGroup": { type: "boolean" },
                    "filename": { type: "string" },
                    "caption": { type: "string" },
                    "base64": { type: "string" }
                }
            },
            examples: {
                "Default": {
                    value: {
                        "phone": "5521999999999",
                        "isGroup": false,
                        "filename": "file name lol",
                        "caption": "caption for my file",
                        "base64": "<base64> string"
                    }
                }
            }
        }
      }
    }
   */
  const { phone, path, base64, filename = 'file', message, caption } = req.body;

  if (!path && !req.file && !base64)
    return res.status(401).send({
      message: 'Sending the file is mandatory',
    });

  const pathFile = path || base64 || req.file?.path;
  const msg = message || caption;

  try {
    const results: any = [];
    for (const contato of phone) {
      const result = await req.client.sendFile(contato, pathFile, {
        filename: filename,
        caption: msg,
      });
      result.id = result.id.toString();
      results.push(result);
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    if (req.file) await unlinkAsync(pathFile);
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendVoice(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
        required: true,
        "@content": {
            "application/json": {
                schema: {
                    type: "object",
                    properties: {
                        "phone": { type: "string" },
                        "isGroup": { type: "boolean" },
                        "path": { type: "string" },
                        "quotedMessageId": { type: "string" }
                    }
                },
                examples: {
                    "Default": {
                        value: {
                            "phone": "5521999999999",
                            "isGroup": false,
                            "path": "<path_file>",
                            "quotedMessageId": "message Id"
                        }
                    }
                }
            }
        }
    }
   */
  const {
    phone,
    path,
    filename = 'Voice Audio',
    message,
    quotedMessageId,
  } = req.body;

  try {
    const results: any = [];
    for (const contato of phone) {
      results.push(
        await req.client.sendPtt(
          contato,
          path,
          filename,
          message,
          quotedMessageId
        )
      );
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendVoice64(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
        required: true,
        "@content": {
            "application/json": {
                schema: {
                    type: "object",
                    properties: {
                        "phone": { type: "string" },
                        "isGroup": { type: "boolean" },
                        "base64Ptt": { type: "string" }
                    }
                },
                examples: {
                    "Default": {
                        value: {
                            "phone": "5521999999999",
                            "isGroup": false,
                            "base64Ptt": "<base64_string>"
                        }
                    }
                }
            }
        }
    }
   */
  const { phone, base64Ptt } = req.body;

  try {
    const results: any = [];
    for (const contato of phone) {
      results.push(
        await req.client.sendPttFromBase64(contato, base64Ptt, 'Voice Audio')
      );
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendLinkPreview(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
        required: true,
        "@content": {
            "application/json": {
                schema: {
                    type: "object",
                    properties: {
                        "phone": { type: "string" },
                        "isGroup": { type: "boolean" },
                        "url": { type: "string" },
                        "caption": { type: "string" }
                    }
                },
                examples: {
                    "Default": {
                        value: {
                            "phone": "5521999999999",
                            "isGroup": false,
                            "url": "http://www.link.com",
                            "caption": "Text for describe link"
                        }
                    }
                }
            }
        }
    }
   */
  const { phone, url, caption } = req.body;

  try {
    const results: any = [];
    for (const contato of phone) {
      results.push(
        await req.client.sendLinkPreview(`${contato}`, url, caption)
      );
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendLocation(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
        required: true,
        "@content": {
            "application/json": {
                schema: {
                    type: "object",
                    properties: {
                        "phone": { type: "string" },
                        "isGroup": { type: "boolean" },
                        "lat": { type: "string" },
                        "lng": { type: "string" },
                        "title": { type: "string" },
                        "address": { type: "string" }
                    }
                },
                examples: {
                    "Default": {
                        value: {
                            "phone": "5521999999999",
                            "isGroup": false,
                            "lat": "-89898322",
                            "lng": "-545454",
                            "title": "Rio de Janeiro",
                            "address": "Av. N. S. de Copacabana, 25, Copacabana"
                        }
                    }
                }
            }
        }
    }
   */
  const { phone, lat, lng, title, address } = req.body;

  try {
    const results: any = [];
    for (const contato of phone) {
      results.push(
        await req.client.sendLocation(contato, {
          lat: lat,
          lng: lng,
          address: address,
          name: title,
        })
      );
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendButtons(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA',
     }
     #swagger.deprecated=true
   */
  const { phone, message, options } = req.body;

  try {
    const results: any = [];

    for (const contact of phone) {
      results.push(await req.client.sendText(contact, message, options));
    }

    if (results.length === 0)
      return returnError(req, res, 'Error sending message with buttons');

    returnSucess(res, phone);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendListMessage(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA',
     }
     #swagger.deprecated=true
   */
  const {
    phone,
    description = '',
    sections,
    buttonText = 'SELECIONE UMA OPÇÃO',
  } = req.body;

  try {
    const results: any = [];

    for (const contact of phone) {
      results.push(
        await req.client.sendListMessage(contact, {
          buttonText: buttonText,
          description: description,
          sections: sections,
        })
      );
    }

    if (results.length === 0)
      return returnError(req, res, 'Error sending list buttons');

    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendPollMessage(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
    #swagger.requestBody = {
        required: true,
        "@content": {
            "application/json": {
                schema: {
                    type: "object",
                    properties: {
                        phone: { type: "string" },
                        isGroup: { type: "boolean" },
                        name: { type: "string" },
                        choices: { type: "array" },
                        options: { type: "object" },
                    }
                },
                examples: {
                    "Default": {
                        value: {
                          phone: '5521999999999',
                          isGroup: false,
                          name: 'Poll name',
                          choices: ['Option 1', 'Option 2', 'Option 3'],
                          options: {
                            selectableCount: 1,
                          }
                        }
                    },
                }
            }
        }
    }
   */
  const { phone, name, choices, options } = req.body;

  try {
    const results: any = [];

    for (const contact of phone) {
      results.push(
        await req.client.sendPollMessage(contact, name, choices, options)
      );
    }

    if (results.length === 0)
      return returnError(req, res, 'Error sending poll message');

    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendStatusText(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
      required: true,
      content: {
        'application/json': {
          schema: {
            type: 'object',
            properties: {
              phone: { type: 'string' },
              isGroup: { type: 'boolean' },
              message: { type: 'string' },
              messageId: { type: 'string' }
            },
            required: ['phone', 'isGroup', 'message']
          },
          examples: {
            Default: {
              value: {
                phone: '5521999999999',
                isGroup: false,
                message: 'Reply to message',
                messageId: '<id_message>'
              }
            }
          }
        }
      }
    }
   */
  const { message } = req.body;

  try {
    const results: any = [];
    results.push(await req.client.sendText('status@broadcast', message));

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function replyMessage(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
      required: true,
      "@content": {
        "application/json": {
          schema: {
            type: "object",
            properties: {
              "phone": { type: "string" },
              "isGroup": { type: "boolean" },
              "message": { type: "string" },
              "messageId": { type: "string" }
            }
          },
          examples: {
            "Default": {
              value: {
                "phone": "5521999999999",
                "isGroup": false,
                "message": "Reply to message",
                "messageId": "<id_message>"
              }
            }
          }
        }
      }
    }
   */
  const { phone, message, messageId } = req.body;

  try {
    const results: any = [];
    for (const contato of phone) {
      results.push(await req.client.reply(contato, message, messageId));
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    req.io.emit('mensagem-enviada', { message: message, to: phone });
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

export async function sendMentioned(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
  required: true,
  "@content": {
    "application/json": {
      schema: {
        type: "object",
        properties: {
          "phone": { type: "string" },
          "isGroup": { type: "boolean" },
          "message": { type: "string" },
          "mentioned": { type: "array", items: { type: "string" } }
        },
        required: ["phone", "message", "mentioned"]
      },
      examples: {
        "Default": {
          value: {
            "phone": "5521999999999",
            "isGroup": true,
            "message": "Your text message",
            "mentioned": ["@[email protected]"]
          }
        }
      }
    }
  }
}
   */
  const { phone, message, mentioned } = req.body;

  try {
    let response;
    for (const contato of phone) {
      response = await req.client.sendMentioned(
        `${contato}`,
        message,
        mentioned
      );
    }

    return res.status(201).json({ status: 'success', response: response });
  } catch (error) {
    req.logger.error(error);
    return res.status(500).json({
      status: 'error',
      message: 'Error on send message mentioned',
      error: error,
    });
  }
}
export async function sendImageAsSticker(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
      required: true,
      "@content": {
        "application/json": {
          schema: {
            type: "object",
            properties: {
              "phone": { type: "string" },
              "isGroup": { type: "boolean" },
              "path": { type: "string" }
            },
            required: ["phone", "path"]
          },
          examples: {
            "Default": {
              value: {
                "phone": "5521999999999",
                "isGroup": true,
                "path": "<path_file>"
              }
            }
          }
        }
      }
    }
   */
  const { phone, path } = req.body;

  if (!path && !req.file)
    return res.status(401).send({
      message: 'Sending the file is mandatory',
    });

  const pathFile = path || req.file?.path;

  try {
    const results: any = [];
    for (const contato of phone) {
      results.push(await req.client.sendImageAsSticker(contato, pathFile));
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    if (req.file) await unlinkAsync(pathFile);
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}
export async function sendImageAsStickerGif(req: Request, res: Response) {
  /**
   * #swagger.tags = ["Messages"]
     #swagger.autoBody=false
     #swagger.security = [{
            "bearerAuth": []
     }]
     #swagger.parameters["session"] = {
      schema: 'NERDWHATS_AMERICA'
     }
     #swagger.requestBody = {
      required: true,
      content: {
        'application/json': {
          schema: {
            type: 'object',
            properties: {
              phone: { type: 'string' },
              isGroup: { type: 'boolean' },
              path: { type: 'string' },
            },
            required: ['phone', 'path'],
          },
          examples: {
            'Default': {
              value: {
                phone: '5521999999999',
                isGroup: true,
                path: '<path_file>',
              },
            },
          },
        },
      },
    }
   */
  const { phone, path } = req.body;

  if (!path && !req.file)
    return res.status(401).send({
      message: 'Sending the file is mandatory',
    });

  const pathFile = path || req.file?.path;

  try {
    const results: any = [];
    for (const contato of phone) {
      results.push(await req.client.sendImageAsStickerGif(contato, pathFile));
    }

    if (results.length === 0)
      return res.status(400).json('Error sending message');
    if (req.file) await unlinkAsync(pathFile);
    returnSucess(res, results);
  } catch (error) {
    returnError(req, res, error);
  }
}

@pedromagnox
Copy link
Author

Não deu nenhum erro na instalação dessa vez 🙌

Qual seria a alteração que eu deveria esperar com essa correção @icleitoncosta?
Porque aparentemente não mudou nada. Seria transformar o id string em um object?
Seria um parâmetro novo com o id em outro lugar?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working needs triage
Projects
None yet
Development

No branches or pull requests

2 participants