diff options
Diffstat (limited to 'src/handlers')
| -rw-r--r-- | src/handlers/attendConference.js | 23 | ||||
| -rw-r--r-- | src/handlers/index.js | 53 | ||||
| -rw-r--r-- | src/handlers/utils.js | 13 | 
3 files changed, 89 insertions, 0 deletions
| diff --git a/src/handlers/attendConference.js b/src/handlers/attendConference.js new file mode 100644 index 0000000..54d6479 --- /dev/null +++ b/src/handlers/attendConference.js @@ -0,0 +1,23 @@ +const { clickElementByXPath } = require('./utils.js'); + +const CONFERENCE_DURATION = 1000 * 60 * 80; // 80 minutes + + +const attendConference = async (page, onJoin) => { +    // Join as "Listen only" +    await clickElementByXPath(page, '//span[contains(text(),"Listen only")]'); +    if (typeof(onJoin) === 'function') onJoin(); +    console.log('Joined the conference'); + +    // Wait 5 seconds +    await page.waitForTimeout(CONFERENCE_DURATION); +    console.log('Time to leave!') + +    // Leave audio and close the tab +    await clickElementByXPath(page, '//button[contains(@aria-label,"Leave audio")]'); +    await page.waitForTimeout(1500); +    await page.close(); +    console.log('Left the conference'); +}; + +module.exports = attendConference; diff --git a/src/handlers/index.js b/src/handlers/index.js new file mode 100644 index 0000000..c50ef23 --- /dev/null +++ b/src/handlers/index.js @@ -0,0 +1,53 @@ +const puppeteer = require('puppeteer'); +const attendConference = require('./attendConference.js'); +const { clickElementBySelector } = require('./utils.js'); + +const { +  EDUFPMI_URL, +  EDUFPMI_USERNAME, +  EDUFPMI_PASSWORD, +  COURSE_URL +} = process.env; + +puppeteer.launch({ headless: true }) +  .then(async browser => { +    const page = await browser.newPage(); + +    // Login +    await page.goto(EDUFPMI_URL, { waitUntil: 'domcontentloaded' }); +    await page.type('input#username', EDUFPMI_USERNAME); +    await page.type('input#password', EDUFPMI_PASSWORD); +    await Promise.all([ +      clickElementBySelector(page, 'button#loginbtn'), +      page.waitForNavigation() +    ]); +    console.log(`Logged in as ${EDUFPMI_USERNAME}`); + +    // Find the course +    await page.goto(COURSE_URL); +    await Promise.all([ +      clickElementBySelector(page, 'li.bigbluebuttonbn a'), +      page.waitForNavigation() // Wait until the next page loads +    ]); + +    // Launch the conference in a new tab +    const conferencePagePromise = new Promise(resolve => browser.on( +      'targetcreated', +      target => resolve(target.page()) +    )); +    await clickElementBySelector(page, 'input#join_button_input'); +    const conferencePage = await conferencePagePromise; + +    // Prepare onJoin callback +    const fillAttendance = async () => { +      await page.goBack(); +      await clickElementBySelector(page, 'li.attendance a'); +      // TODO: actually fill the attendance +      console.log('Attendance filled'); +    }; + +    await attendConference(conferencePage, fillAttendance); +    await browser.close(); +  }) +  .catch(e => console.log(e)); + diff --git a/src/handlers/utils.js b/src/handlers/utils.js new file mode 100644 index 0000000..cf9fe38 --- /dev/null +++ b/src/handlers/utils.js @@ -0,0 +1,13 @@ +const clickElementByXPath = (page, xPath) => page +  .waitForXPath(xPath) +  .then(item => item.click()); + +const clickElementBySelector = (page, selector) => page +  .waitForSelector(selector) +  .then(item => item.click()); + + +module.exports = { +  clickElementByXPath, +  clickElementBySelector +}; | 
