fix(whatsapp.lib): Sending of images in official.
This commit is contained in:
		
							parent
							
								
									cebb6b4e1f
								
							
						
					
					
						commit
						1d4a794fb9
					
				
					 1 changed files with 73 additions and 90 deletions
				
			
		| 
						 | 
				
			
			@ -103,8 +103,7 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
    this.whatsappServiceKey = whatsappServiceKey;
 | 
			
		||||
    this.whatsappServiceNumber = whatsappServiceNumber;
 | 
			
		||||
    this.whatsappServiceUrl = whatsappServiceUrl;
 | 
			
		||||
    this.provider = whatsappServiceKey === 'internal'
 | 
			
		||||
      ? 'GeneralBots' : 'meta';
 | 
			
		||||
    this.provider = whatsappServiceKey === 'internal' ? 'GeneralBots' : 'meta';
 | 
			
		||||
    this.groupId = groupId;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,8 +140,8 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
        const localName = Path.join('work', gbaiPath, 'profile');
 | 
			
		||||
        const createClient = () => {
 | 
			
		||||
          const client = (this.customClient = new Client({
 | 
			
		||||
            puppeteer: GBSSR.preparePuppeteer(localName)
 | 
			
		||||
            , webVersionCache: {
 | 
			
		||||
            puppeteer: GBSSR.preparePuppeteer(localName),
 | 
			
		||||
            webVersionCache: {
 | 
			
		||||
              type: 'remote',
 | 
			
		||||
              remotePath: `https://raw.githubusercontent.com/wppconnect-team/wa-version/main/html/${webVersion}.html`
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -167,26 +166,32 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
 | 
			
		||||
              const s = new DialogKeywords();
 | 
			
		||||
              const qrBuf = await s.getQRCode({ pid, text: qr });
 | 
			
		||||
              const localName = Path.join('work', gbaiPath, 'cache', `qr${GBAdminService.getRndReadableIdentifier()}.png`);
 | 
			
		||||
              Fs.writeFileSync(localName, qrBuf.data);
 | 
			
		||||
              const url = urlJoin(
 | 
			
		||||
                GBServer.globals.publicAddress,
 | 
			
		||||
                this.min.botId,
 | 
			
		||||
              const localName = Path.join(
 | 
			
		||||
                'work',
 | 
			
		||||
                gbaiPath,
 | 
			
		||||
                'cache',
 | 
			
		||||
                Path.basename(localName)
 | 
			
		||||
                `qr${GBAdminService.getRndReadableIdentifier()}.png`
 | 
			
		||||
              );
 | 
			
		||||
              Fs.writeFileSync(localName, qrBuf.data);
 | 
			
		||||
              const url = urlJoin(GBServer.globals.publicAddress, this.min.botId, 'cache', Path.basename(localName));
 | 
			
		||||
 | 
			
		||||
              if (adminNumber) {
 | 
			
		||||
                await GBServer.globals.minBoot.whatsAppDirectLine.sendFileToDevice(adminNumber, url, Path.basename(localName), msg);
 | 
			
		||||
                await GBServer.globals.minBoot.whatsAppDirectLine.sendFileToDevice(
 | 
			
		||||
                  adminNumber,
 | 
			
		||||
                  url,
 | 
			
		||||
                  Path.basename(localName),
 | 
			
		||||
                  msg
 | 
			
		||||
                );
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              if (adminEmail) {
 | 
			
		||||
                await s.sendEmail({
 | 
			
		||||
                  pid, to: adminEmail, subject: `Check your WhatsApp for bot ${this.min.botId}`,
 | 
			
		||||
                  pid,
 | 
			
		||||
                  to: adminEmail,
 | 
			
		||||
                  subject: `Check your WhatsApp for bot ${this.min.botId}`,
 | 
			
		||||
                  body: msg
 | 
			
		||||
                });
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
            }).bind(this)
 | 
			
		||||
          );
 | 
			
		||||
          client.on('authenticated', async () => {
 | 
			
		||||
| 
						 | 
				
			
			@ -267,19 +272,15 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
      case 'meta':
 | 
			
		||||
        if (req.body.entry[0].changes[0].value.messages[0].text) {
 | 
			
		||||
          text = req.body.entry[0].changes[0].value.messages[0].text.body;
 | 
			
		||||
        }
 | 
			
		||||
        else if (req.body.entry[0].changes[0].value.messages[0].button) {
 | 
			
		||||
        } else if (req.body.entry[0].changes[0].value.messages[0].button) {
 | 
			
		||||
          text = req.body.entry[0].changes[0].value.messages[0].button.text;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
        } else {
 | 
			
		||||
          res.status(200);
 | 
			
		||||
          res.end();
 | 
			
		||||
 | 
			
		||||
          return;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        from = req.body.entry[0].changes[0].value.messages[0].from;
 | 
			
		||||
        to = this.min.core.getParam<string>(this.min.instance, 'Bot Number', null);
 | 
			
		||||
        fromName = req.body.entry[0].changes[0].value.contacts[0].profile.name;
 | 
			
		||||
| 
						 | 
				
			
			@ -359,12 +360,10 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
      // Bot name must be specified on config.
 | 
			
		||||
 | 
			
		||||
      if (botGroupID === group) {
 | 
			
		||||
 | 
			
		||||
        // Shortcut has been mentioned?
 | 
			
		||||
 | 
			
		||||
        let found = false;
 | 
			
		||||
        parts.forEach(e1 => {
 | 
			
		||||
 | 
			
		||||
          botShortcuts.forEach(e2 => {
 | 
			
		||||
            if (e1 === e2 && !found) {
 | 
			
		||||
              found = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -393,7 +392,6 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
        if (botNumber && !answerText && !found) {
 | 
			
		||||
          botNumber = botNumber.replace('+', '');
 | 
			
		||||
          if (!message.body.startsWith('@' + botNumber)) {
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -484,7 +482,10 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
          await sec.updateHumanAgent(manualUser.userSystemId, this.min.instance.instanceId, null);
 | 
			
		||||
          await sec.updateHumanAgent(user.agentSystemId, this.min.instance.instanceId, null);
 | 
			
		||||
        } else {
 | 
			
		||||
          GBLogEx.info(this.min, `HUMAN AGENT (${manualUser.agentSystemId}) TO USER ${manualUser.userSystemId}: ${text}`);
 | 
			
		||||
          GBLogEx.info(
 | 
			
		||||
            this.min,
 | 
			
		||||
            `HUMAN AGENT (${manualUser.agentSystemId}) TO USER ${manualUser.userSystemId}: ${text}`
 | 
			
		||||
          );
 | 
			
		||||
          await this.sendToDeviceEx(manualUser.userSystemId, `AGENT: *${text}*`, locale, null);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -611,9 +612,7 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
        watermark = response.obj.watermark;
 | 
			
		||||
        await this.printMessages(response.obj.activities, conversationId, from, fromName);
 | 
			
		||||
      } catch (error) {
 | 
			
		||||
        GBLog.error(
 | 
			
		||||
          `Error calling printMessages on Whatsapp channel ${JSON.stringify(error)}`
 | 
			
		||||
        );
 | 
			
		||||
        GBLog.error(`Error calling printMessages on Whatsapp channel ${JSON.stringify(error)}`);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    setInterval(worker, this.pollInterval);
 | 
			
		||||
| 
						 | 
				
			
			@ -671,6 +670,22 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
  public async sendFileToDevice(to, url, filename, caption, chatId) {
 | 
			
		||||
    let options;
 | 
			
		||||
    switch (this.provider) {
 | 
			
		||||
      case 'meta':
 | 
			
		||||
        let whatsappServiceNumber, whatsappServiceKey;
 | 
			
		||||
        let botNumber = this.min.core.getParam<string>(this.min.instance, 'Bot Number', null);
 | 
			
		||||
 | 
			
		||||
        if (botNumber && this.min.instance.whatsappServiceNumber) {
 | 
			
		||||
          whatsappServiceNumber = this.min.instance.whatsappServiceNumber;
 | 
			
		||||
          whatsappServiceKey = this.min.instance.whatsappServiceKey;
 | 
			
		||||
        } else {
 | 
			
		||||
          whatsappServiceNumber = GBServer.globals.minBoot.instance.whatsappServiceNumber;
 | 
			
		||||
          whatsappServiceKey = GBServer.globals.minBoot.instance.whatsappServiceKey;
 | 
			
		||||
        }
 | 
			
		||||
        const driver = createBot(whatsappServiceNumber, whatsappServiceKey);
 | 
			
		||||
        await driver.sendImage(to, url, { caption: caption });
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case 'GeneralBots':
 | 
			
		||||
        const attachment = await MessageMedia.fromUrl(url);
 | 
			
		||||
        to = to.replace('+', '');
 | 
			
		||||
| 
						 | 
				
			
			@ -684,7 +699,6 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
 | 
			
		||||
        await this.customClient.sendMessage(to, attachment, { caption: caption });
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (options) {
 | 
			
		||||
| 
						 | 
				
			
			@ -706,7 +720,6 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
        await this.customClient.sendMessage(to, attachment);
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (options) {
 | 
			
		||||
| 
						 | 
				
			
			@ -740,30 +753,25 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
 | 
			
		||||
      switch (this.provider) {
 | 
			
		||||
        case 'meta':
 | 
			
		||||
 | 
			
		||||
          let whatsappServiceNumber, whatsappServiceKey;
 | 
			
		||||
          if (botNumber && this.min.instance.whatsappServiceNumber){
 | 
			
		||||
          if (botNumber && this.min.instance.whatsappServiceNumber) {
 | 
			
		||||
            whatsappServiceNumber = this.min.instance.whatsappServiceNumber;
 | 
			
		||||
            whatsappServiceKey = this.min.instance.whatsappServiceKey
 | 
			
		||||
          }
 | 
			
		||||
          else{
 | 
			
		||||
            whatsappServiceKey = this.min.instance.whatsappServiceKey;
 | 
			
		||||
          } else {
 | 
			
		||||
            whatsappServiceNumber = GBServer.globals.minBoot.instance.whatsappServiceNumber;
 | 
			
		||||
            whatsappServiceKey = GBServer.globals.minBoot.instance.whatsappServiceKey
 | 
			
		||||
            whatsappServiceKey = GBServer.globals.minBoot.instance.whatsappServiceKey;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          const driver = createBot(whatsappServiceNumber, whatsappServiceKey);
 | 
			
		||||
 | 
			
		||||
          if (msg['name']) {
 | 
			
		||||
            const res = await driver.sendTemplate(to, msg['name'], 'pt_br', msg['components']);
 | 
			
		||||
            
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
 | 
			
		||||
            messages = msg.match(/(.|[\r\n]){1,4096}/g)
 | 
			
		||||
          } else {
 | 
			
		||||
            messages = msg.match(/(.|[\r\n]){1,4096}/g);
 | 
			
		||||
 | 
			
		||||
            await CollectionUtil.asyncForEach(messages, async msg => {
 | 
			
		||||
              await driver.sendText(to, msg);
 | 
			
		||||
              
 | 
			
		||||
 | 
			
		||||
              await GBUtil.sleep(3000);
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
| 
						 | 
				
			
			@ -771,21 +779,19 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
          break;
 | 
			
		||||
        case 'official':
 | 
			
		||||
          if (to.charAt(0) !== '+') {
 | 
			
		||||
            to = `+${to}`
 | 
			
		||||
            to = `+${to}`;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          messages = msg.match(/(.|[\r\n]){1,1000}/g)
 | 
			
		||||
          messages = msg.match(/(.|[\r\n]){1,1000}/g);
 | 
			
		||||
 | 
			
		||||
          await CollectionUtil.asyncForEach(messages, async msg => {
 | 
			
		||||
            await GBUtil.sleep(3000);
 | 
			
		||||
            await this.customClient.messages
 | 
			
		||||
              .create({
 | 
			
		||||
                body: msg,
 | 
			
		||||
                from: `whatsapp:${botNumber}`,
 | 
			
		||||
                to: `whatsapp:${to}`
 | 
			
		||||
                // TODO: mediaUrl.
 | 
			
		||||
              });
 | 
			
		||||
 | 
			
		||||
            await this.customClient.messages.create({
 | 
			
		||||
              body: msg,
 | 
			
		||||
              from: `whatsapp:${botNumber}`,
 | 
			
		||||
              to: `whatsapp:${to}`
 | 
			
		||||
              // TODO: mediaUrl.
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
| 
						 | 
				
			
			@ -799,15 +805,13 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
              to = to + '@c.us';
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          if (await this.customClient.getState() === WAState.CONNECTED) {
 | 
			
		||||
          if ((await this.customClient.getState()) === WAState.CONNECTED) {
 | 
			
		||||
            await this.customClient.sendMessage(to, msg);
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
          } else {
 | 
			
		||||
            GBLogEx.info(this.min, `WhatsApp OFFLINE ${to}: ${msg}`);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (options) {
 | 
			
		||||
| 
						 | 
				
			
			@ -838,12 +842,9 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
      let text;
 | 
			
		||||
 | 
			
		||||
      switch (provider) {
 | 
			
		||||
 | 
			
		||||
        case 'meta':
 | 
			
		||||
          
 | 
			
		||||
          if (req.body.entry[0].changes[0].value.statuses) {
 | 
			
		||||
            if (req.body.entry[0].changes[0].value.statuses[0].status === 'failed'){
 | 
			
		||||
    
 | 
			
		||||
            if (req.body.entry[0].changes[0].value.statuses[0].status === 'failed') {
 | 
			
		||||
              GBLogEx.error(this.min, `WhatsApp:${id} ${senderName} ${JSON.stringify(req.body.entry[0].changes[0])}.`);
 | 
			
		||||
            }
 | 
			
		||||
            res.status(200);
 | 
			
		||||
| 
						 | 
				
			
			@ -851,20 +852,16 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
          if (req.body.entry[0].changes[0].value.messages[0].text) {
 | 
			
		||||
            text = req.body.entry[0].changes[0].value.messages[0].text.body;
 | 
			
		||||
          }
 | 
			
		||||
          else if (req.body.entry[0].changes[0].value.messages[0].button) {
 | 
			
		||||
          } else if (req.body.entry[0].changes[0].value.messages[0].button) {
 | 
			
		||||
            text = req.body.entry[0].changes[0].value.messages[0].button.text;
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
          } else {
 | 
			
		||||
            res.status(200);
 | 
			
		||||
            res.end();
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
          }
 | 
			
		||||
          id = req.body.entry[0].changes[0].value.messages[0].from;
 | 
			
		||||
          senderName = req.body.entry[0].changes[0].value.contacts[0].profile.name;
 | 
			
		||||
| 
						 | 
				
			
			@ -874,7 +871,6 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
          break;
 | 
			
		||||
 | 
			
		||||
        case 'official':
 | 
			
		||||
 | 
			
		||||
          const { body } = req;
 | 
			
		||||
 | 
			
		||||
          id = body.From.replace(/whatsapp\:\+/, '');
 | 
			
		||||
| 
						 | 
				
			
			@ -895,7 +891,6 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
          text = req.body;
 | 
			
		||||
          botId = botId ?? this.botId;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const sec = new SecService();
 | 
			
		||||
| 
						 | 
				
			
			@ -906,7 +901,6 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
        p => p.instance.botId.toLowerCase() === text.toLowerCase()
 | 
			
		||||
      )[0];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      botId = botId ?? GBServer.globals.minBoot.botId;
 | 
			
		||||
      GBLogEx.info(this.min, `A WhatsApp mobile requested instance for: ${botId}.`);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -919,21 +913,11 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
      const botNumber = urlMin ? urlMin.core.getParam(urlMin.instance, 'Bot Number', null) : null;
 | 
			
		||||
      if (botNumber && GBServer.globals.minBoot.botId !== urlMin.botId) {
 | 
			
		||||
        GBLogEx.info(this.min, `${id} fixed by bot number talked to: ${botId}.`);
 | 
			
		||||
        let locale = user?.locale ? user.locale : min.core.getParam(
 | 
			
		||||
          min.instance,
 | 
			
		||||
          'Default User Language',
 | 
			
		||||
          GBConfigService.get('DEFAULT_USER_LANGUAGE'));
 | 
			
		||||
        ;
 | 
			
		||||
 | 
			
		||||
        let locale = user?.locale
 | 
			
		||||
          ? user.locale
 | 
			
		||||
          : min.core.getParam(min.instance, 'Default User Language', GBConfigService.get('DEFAULT_USER_LANGUAGE'));
 | 
			
		||||
        if (!user) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          const detectLanguage =
 | 
			
		||||
            min.core.getParam(
 | 
			
		||||
              min.instance,
 | 
			
		||||
              'Language Detector',
 | 
			
		||||
              false) != false;
 | 
			
		||||
 | 
			
		||||
          const detectLanguage = min.core.getParam(min.instance, 'Language Detector', false) != false;
 | 
			
		||||
 | 
			
		||||
          if (text != '' && detectLanguage) {
 | 
			
		||||
            locale = await min.conversationalService.getLanguage(min, text);
 | 
			
		||||
| 
						 | 
				
			
			@ -960,14 +944,15 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
          );
 | 
			
		||||
 | 
			
		||||
          req.body = text;
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
          await this.sendToDevice(user.userSystemId, `No momento estou apenas conseguindo ler mensagens de texto.`, null);
 | 
			
		||||
          await this.sendToDevice(
 | 
			
		||||
            user.userSystemId,
 | 
			
		||||
            `No momento estou apenas conseguindo ler mensagens de texto.`,
 | 
			
		||||
            null
 | 
			
		||||
          );
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      let activeMin;
 | 
			
		||||
 | 
			
		||||
      // Processes group behaviour.
 | 
			
		||||
| 
						 | 
				
			
			@ -1031,7 +1016,6 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
      // start dialog if any is specified in Config.xlsx.
 | 
			
		||||
 | 
			
		||||
      if (user === null || user.hearOnDialog) {
 | 
			
		||||
 | 
			
		||||
        user = await sec.ensureUser(activeMin, id, senderName, '', 'whatsapp', senderName, null);
 | 
			
		||||
 | 
			
		||||
        const startDialog = user.hearOnDialog
 | 
			
		||||
| 
						 | 
				
			
			@ -1068,9 +1052,8 @@ export class WhatsappDirectLine extends GBService {
 | 
			
		|||
          user = await sec.updateUserInstance(id, instance.instanceId);
 | 
			
		||||
          await (activeMin as any).whatsAppDirectLine.resetConversationId(activeMin.botId, id, '');
 | 
			
		||||
          const startDialog = activeMin.core.getParam(activeMin.instance, 'Start Dialog', null);
 | 
			
		||||
          ChatServices.memoryMap [user.userSystemId] = null;
 | 
			
		||||
          ChatServices.memoryMap[user.userSystemId] = null;
 | 
			
		||||
          if (startDialog) {
 | 
			
		||||
 | 
			
		||||
            GBLogEx.info(this.min, `Calling /start for Auto start : ${startDialog} for ${activeMin.instance.botId}...`);
 | 
			
		||||
            if (provider === 'GeneralBots') {
 | 
			
		||||
              req.body = `/start`;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue