Compare commits
7 Commits
1.3.0
...
f98dc3d808
Author | SHA1 | Date | |
---|---|---|---|
f98dc3d808
|
|||
5d37c436ca
|
|||
4e26a431cd
|
|||
f5ea292c6e
|
|||
c5916c65ae
|
|||
cf979df46e
|
|||
b4f7f48590
|
30
.drone.yml
Normal file
30
.drone.yml
Normal file
@ -0,0 +1,30 @@
|
||||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: test
|
||||
image: gradle:jdk11
|
||||
commands:
|
||||
- gradle test
|
||||
|
||||
- name: build
|
||||
image: gradle:jdk11
|
||||
commands:
|
||||
- gradle bootJar
|
||||
when:
|
||||
event:
|
||||
- tag
|
||||
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
settings:
|
||||
username:
|
||||
from_secret: docker_username
|
||||
password:
|
||||
from_secret: docker_password
|
||||
repo: mosadxyz/tcor
|
||||
tags:
|
||||
- latest
|
||||
when:
|
||||
event:
|
||||
- tag
|
@ -1,21 +0,0 @@
|
||||
pipeline:
|
||||
test:
|
||||
image: gradle:jdk11
|
||||
commands:
|
||||
- gradle test
|
||||
build:
|
||||
image: gradle:jdk11
|
||||
commands:
|
||||
- gradle bootJar
|
||||
when:
|
||||
event:
|
||||
- tag
|
||||
docker:
|
||||
image: techknowlogick/drone-docker
|
||||
privileged: true
|
||||
repo: mosadxyz/tcor
|
||||
secrets: [docker_username, docker_password]
|
||||
tags: latest
|
||||
when:
|
||||
event:
|
||||
- tag
|
@ -1,5 +1,5 @@
|
||||

