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