summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package-lock.json15
-rw-r--r--package.json2
-rw-r--r--src/config.ts2
-rw-r--r--src/index.ts23
4 files changed, 34 insertions, 8 deletions
diff --git a/package-lock.json b/package-lock.json
index 025a544..88623ad 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,6 +4,21 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+ "@types/bluebird": {
+ "version": "3.5.20",
+ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz",
+ "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==",
+ "dev": true
+ },
+ "@types/bluebird-global": {
+ "version": "3.5.5",
+ "resolved": "https://registry.npmjs.org/@types/bluebird-global/-/bluebird-global-3.5.5.tgz",
+ "integrity": "sha512-GkNTYT6dagBdgo1/SxY0b8afQb6NmPuh4tyyctSB8JCXQIswrOXJsnKvbavJIQ+sYCYI4WvcmMoM3GZnr0QArw==",
+ "dev": true,
+ "requires": {
+ "@types/bluebird": "3.5.20"
+ }
+ },
"@types/caseless": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz",
diff --git a/package.json b/package.json
index a840bc3..3305dd4 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"start": "ts-node src/index.ts"
},
"dependencies": {
+ "bluebird": "^3.5.1",
"cheerio": "^1.0.0-rc.2",
"googleapis": "^27.0.0",
"ical-generator": "^0.2.10",
@@ -17,6 +18,7 @@
"request-promise-native": "^1.0.5"
},
"devDependencies": {
+ "@types/bluebird-global": "^3.5.5",
"@types/cheerio": "^0.22.7",
"@types/request": "^2.47.0",
"@types/request-promise-native": "^1.0.14",
diff --git a/src/config.ts b/src/config.ts
index 77ab16e..a4f6691 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -6,6 +6,7 @@ import {IcalSink} from './sinks/IcalSink';
export interface SplusConfig {
course: string;
sink: ISink;
+ prefetchWeeks: number;
lectureFilter?: ILectureFilter;
}
@@ -13,6 +14,7 @@ export interface SplusConfig {
export const config: SplusConfig = {
course: '#SPLUS7A3292',
sink: new IcalSink('docs/informatik1.ics'),
+ prefetchWeeks: 4,
lectureFilter: lecture => {
// Filter some lectures out
diff --git a/src/index.ts b/src/index.ts
index 4fa7c20..ce1a70a 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,29 +1,36 @@
import * as moment from 'moment';
+import * as BPromise from 'bluebird';
import {config} from './config';
import {SplusApi} from './core/SplusApi';
import {IEvent} from './core/IEvent';
+import {ILecture} from './core/ILecture';
-async function main() {
+const flatten = (array) => [].concat(...array);
+const range = (upper: number): number[] => Array.from(Array(upper), (x, i) => i)
+
+async function main(configCourse, configPrefetchWeeks, configFilter) {
const baseDate = moment().startOf('week');
- const unfilteredLectures = await SplusApi.getData(config.course, baseDate.weeks());
- const lectures = unfilteredLectures.filter(config.lectureFilter);
- for (let i = 0; i < lectures.length; i++) {
- const lec = lectures[i];
+ const unfilteredLectureChunks: ILecture[][] = await BPromise.map(range(configPrefetchWeeks),
+ async week => await SplusApi.getData(configCourse, baseDate.weeks() + week)
+ );
+ const lectures: ILecture[] = flatten(unfilteredLectureChunks).filter(configFilter);
+ await BPromise.map(lectures, async (lec: ILecture, weeksAhead) => {
let beginDate = baseDate.clone();
beginDate.add(moment.duration({
days: lec.day + 1, // for moment: 1 = Monday
hours: lec.begin,
+ weeks: weeksAhead,
}));
let endDate = baseDate.clone();
endDate.add(moment.duration({
days: lec.day + 1,
hours: lec.end,
+ weeks: weeksAhead,
}));
-
const event: IEvent = {
summary: lec.title,
description: lec.lecturer + (lec.info !== '' ? ' - ' : '') + lec.info,
@@ -35,9 +42,9 @@ async function main() {
await config.sink.createEvent(event);
console.log(lec.title, beginDate.toISOString(), endDate.toISOString());
- }
+ });
await config.sink.commit();
}
-main();
+main(config.course, config.prefetchWeeks, config.lectureFilter).catch(console.log);