|
||||
[](https://ci.mosad.xyz/Seil0/TheCitadelofRicks)
|
||||
[](https://drone.mosad.xyz/Seil0/TheCitadelofRicks)
|
||||
[](https://git.mosad.xyz/Seil0/TheCitadelofRicks/releases)
|
||||
[](https://www.gnu.org/licenses/gpl-3.0)
|
||||
# TheCitadelofRicks
|
||||
|
@ -6,7 +6,7 @@ plugins {
|
||||
}
|
||||
|
||||
group 'org.mosad'
|
||||
version '1.3.0'
|
||||
version '1.2.7'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
@ -48,8 +48,8 @@ class APIController {
|
||||
private val logger: Logger = LoggerFactory.getLogger(APIController::class.java)
|
||||
|
||||
companion object {
|
||||
const val apiVersion = "1.3.0"
|
||||
const val softwareVersion = "1.3.0"
|
||||
const val apiVersion = "1.2.0"
|
||||
const val softwareVersion = "1.2.7"
|
||||
val startTime = System.currentTimeMillis() / 1000
|
||||
}
|
||||
|
||||
|
@ -46,9 +46,6 @@ data class MensaMeta(val updateTime: Long, val mensaName: String)
|
||||
data class MensaMenu(val meta: MensaMeta, val currentWeek: MensaWeek, val nextWeek: MensaWeek)
|
||||
|
||||
// data classes for the timetable part
|
||||
|
||||
data class CalendarWeek(val week: Int, val year: Int)
|
||||
|
||||
data class Lesson(
|
||||
val lessonID: String,
|
||||
val lessonSubject: String,
|
||||
@ -61,7 +58,7 @@ data class TimetableDay(val timeslots: Array<ArrayList<Lesson>> = Array(6) { Arr
|
||||
|
||||
data class TimetableWeek(val days: Array<TimetableDay> = Array(6) { TimetableDay() })
|
||||
|
||||
data class TimetableCourseMeta(var updateTime: Long = 0, val courseName: String = "", val weekIndex: Int = 0, var weekNumberYear: Int = 0, val year: Int = 0, val link: String = "")
|
||||
data class TimetableCourseMeta(var updateTime: Long = 0, val courseName: String = "", val weekIndex: Int = 0, var weekNumberYear: Int = 0, val link: String = "")
|
||||
|
||||
data class TimetableCourseWeek(val meta: TimetableCourseMeta = TimetableCourseMeta(), var timetable: TimetableWeek = TimetableWeek())
|
||||
|
||||
|
@ -33,9 +33,9 @@ import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.io.*
|
||||
import java.util.*
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.collections.ArrayList
|
||||
import kotlin.collections.HashMap
|
||||
import kotlin.collections.HashSet
|
||||
import kotlin.concurrent.scheduleAtFixedRate
|
||||
import kotlin.time.Duration
|
||||
@ -53,7 +53,7 @@ class CacheController {
|
||||
|
||||
var courseList = CoursesList(CoursesMeta(), sortedMapOf())
|
||||
var mensaMenu = MensaMenu(MensaMeta(0, ""), MensaWeek(), MensaWeek())
|
||||
var timetableList = ConcurrentHashMap<String, TimetableCourseWeek>() // this list contains all timetables
|
||||
var timetableList = HashMap<String, TimetableCourseWeek>() // this list contains all timetables
|
||||
|
||||
/**
|
||||
* get a timetable, since they may not be cached, we need to make sure it's cached, otherwise download
|
||||
@ -68,7 +68,6 @@ class CacheController {
|
||||
val currentTime = System.currentTimeMillis() / 1000
|
||||
val timetableLink = "https://mosad.xyz"
|
||||
val weekNumberYear = 0
|
||||
val year = 0
|
||||
val instr = CacheController::class.java.getResourceAsStream("/html/Timetable_normal-week.html")
|
||||
|
||||
val timetableParser =
|
||||
@ -81,7 +80,6 @@ class CacheController {
|
||||
courseName,
|
||||
weekIndex,
|
||||
weekNumberYear,
|
||||
year,
|
||||
timetableLink
|
||||
), timetableTest ?: TimetableWeek()
|
||||
)
|
||||
@ -97,7 +95,7 @@ class CacheController {
|
||||
val currentTime = System.currentTimeMillis() / 1000
|
||||
|
||||
val timetableParser = TimetableParser(timetableLink)
|
||||
val calendarWeek = timetableParser.parseCalendarWeek()
|
||||
val weekNumberYear = timetableParser.parseWeekNumberYear()
|
||||
val timetable = timetableParser.parseTimeTable()
|
||||
|
||||
TimetableCourseWeek(
|
||||
@ -105,11 +103,10 @@ class CacheController {
|
||||
currentTime,
|
||||
courseName,
|
||||
weekIndex,
|
||||
calendarWeek?.week ?: 0,
|
||||
calendarWeek?.year ?: 0,
|
||||
weekNumberYear ?: 0,
|
||||
timetableLink
|
||||
), timetable ?: TimetableWeek()
|
||||
).also { if (timetable != null) timetableList[key] = it }
|
||||
).also { timetableList[key] = it }
|
||||
}
|
||||
}
|
||||
|
||||
@ -201,7 +198,7 @@ class CacheController {
|
||||
val timetableParser = TimetableParser(timetableCourse.value.meta.link)
|
||||
timetableCourse.value.timetable = timetableParser.parseTimeTable() ?: return@execute
|
||||
timetableCourse.value.meta.weekNumberYear =
|
||||
timetableParser.parseCalendarWeek()?.week ?: return@execute
|
||||
timetableParser.parseWeekNumberYear() ?: return@execute
|
||||
timetableCourse.value.meta.updateTime = System.currentTimeMillis() / 1000
|
||||
|
||||
saveTimetableToCache(timetableCourse.value) // save the updated timetable to the cache directory
|
||||
|
@ -44,7 +44,7 @@ class StartupController {
|
||||
var cachetAPIKey = "0"
|
||||
var cachetBaseURL = "https://status.mosad.xyz"
|
||||
var courseListURL = "https://www.hs-offenburg.de/studium/vorlesungsplaene/"
|
||||
var mensaMenuURL = "https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/"
|
||||
var mensaMenuURL = "https://www.swfr.de/de/essen-trinken/speiseplaene/mensa-offenburg/"
|
||||
var mensaName = "Offenburg"
|
||||
}
|
||||
|
||||
@ -92,7 +92,7 @@ class StartupController {
|
||||
mensaMenuURL = try {
|
||||
properties.getProperty("mensaMenuURL")
|
||||
} catch (ex: Exception) {
|
||||
"https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/"
|
||||
"https://www.swfr.de/de/essen-trinken/speiseplaene/mensa-offenburg/"
|
||||
}
|
||||
|
||||
mensaName = try {
|
||||
@ -113,7 +113,7 @@ class StartupController {
|
||||
|
||||
properties.setProperty("cachetAPIKey", "0")
|
||||
properties.setProperty("cachetBaseURL", "https://status.mosad.xyz")
|
||||
properties.setProperty("mensaMenuURL", "https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/")
|
||||
properties.setProperty("mensaMenuURL", "https://www.swfr.de/de/essen-trinken/speiseplaene/mensa-offenburg/")
|
||||
properties.setProperty("mensaName", "Offenburg")
|
||||
|
||||
val outputStream = FileOutputStream(fileConfig)
|
||||
|
@ -22,11 +22,8 @@
|
||||
|
||||
package org.mosad.thecitadelofricks.hsoparser
|
||||
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import kotlinx.coroutines.sync.Semaphore
|
||||
import org.jsoup.Jsoup
|
||||
import org.jsoup.nodes.Document
|
||||
import org.mosad.thecitadelofricks.CalendarWeek
|
||||
import org.mosad.thecitadelofricks.Lesson
|
||||
import org.mosad.thecitadelofricks.TimetableWeek
|
||||
import org.slf4j.LoggerFactory
|
||||
@ -39,22 +36,16 @@ class TimetableParser(timetableURL: String? = null, htmlDoc: Document? = null) {
|
||||
private var logger: org.slf4j.Logger = LoggerFactory.getLogger(TimetableParser::class.java)
|
||||
private val days = arrayOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
|
||||
|
||||
companion object {
|
||||
val semaphore = Semaphore(3, 0)
|
||||
}
|
||||
|
||||
private val htmlDoc: Document? = htmlDoc ?: timetableURL?.let {
|
||||
runBlocking {
|
||||
private val htmlDoc: Document? =
|
||||
htmlDoc
|
||||
?: if (timetableURL == null) {
|
||||
null
|
||||
} else {
|
||||
try {
|
||||
// Only allow sending a limited amount of requests at the same time
|
||||
semaphore.acquire()
|
||||
Jsoup.connect(timetableURL).get()
|
||||
} catch (gex: Exception) {
|
||||
logger.error("general TimetableParser error", gex)
|
||||
null
|
||||
} finally {
|
||||
semaphore.release()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,9 +54,13 @@ class TimetableParser(timetableURL: String? = null, htmlDoc: Document? = null) {
|
||||
* the timetable is organised per row not per column;
|
||||
* Mon 1, Tue 1, Wed 1, Thur 1, Fri 1, Sat 1, Mon 2 and so on
|
||||
*/
|
||||
fun parseTimeTable(): TimetableWeek? = htmlDoc?.let {
|
||||
fun parseTimeTable(): TimetableWeek? {
|
||||
if (htmlDoc == null) {
|
||||
return null
|
||||
}
|
||||
|
||||
val timetableWeek = TimetableWeek()
|
||||
val rows = it.select("table.timetable").select("tr[scope=\"row\"]")
|
||||
val rows = htmlDoc.select("table.timetable").select("tr[scope=\"row\"]")
|
||||
|
||||
var sDay = -1
|
||||
var sRow = -1
|
||||
@ -132,13 +127,15 @@ class TimetableParser(timetableURL: String? = null, htmlDoc: Document? = null) {
|
||||
}
|
||||
|
||||
/**
|
||||
* parse the calendar week and the associated year for the timetable
|
||||
* parse the week number of the year for the timetable
|
||||
*/
|
||||
fun parseCalendarWeek(): CalendarWeek? = htmlDoc?.let {
|
||||
val dateStr = it.select("h1.timetable-caption").text().substringAfter("- ")
|
||||
val week = dateStr.substringBefore(".").replace(" ", "").toInt()
|
||||
val year = dateStr.substringAfter("Woche ").replace(" ", "").toInt()
|
||||
CalendarWeek(week, year)
|
||||
fun parseWeekNumberYear(): Int? {
|
||||
if (htmlDoc == null) {
|
||||
return null
|
||||
}
|
||||
|
||||
return htmlDoc.select("h1.timetable-caption").text().substringAfter("- ")
|
||||
.substringBefore(".").replace(" ", "").toInt()
|
||||
}
|
||||
|
||||
@Suppress("unused")
|
||||
|
@ -28,7 +28,7 @@ import org.junit.jupiter.api.Test
|
||||
import java.io.File
|
||||
|
||||
internal class MensaParserTest {
|
||||
private val mensaMenuURL = "https://www.swfr.de/essen-trinken/speiseplaene/mensa-offenburg/"
|
||||
private val mensaMenuURL = "https://www.swfr.de/de/essen-trinken/speiseplaene/mensa-offenburg/"
|
||||
|
||||
@Test
|
||||
fun parseMensaMenuNormalWeek() {
|
||||
|
@ -25,7 +25,6 @@ package org.mosad.thecitadelofricks.hsoparser
|
||||
import org.jsoup.Jsoup
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mosad.thecitadelofricks.CalendarWeek
|
||||
import java.io.File
|
||||
|
||||
class TimetableParserTest {
|
||||
@ -51,11 +50,11 @@ class TimetableParserTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun parseCalendarWeek() {
|
||||
fun parseWeekNumberYear() {
|
||||
val htmlFile = File(TimetableParserTest::class.java.getResource("/html/Timetable_normal-week.html").path)
|
||||
val htmlDoc = Jsoup.parse(htmlFile, "UTF-8", "https://www.hs-offenburg.de/")
|
||||
val actualCalendarWeek = TimetableParser(htmlDoc = htmlDoc).parseCalendarWeek()
|
||||
val actualWeekNumberYear = TimetableParser(htmlDoc = htmlDoc).parseWeekNumberYear()
|
||||
|
||||
Assertions.assertEquals(CalendarWeek(42, 2019), actualCalendarWeek)
|
||||
Assertions.assertEquals(42, actualWeekNumberYear)
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
<div id="speiseplan-tabs">
|
||||
<div id="tab-menu-container" class="row">
|
||||
<div class="col-md-1 col-xs-6">
|
||||
<a class="prev-week" title="eine Woche zurück" href="/essen-trinken/speiseplaene/mensa-offenburg/?tx_swfrspeiseplan_pi1%5BweekToShow%5D=0&tx_swfrspeiseplan_pi1%5Baction%5D=show&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=ad074b11cc01a680e4c0d0675dd1f91c"><img src="/fileadmin/templates/images/keil-grau-links.png" width="16" height="16" alt="" /><span class="d-inline d-sm-none">vorherige Woche</span></a>
|
||||
<a class="prev-week" title="eine Woche zurück" href="/de/essen-trinken/speiseplaene/mensa-offenburg/?tx_swfrspeiseplan_pi1%5BweekToShow%5D=0&tx_swfrspeiseplan_pi1%5Baction%5D=show&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=ad074b11cc01a680e4c0d0675dd1f91c"><img src="/fileadmin/templates/images/keil-grau-links.png" width="16" height="16" alt="" /><span class="d-inline d-sm-none">vorherige Woche</span></a>
|
||||
</div>
|
||||
<div class="col-md-10">
|
||||
<ul class="nav classic-tabs tabs-primary" role="tablist">
|
||||
@ -13,7 +13,7 @@
|
||||
<li class="col-md-2"><a href="#tab-sat" class="nav-link" data-toggle="tab" role="tab">Sa 14.03.</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-1 col-xs-6 pull-right"><a class="next-week text-right" title="eine Woche weiter" href="/essen-trinken/speiseplaene/mensa-offenburg/?tx_swfrspeiseplan_pi1%5BweekToShow%5D=2&tx_swfrspeiseplan_pi1%5Baction%5D=show&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=3c3048ebdd7f42a104bd780a0a6a0fd1"><span class="d-inline d-sm-none">nächste Woche</span><img src="/fileadmin/templates/images/keil-grau-rechts.png" width="16" height="16" alt="" /></a></div>
|
||||
<div class="col-md-1 col-xs-6 pull-right"><a class="next-week text-right" title="eine Woche weiter" href="/de/essen-trinken/speiseplaene/mensa-offenburg/?tx_swfrspeiseplan_pi1%5BweekToShow%5D=2&tx_swfrspeiseplan_pi1%5Baction%5D=show&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=3c3048ebdd7f42a104bd780a0a6a0fd1"><span class="d-inline d-sm-none">nächste Woche</span><img src="/fileadmin/templates/images/keil-grau-rechts.png" width="16" height="16" alt="" /></a></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-4">
|
||||
@ -34,12 +34,12 @@
|
||||
</div>
|
||||
<div class="col-sm-4 pt-3">
|
||||
<div class="hide-with-allergenes">
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in Farbe herunterladen" target="_blank" href="/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=1&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdf&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=4de091579c564e42f79473da2701f179"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan farbig</a></p>
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in schwarz-weiß herunterladen" target="_blank" href="/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=0&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdf&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=84edf4562bdc95f103b70ef99e4d7af6"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan s/w</a></p>
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in Farbe herunterladen" target="_blank" href="/de/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=1&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdf&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=4de091579c564e42f79473da2701f179"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan farbig</a></p>
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in schwarz-weiß herunterladen" target="_blank" href="/de/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=0&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdf&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=84edf4562bdc95f103b70ef99e4d7af6"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan s/w</a></p>
|
||||
</div>
|
||||
<div class="show-with-allergenes">
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in Farbe herunterladen" target="_blank" href="/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=1&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdfAllergenes&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=51f0f1e0083f9ef48038920dfb676eb6"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan farbig</a></p>
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in schwarz-weiß herunterladen" target="_blank" href="/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=0&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdfAllergenes&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=c3a9d1eafce78d8f8d281c6060be989c"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan s/w</a></p>
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in Farbe herunterladen" target="_blank" href="/de/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=1&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdfAllergenes&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=51f0f1e0083f9ef48038920dfb676eb6"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan farbig</a></p>
|
||||
<p><a download="Mensa_Offenburg_KW_11-2020.pdf" title="Wochenplan in schwarz-weiß herunterladen" target="_blank" href="/de/essen-trinken/speiseplaene/mensa-offenburg/?type=99&tx_swfrspeiseplan_pi1%5BweekToShow%5D=1&tx_swfrspeiseplan_pi1%5Bcolored%5D=0&tx_swfrspeiseplan_pi1%5Bort%5D=651&tx_swfrspeiseplan_pi1%5Baction%5D=buildPdfAllergenes&tx_swfrspeiseplan_pi1%5Bcontroller%5D=Speiseplan&cHash=c3a9d1eafce78d8f8d281c6060be989c"><i class="fas fa-file-download" aria-hidden="true"></i> Wochenplan s/w</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-4 pt-3">
|
||||
|
Reference in New Issue
Block a user