summaryrefslogtreecommitdiff
path: root/src/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers')
-rw-r--r--src/handlers/attendConference.js23
-rw-r--r--src/handlers/index.js53
-rw-r--r--src/handlers/utils.js13
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
+};