Einleitung

Nachdem ich mich nun “Informatikstudent” nennen darf, bin ich nun wieder vermehrt an Termine und Veranstaltungen gebunden. An meiner Hochschule bin ich in der Studiengruppe “DAI 16/1”, dual-Angewandte Informatik, Studienjahr 2016, Gruppe 1. Neben einer zweiten Gruppe (DAI 16/2) gibt es noch einen parallelen Studiengang der Kommunikations- und Medieninformatik, mit dem wir die meisten Kurse parallel haben.   Aufgrund dieser Ähnlichkeiten und eventuell übergreifenden Veranstaltungen (Englischkurse etc) liefert die Hochschule keinen einzelnen Kalender, der nur “meine Veranstaltungen” anzeigt. Stattdessen liegen einige Termine übereinander und werden mir angezeigt, obwohl ich gar nicht betroffen bin. Um nachzuschauen, ob ich wirklich anwesend sein muss, muss ich die Veranstaltung jeweils aufmachen und im Description-Bereich nachsehen.

Warum einfach?

Natürlich könnte ich mir nun einfach den Kalender nehmen, mich für 30min hinsetzen und die nicht-passenden Daten löschen. Doch “das muss doch anders gehen”, habe ich mir gedacht. Einerseits läd Outlook die Daten immer wieder neu vom Hochschul-Server und verwirft bei einer Veränderung dererseits meine Änderungen, anderseits müsste ich dann jedes Semester bei der Freischaltung der neuen Daten den Eiertanz von Aufmachen-Ändern-Löschen-Weiter machen. Nachdem ich im letzten Frühjahr bereits mit Kalender-Daten gearbeitet habe, schien es mir einleuchtend diese Manipulation auch diesmal automatisiert zu machen.

Was möchte ich überhaupt?

Im Grunde wollte ich ein “kleines Skript”. Das ist klar, das möchte man immer. Bevor ich an den Code gegangen bin, habe ich eine kleine Test-Matrix aufgebaut:  

# Teil-Text im Description-Tag In meinem Kalender erwünscht?
A DAI 16 Ja
B DAI 16/1 Hell, ja!
C DAI 16/2 Geh mir bloß weg damit!
D DKMI Weiß nicht, hast du auch DAI?
E DKMI 16/1 Wenn ich auch dabei bin.
F DKMI 16/2   Wie gesagt, kommt drauf an.

Wie man merkt, sind die Testfälle D-F alleine nicht sehr aussagefähig, sondern erwarten noch A oder B bei der Entscheidung. Gekürzt könnte man schreiben:

A & !C

Sorry, das war etwas viel Text für so wenig Logik, aber du sollst den selben Leidensweg mitmachen, den ich auch hatte. >:D

Umsetzung

Das komplette Skript verfolgt also folgende Operationen:

  1. Kalender laden
  2. Header-Teil wegspeichern und Kalender in Events zerhacken.
  3. Jedes Event ansehen und entscheiden, ob das Event gelöscht wird (z.B. über filter())
  4. Kalender wieder zusammenbauen und ausgeben.

Dieses Mal habe ich mich für JavaScript entschieden, da ich dessen Umgang mit Arrays/Listen sehr umgänglich finde. Wegen der ohnehin langen Laufzeit (Der PHP-Call zum Hochschulserver wird ja auch jedes Mal ausgeführt und dauert relativ lange) habe ich mich entschieden, das Skript als Cronjob alle n Minuten auszuführen und dann gecacht auf meinen Webspace zu legen, ob sich JavaScript in diesem Bereich dann speicheranfälliger als eine schlanke C- oder gar Bash-Lösung erweist, war mir also egal*.

 

const https = require("https");
//Hochschulkalender-URL mit matrikelspezifischer ID, heute gekürzt
const url = "https://Hochschule.de/Kalender/get.php?s=DAI16";
                                                             
var req = https.get(url, (res) => {
  var body;
  res.on('data', (chunk) => {
    body += chunk;
  }).on('end', () => { //Split the calendar into dates
    var calendar = body.split("BEGIN:VEVENT");

    //Set the headers and shift the list by 1
    var newCal = calendar.shift();   

    //Remove "bad" items from the calendar list 
    calendar = calendar.filter((vevent) => { 
      // get a oneliner 
	  let asLine = vevent.split('\n').join('\n'); 
	  return /DAI/.test(asLine) && !(/DAI\s?16\/2/.test(asLine));
    }).join('BEGIN:VEVENT');
  
    //Join it back together. 
    newCal += "BEGIN:VEVENT" + calendar;   
  
    // check if vcalendar is closed 
    if(!/END:VCALENDAR$/gm.test(newCal)) { 
      // close it if not
      newCal += `END:VCALENDAR`; 
    } 
    
    //Write the calendar 
    console.log(newCal);
  })
});

Sänk ju

  An dieser Stelle möchte ich mich beim NonPolynomial für die Mithilfe und bei meinem Kommilitonen Julius bedanken. Während NonPolynomial mir hauptsächlich bei der JS-Umsetzung geholfen hat, ermutigte mich Julius immer wieder dazu, diesen Artikel zu schreiben. =).

Achtung, alt!

Dieser Post ist schon im letzten November entstanden. Heute habe ich ihn wiedergefunden und für gut empfunden, also habe ich ihn veröffentlicht.

Avatar

Veröffentlicht am von Jannik

Technik Uni open source

19 | der blasse, dünne Junge aus der Nachbarschaft | Macht Web Design, Theatertechnik und Pfadfinder | Ist #Wö‑Leiter | Studiert was mit Medien