From 10dc3916067f02c504bf54a9a488e35db8ca914d Mon Sep 17 00:00:00 2001
From: Caesar2011
Date: Wed, 30 Jan 2019 14:41:05 +0100
Subject: [PATCH] Blackboard Event support
---
.../fuplanner/services/kvv/ModulesEvents.java | 78 ++++++++++++++++++-
.../fuplanner/services/kvv/ModulesList.java | 4 +-
.../fuplanner/tools/network/HTTPService.java | 2 +-
3 files changed, 81 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java
index 8e1a6b0..e3665a2 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesEvents.java
@@ -1,14 +1,20 @@
package de.sebse.fuplanner.services.kvv;
import android.content.Context;
+import android.text.TextUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
+import java.util.ArrayList;
+import java.util.regex.MatchResult;
+
import de.sebse.fuplanner.services.kvv.types.Event;
import de.sebse.fuplanner.services.kvv.types.EventList;
import de.sebse.fuplanner.services.kvv.types.Modules;
+import de.sebse.fuplanner.tools.Regex;
+import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
@@ -83,6 +89,76 @@ public class ModulesEvents extends PartModules {
@Override
protected void upgradeBB(String ID, NetworkCallback callback, NetworkErrorCallback errorCallback) {
- callback.onResponse(new EventList());
+ if (!mLogin.isInOnlineMode() || mLogin.getLoginTokenBB() == null || !mLogin.getLoginTokenBB().isAvailable()) {
+ errorCallback.onError(new NetworkError(101414, 500, "Currently running in offline mode!"));
+ return;
+ }
+ this.mList.find(ID, module -> {
+ log.d(module.lvNumber.size(), module.lvNumber);
+ log.d(module.lvNumber.iterator().next());
+ super.head(String.format("https://www.fu-berlin.de/vv/de/search?utf8=✓&query=%s", module.lvNumber.iterator().next()), null, response -> {
+ String location = response.getHeaders().get("Location");
+ if (location == null) {
+ // Events not available
+ callback.onResponse(new EventList());
+ //errorCallback.onError(new NetworkError(101410, 403, "Cannot get events!"));
+ return;
+ }
+ String group;
+ try {
+ group = Regex.regex("lv/([0-9]+)\\?", location);
+ } catch (NoSuchFieldException e) {
+ errorCallback.onError(new NetworkError(101410, 400, "Cannot get events!"));
+ e.printStackTrace();
+ return;
+ }
+ super.get(String.format("https://www.fu-berlin.de/vv/de/lv/%s", group), null, response1 -> {
+ String body = response1.getParsed();
+ log.d(response1.getHeaders().get("Location"));
+ if (body == null) {
+ errorCallback.onError(new NetworkError(101411, 400, "Cannot get events!"));
+ return;
+ }
+ EventList events = new EventList();
+ for (MatchResult match : Regex.allMatches("", body)) {
+ String entry = match.group(0);
+ String date;
+ String title = "";
+ try {
+ date = Regex.regex("[A-Z][a-z], [0-9]{2}\\.[0-9]{2}\\.[0-9]{4} [0-9]{2}:[0-9]{2} - [0-9]{2}:[0-9]{2}", entry, 0);
+ } catch (NoSuchFieldException e) {
+ errorCallback.onError(new NetworkError(101412, 400, "Cannot get events!"));
+ e.printStackTrace();
+ return;
+ }
+ try {
+ title = Regex.regex("([^<]*?)
", entry, 0);
+ } catch (NoSuchFieldException ignored) {}
+ if (TextUtils.isEmpty(title))
+ title = module.title;
+ ArrayList docents = new ArrayList<>();
+ ArrayList locations = new ArrayList<>();
+ for (MatchResult match1 : Regex.allMatches("[^~]*?
", entry)) {
+ if (match1.group(0).contains("Dozenten:")) {
+ for (MatchResult match2 : Regex.allMatches(">([^>]*?)", match1.group(0))) {
+ docents.add(match2.group(0).trim());
+ }
+ } else if (match1.group(0).contains("Räume:")) {
+ for (MatchResult match2 : Regex.allMatches("([^~]*?)
", match1.group(0))) {
+ locations.add(match2.group(1).trim());
+ }
+ }
+ }
+ long start = UtilsDate.stringToMillis(date.substring(4, 20), "dd.MM.yyyy HH:mm");
+ long duration = (Integer.parseInt(date.substring(23, 25))-Integer.parseInt(date.substring(15, 17)))*60
+ + Integer.parseInt(date.substring(26, 28))-Integer.parseInt(date.substring(18, 20));
+ duration = duration*60*1000-1;
+ String locationString = TextUtils.join(", ", locations);
+ events.add(new Event("", "Class section - Lecture", title, duration, start, ID, locationString));
+ }
+ callback.onResponse(events);
+ }, error -> errorCallback.onError(new NetworkError(101415, error.networkResponse.statusCode, "Cannot get events!")));
+ }, error -> errorCallback.onError(new NetworkError(101413, error.networkResponse.statusCode, "Cannot get events!")));
+ }, errorCallback);
}
}
diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java
index 9e9f2b1..dec31e9 100644
--- a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java
+++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java
@@ -273,8 +273,10 @@ public class ModulesList extends HTTPService {
break;
}
}
+ HashSet lvNumberSet = new HashSet<>();
+ lvNumberSet.add(lvNumber);
if (!found)
- modulesKVV.addModule(new Semester(semType.equals("W") ? Semester.SEM_WS : Semester.SEM_SS, Integer.valueOf(semYear)), new HashSet<>(), name, new LinkedHashSet<>(), type, "", courseId, Modules.TYPE_BB);
+ modulesKVV.addModule(new Semester(semType.equals("W") ? Semester.SEM_WS : Semester.SEM_SS, Integer.valueOf(semYear)), lvNumberSet, name, new LinkedHashSet<>(), type, "", courseId, Modules.TYPE_BB);
latch[0]--;
if (latch[0] == 0)
callback.onResponse(modulesKVV);
diff --git a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
index c18197f..41a027c 100644
--- a/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
+++ b/app/src/main/java/de/sebse/fuplanner/tools/network/HTTPService.java
@@ -60,7 +60,7 @@ public class HTTPService {
get(url, cookies, response, error, false);
}
- protected void get(String url, @Nullable final HashMap cookies, Response.Listener response, Response.ErrorListener error, boolean noBody) {
+ private void get(String url, @Nullable final HashMap cookies, Response.Listener response, Response.ErrorListener error, boolean noBody) {
int requestMethod = noBody ? Request.Method.HEAD : Request.Method.GET;
HttpRequest request = new HttpRequest(requestMethod, url, response, error) {
@Override