UNPKG

@padrocha/uam-scraping

Version:

Scraping of teachers

364 lines (363 loc) 14.7 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.selectSchedule = exports.selectTeachers = exports.timeStringify = exports.timeParse = exports.tryDOM = exports.selectUEAS = exports.progressBar = exports.password = exports.askUser = exports.confirm = exports.log = exports.week = void 0; const readline_1 = __importDefault(require("readline")); const config_1 = require("./config"); String.prototype.capitalize = function () { return this.toLowerCase().replace(/(?:^|\s|["'([{])+\S/g, match => match.toUpperCase()); }; exports.week = new Array('monday', 'tuesday', 'wednesday', 'thursday', 'friday'); function log(param, pad = config_1.config.CONSOLESIZE) { param = ` ${param} `; const start = (pad - param.length) / 2 + param.length; console.log(param.padStart(Math.round(start), '-').padEnd(pad, '-')); } exports.log = log; function confirm(message) { const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout }); return new Promise(response => { rl.question(`\x1b[34m?\x1b[0m ${message} (Y/N)? `, (answer) => { process.stdout.moveCursor(0, -1); process.stdout.clearScreenDown(); response(new Array('y', 'Y', 's', 'S', '').includes(answer.trim())); rl.close(); }); }); } exports.confirm = confirm; function askUser() { const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout }); return new Promise(resolve => { rl.question('User: ', user => { resolve(user); rl.close(); }); }); } exports.askUser = askUser; function password() { const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout }); const stdoutMuted = true; const query = "Password : "; rl._writeToOutput = function _writeToOutput(stringToWrite) { const animation = (rl.line.length % 2 == 1) ? "=-" : "-="; if (stdoutMuted) process.stdout.write(`\x1B[2K\x1B[200D${query}[${animation}]`); else process.stdout.write(stringToWrite); }; return new Promise(resolve => { rl.question(query, function (password) { process.stdout.write('\n'); resolve(password); rl.close(); }); }); } exports.password = password; function progressBar(length = 0, count = 0) { const percent = count / length; const percent_handle = isNaN(percent) ? 0 : percent; const percent_fixed = Math.ceil(percent_handle * 100); const size = config_1.config.CONSOLESIZE - 4 - percent_fixed.toString().length; const bar = '.'.repeat(size * percent_handle).padEnd(size, " "); if (percent_handle === 1) { process.stdout.write(`\r[${bar}] ${percent_fixed}%`); process.stdout.write(`\r`); } else { process.stdout.write(`\r[${bar}] ${percent_fixed}%`); } } exports.progressBar = progressBar; function selectUEAS(ueas_options) { const ueas = ueas_options.map(option => { return Object.assign(Object.assign({}, option), { choosed: false }); }); let index = 0; let toogle = false; const menu = () => { if (!!toogle) { process.stdout.moveCursor(0, -(ueas.length - 1)); process.stdout.cursorTo(0); process.stdout.clearScreenDown(); } else { toogle = true; } ueas.forEach(({ name, choosed }, i) => { let option = (i === index) ? `\x1b[35m> ${name}` : name; if (!!choosed) { option = `\x1b[4m${option}`; } process.stdout.write(`${option}\x1b[0m${i !== ueas.length - 1 ? '\n' : ''}`); }); }; return new Promise((resolve, rejected) => { console.log('\x1b[34m?\x1b[0m %s', 'Choose what subjects are taken'); console.log('\x1b[31m!\x1b[0m %s', 'Press [Esc] to resume process'); readline_1.default.emitKeypressEvents(process.stdin); if (process.stdin.isTTY) { process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.on('keypress', (_, { name, ctrl }) => { if (name === 'down' && index < ueas.length - 1) { ++index; } else if (name === 'up' && index > 0) { --index; } if (name === 'return') { ueas[index].choosed = !ueas[index].choosed; } if (name === 'escape' || (name === 'c' && ctrl)) { process.stdin.setRawMode(false); process.stdin.pause(); if (name === 'c' && ctrl) process.exit(0); process.stdout.moveCursor(0, -(ueas.length + 1)); process.stdout.cursorTo(0); process.stdout.clearScreenDown(); resolve(ueas.filter(option => { const choosed = option.choosed; delete option.choosed; return choosed; })); process.stdin.removeAllListeners('keypress'); } else { menu(); } }); menu(); } else { rejected('Idk man, you r ugly'); } }); } exports.selectUEAS = selectUEAS; function tryDOM(callback, DOM) { return __awaiter(this, void 0, void 0, function* () { let response; let response_tries = 0; do { response = yield callback(); if (response_tries === config_1.config.TRIES) { throw new Error("Element from DOM couldn´t load property"); } else if (!response) { yield DOM.waitForTimeout(config_1.config.TIMEOUT); ++response_tries; } if (response instanceof Array && response.length < 1) { response = undefined; } } while (!response); return response; }); } exports.tryDOM = tryDOM; function timeParse(time) { const [starts, ends] = time.slice(0, 13).trim().split(' - '); return time.trim().length > 1 ? { starts, ends } : null; } exports.timeParse = timeParse; function timeStringify(time) { const timeDate = new Date(time); const hours = timeDate.getHours().toString(); const minutes = timeDate.getMinutes().toString(); return (hours.length < 2 ? 0 + hours : hours) + ':' + (minutes.length < 2 ? 0 + minutes : minutes); } exports.timeStringify = timeStringify; function selectTeachers(teachers_options) { let teachers = Array.from(teachers_options).map(name => { return { name, choosed: false }; }).sort(({ name: a }, { name: b }) => (a < b) ? -1 : ((a > b) ? 1 : 0)); let index = 0; let toogle = false; const menu = () => { if (!!toogle) { process.stdout.moveCursor(0, -(teachers.length - 1)); process.stdout.cursorTo(0); process.stdout.clearScreenDown(); } else { toogle = true; } teachers.forEach(({ name, choosed }, i) => { let option = (i === index) ? `\x1b[35m> ${name.capitalize()}` : name.capitalize(); if (!!choosed) { option = `\x1b[4m${option}`; } process.stdout.write(`${option}\x1b[0m${i !== teachers.length - 1 ? '\n' : ''}`); }); }; return new Promise((resolve, rejected) => { console.log('\x1b[34m?\x1b[0m %s', 'Choose what subjects are taken'); console.log('\x1b[31m!\x1b[0m %s', 'Press [Esc] to resume process'); readline_1.default.emitKeypressEvents(process.stdin); if (process.stdin.isTTY) { process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.on('keypress', (_, { name, ctrl }) => { if (name === 'down' && index < teachers.length - 1) { ++index; } else if (name === 'up' && index > 0) { --index; } if (name === 'return') { teachers[index].choosed = !teachers[index].choosed; } if (name === 'escape' || (name === 'c' && ctrl)) { process.stdin.setRawMode(false); process.stdin.pause(); if (name === 'c' && ctrl) process.exit(0); process.stdout.moveCursor(0, -(teachers.length + 1)); process.stdout.cursorTo(0); process.stdout.clearScreenDown(); resolve(teachers.filter(({ choosed }) => choosed).map(({ name }) => name)); process.stdin.removeAllListeners('keypress'); } else { menu(); } }); menu(); } else { rejected('Idk man, you r ugly'); } }); } exports.selectTeachers = selectTeachers; function selectSchedule(schedules) { let index = 0; let toogle = false; let clear_area = 4; let byDay; let schedule_subjects; const display = () => { if (!!toogle) { process.stdout.moveCursor(0, -clear_area); process.stdout.cursorTo(0); process.stdout.clearScreenDown(); clear_area = 4; } else { toogle = true; } const [, schedule] = schedules[index]; const min_date = Math.min.apply(Math, exports.week.map(day => Math.min.apply(Math, Array.from(schedule) .filter(([, { [day]: _ }]) => _) .map(([, { [day]: _ }]) => Date.parse('01/01/1970 ' + (_ === null || _ === void 0 ? void 0 : _.starts)))))); const max_date = Math.max.apply(Math, exports.week.map(day => Math.max.apply(Math, Array.from(schedule) .filter(([, { [day]: _ }]) => _) .map(([, { [day]: _ }]) => Date.parse('01/01/1970 ' + (_ === null || _ === void 0 ? void 0 : _.ends)))))); clear_area += schedule.size; schedule_subjects = Array.from(schedule).map(([subject, schedule_info]) => { console.log(`${schedule_info.key} | ${schedule_info.teacher.name.capitalize()} | ${subject}`); return { key: schedule_info.key, teacher: schedule_info.teacher.name.capitalize(), subject }; }); byDay = {}; for (let i = min_date; i < max_date; i += 1800000) { const curr_time = timeStringify(i); const week_time = { monday: null, tuesday: null, wednesday: null, thursday: null, friday: null, }; for (const day of exports.week) { for (const [, { key, [day]: _ }] of schedule) { if (_) { if (curr_time >= _.starts && curr_time < _.ends) { week_time[day] = !week_time[day] ? key : key + '/' + week_time[day]; } } } } byDay[curr_time] = week_time; ++clear_area; } console.table(byDay); const left = index !== 0 ? '<' : ''; const right = index !== schedules.length - 1 ? '>' : ''; process.stdout.write(`\x1b[34m?\x1b[0m Index ${left}[${index + 1}/${schedules.length}]${right}`); }; return new Promise((resolve, reject) => { console.log('\x1b[34m?\x1b[0m %s', 'Browse the best schedules posible'); console.log('\x1b[31m!\x1b[0m %s', 'Press [Enter] to choose schedule'); readline_1.default.emitKeypressEvents(process.stdin); if (process.stdin.isTTY) { process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.on('keypress', (_, { name, ctrl }) => { if (name === 'right' && index < schedules.length - 1) { ++index; } else if (name === 'left' && index > 0) { --index; } if (name === 'return' || (name === 'c' && ctrl)) { process.stdin.setRawMode(false); process.stdin.pause(); if (name === 'c' && ctrl) process.exit(0); process.stdout.moveCursor(0, -(clear_area + 2)); process.stdout.cursorTo(0); process.stdout.clearScreenDown(); resolve({ subjects_info: schedule_subjects, hours: byDay }); process.stdin.removeAllListeners('keypress'); } else { display(); } }); display(); } else { reject('I still dunno man, fkg creep'); } }); } exports.selectSchedule = selectSchedule;