new(all): Automation new keywords and WhatsApp transfer.
This commit is contained in:
parent
156eebc251
commit
465f0db5a0
3 changed files with 80 additions and 29 deletions
|
@ -42,8 +42,11 @@ import { SystemKeywords } from './SystemKeywords';
|
|||
import { GBMinService } from '../../core.gbapp/services/GBMinService';
|
||||
import { HubSpotServices } from '../../hubspot.gblib/services/HubSpotServices';
|
||||
import { WhatsappDirectLine } from '../../whatsapp.gblib/services/WhatsappDirectLine';
|
||||
import { GBAdminService } from '../../admin.gbapp/services/GBAdminService';
|
||||
import * as fs from 'fs';
|
||||
const DateDiff = require('date-diff');
|
||||
const puppeteer = require('puppeteer');
|
||||
const Path = require('path');
|
||||
|
||||
/**
|
||||
* Base services of conversation to be called by BASIC which
|
||||
|
@ -74,7 +77,7 @@ export class DialogKeywords {
|
|||
/**
|
||||
* The number used in this execution for HEAR calls (useful for SET SCHEDULE).
|
||||
*/
|
||||
hrOn: string;
|
||||
hrOn: string;
|
||||
|
||||
/**
|
||||
* When creating this keyword facade, a bot instance is
|
||||
|
@ -101,16 +104,15 @@ export class DialogKeywords {
|
|||
*/
|
||||
public async getPage(step, url) {
|
||||
|
||||
if (!this.browser)
|
||||
{
|
||||
if (!this.browser) {
|
||||
this.browser = await puppeteer.launch({
|
||||
args: [
|
||||
'--ignore-certificate-errors',
|
||||
'--no-sandbox',
|
||||
'--disable-setuid-sandbox',
|
||||
'--window-size=1920,1080',
|
||||
"--disable-accelerated-2d-canvas",
|
||||
"--disable-gpu"],
|
||||
'--ignore-certificate-errors',
|
||||
'--no-sandbox',
|
||||
'--disable-setuid-sandbox',
|
||||
'--window-size=1920,1080',
|
||||
"--disable-accelerated-2d-canvas",
|
||||
"--disable-gpu"],
|
||||
ignoreHTTPSErrors: true,
|
||||
headless: false,
|
||||
});
|
||||
|
@ -125,20 +127,33 @@ export class DialogKeywords {
|
|||
*
|
||||
* @example GET page, "elementName", "text"
|
||||
*/
|
||||
private async getByIDOrName(page, elementName) {
|
||||
|
||||
public async getBySelector(page, elementName) {
|
||||
await page.waitForSelector(elementName)
|
||||
let element = await page.$(elementName);
|
||||
return element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find element on page DOM.
|
||||
*
|
||||
* @example GET page, "frameSelector, "elementSelector"
|
||||
*/
|
||||
public async getByFrame(page, frame, selector) {
|
||||
await page.waitForSelector(frame)
|
||||
let frameHandle = await page.$(frame);
|
||||
const f = await frameHandle.contentFrame();
|
||||
await f.waitForSelector(selector);
|
||||
const element = await f.$(selector);
|
||||
return element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the today data filled in dd/mm/yyyy or mm/dd/yyyy.
|
||||
*
|
||||
* @example x = TODAY
|
||||
*/
|
||||
public async click(step, page, idOrName) {
|
||||
const e = await this.getByIDOrName(page, idOrName);
|
||||
const e = await this.getBySelector(page, idOrName);
|
||||
|
||||
await Promise.all([
|
||||
page.waitForNavigation(),
|
||||
|
@ -153,7 +168,7 @@ export class DialogKeywords {
|
|||
* @example file = SCREENSHOT page
|
||||
*/
|
||||
public async screenshot(step, page, idOrName, localName) {
|
||||
const e = await this.getByIDOrName(page, idOrName);
|
||||
const e = await this.getBySelector(page, idOrName);
|
||||
await e.screenshot({ path: localName });
|
||||
}
|
||||
|
||||
|
@ -164,7 +179,7 @@ export class DialogKeywords {
|
|||
*/
|
||||
public async download(step, page, idOrName, localName) {
|
||||
|
||||
const e = await this.getByIDOrName(page, idOrName);
|
||||
const e = await this.getBySelector(page, idOrName);
|
||||
const context = await this.browser.newContext({ acceptDownloads: true });
|
||||
|
||||
var cells = e.rows[0].cells;
|
||||
|
@ -184,8 +199,8 @@ export class DialogKeywords {
|
|||
*
|
||||
* @example TYPE page, "elementName", "text"
|
||||
*/
|
||||
public async type( step, page, idOrName, text) {
|
||||
const e = await this.getByIDOrName(page, idOrName);
|
||||
public async type(step, page, idOrName, text) {
|
||||
const e = await this.getBySelector(page, idOrName);
|
||||
await e.type(text);
|
||||
}
|
||||
|
||||
|
@ -579,7 +594,7 @@ export class DialogKeywords {
|
|||
*
|
||||
*/
|
||||
public async transferTo(step, to: string = null) {
|
||||
return await step.beginDialog('/t', {to: to});
|
||||
return await step.beginDialog('/t', { to: to });
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -607,14 +622,13 @@ export class DialogKeywords {
|
|||
};
|
||||
|
||||
// Waits for next message in HEAR delegated context.
|
||||
|
||||
|
||||
const mobile = await this.userMobile(step);
|
||||
while (true){
|
||||
if (WhatsappDirectLine.state[mobile] === 3)
|
||||
{
|
||||
while (true) {
|
||||
if (WhatsappDirectLine.state[mobile] === 3) {
|
||||
break;
|
||||
}
|
||||
sleep (5000);
|
||||
sleep(5000);
|
||||
}
|
||||
const result = WhatsappDirectLine.lastMessage[mobile];
|
||||
opts = await promise(step, result);
|
||||
|
@ -665,7 +679,7 @@ export class DialogKeywords {
|
|||
}
|
||||
|
||||
private static getChannel(step): string {
|
||||
if(!step) return 'whatsapp';
|
||||
if (!step) return 'whatsapp';
|
||||
if (!isNaN(step.context.activity['mobile'])) {
|
||||
return 'webchat';
|
||||
} else {
|
||||
|
@ -681,7 +695,30 @@ export class DialogKeywords {
|
|||
* Processes the sending of the file.
|
||||
*/
|
||||
private async internalSendFile(step, mobile, filename, caption) {
|
||||
if (filename.indexOf('.md') > -1) {
|
||||
|
||||
// Handles SEND FILE TO mobile, element in Web Automation.
|
||||
|
||||
|
||||
const page = filename._page;
|
||||
if (page) {
|
||||
const gbaiName = `${this.min.botId}.gbai`;
|
||||
const localName = Path.join( 'work', gbaiName,'cache', `img${GBAdminService.getRndReadableIdentifier()}.jpg`);
|
||||
await filename.screenshot({ path: localName });
|
||||
|
||||
const url = urlJoin(
|
||||
GBServer.globals.publicAddress,
|
||||
this.min.botId,
|
||||
'cache',
|
||||
Path.basename(localName)
|
||||
);
|
||||
|
||||
GBLog.info(`BASIC: WebAutomation: Sending the file ${url} to mobile ${mobile}.`);
|
||||
await this.min.conversationalService.sendFile(this.min, step, mobile, url, caption);
|
||||
}
|
||||
|
||||
// Handles Markdown.
|
||||
|
||||
else if (filename.indexOf('.md') > -1) {
|
||||
GBLog.info(`BASIC: Sending the contents of ${filename} markdown to mobile ${mobile}.`);
|
||||
const md = await this.min.kbService.getAnswerTextByMediaName(this.min.instance.instanceId, filename);
|
||||
if (!md) {
|
||||
|
@ -690,6 +727,7 @@ export class DialogKeywords {
|
|||
|
||||
await this.min.conversationalService['playMarkdown'](this.min, md,
|
||||
DialogKeywords.getChannel(step), step, mobile);
|
||||
|
||||
} else {
|
||||
GBLog.info(`BASIC: Sending the file ${filename} to mobile ${mobile}.`);
|
||||
const url = urlJoin(
|
||||
|
|
|
@ -311,11 +311,27 @@ export class GBVMService extends GBService {
|
|||
if ($2.indexOf('http') !== -1) {
|
||||
return `${$1} = sys().getByHttp (${$2}, headers, httpUsername, httpPs)`;
|
||||
} else {
|
||||
if ($2.indexOf(',') !== -1) {
|
||||
const values = $2.split(',');
|
||||
const count=($2.match(/\,/g) || []).length;
|
||||
const values = $2.split(',');
|
||||
|
||||
// Handles GET page, "selector".
|
||||
|
||||
if (count == 1) {
|
||||
|
||||
return `${$1} = this.getByIDOrName(${values[0]}, ${values[1]} )`;
|
||||
}
|
||||
|
||||
// Handles GET page, "frameSelector", "selector"
|
||||
|
||||
else if (count == 2) {
|
||||
|
||||
return `${$1} = this.getByFrame(${values[0]}, ${values[1]}, ${values[2]} )`;
|
||||
}
|
||||
|
||||
// Handles the GET http version.
|
||||
|
||||
else {
|
||||
|
||||
return `${$1} = sys().get (${$2})`;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -895,9 +895,6 @@ export class SystemKeywords {
|
|||
// Checks if the destination contains subfolders that
|
||||
// need to be created.
|
||||
|
||||
// Checks if the destination contains subfolders that
|
||||
// need to be created.
|
||||
|
||||
let folder;
|
||||
if (dest.indexOf('/') !== -1) {
|
||||
const pathOnly = path.dirname(dest);
|
||||
|
|
Loading…
Add table
Reference in a new issue