[API/Mobidziennik] Implement getting full event description.

This commit is contained in:
Kuba Szczodrzyński 2021-10-01 21:06:48 +02:00
parent 325efd8b14
commit 0b4421c7a7
No known key found for this signature in database
GPG Key ID: 70CB8A85BA1633CB
10 changed files with 118 additions and 7 deletions

View File

@ -16,6 +16,10 @@ object Regexes {
"""[^0-9]""".toRegex()
}
val HTML_BR by lazy {
"""<br\s?/?>""".toRegex()
}
val MOBIDZIENNIK_GRADES_SUBJECT_NAME by lazy {
@ -128,6 +132,11 @@ object Regexes {
}
val MOBIDZIENNIK_EVENT_CONTENT by lazy {
"""<h1>(.+?) <small>\(wpisał\(a\) (.+?) w dniu ([0-9-]{10})\).+?<strong>(.+?)</strong><br""".toRegex(DOT_MATCHES_ALL)
}
val IDZIENNIK_LOGIN_HIDDEN_FIELDS by lazy {
"""<input type="hidden".+?name="([A-z0-9_]+)?".+?value="([A-z0-9_+-/=]+)?".+?>""".toRegex(DOT_MATCHES_ALL)

View File

@ -120,10 +120,17 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
override fun getEvent(eventFull: EventFull) {
login(LOGIN_METHOD_MOBIDZIENNIK_WEB) {
if (eventFull.isHomework) {
MobidziennikWebGetHomework(data, eventFull) {
completed()
}
}
else {
MobidziennikWebGetEvent(data, eventFull) {
completed()
}
}
}
}
override fun firstLogin() { MobidziennikFirstLogin(data) { completed() } }

View File

@ -81,6 +81,7 @@ class MobidziennikWebCalendar(override val data: DataMobidziennik,
subjectId = -1,
teamId = data.teamClass?.id ?: -1
)
eventObject.isDownloaded = false
data.eventList.add(eventObject)
data.metadataList.add(

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) Kuba Szczodrzyński 2021-10-1.
*/
package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web
import org.greenrobot.eventbus.EventBus
import pl.szczodrzynski.edziennik.data.api.POST
import pl.szczodrzynski.edziennik.data.api.Regexes
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.get
import pl.szczodrzynski.edziennik.utils.models.Date
class MobidziennikWebGetEvent(
override val data: DataMobidziennik,
val event: EventFull,
val onSuccess: () -> Unit
) : MobidziennikWeb(data, null) {
companion object {
private const val TAG = "MobidziennikWebGetEvent"
}
init {
val params = listOf(
"typ" to "kalendarz",
"uczen" to data.studentId,
"id" to event.id,
)
webGet(TAG, "/dziennik/ajaxkalendarzklasowy", method = POST, parameters = params) { text ->
Regexes.MOBIDZIENNIK_EVENT_CONTENT.find(text)?.let {
val topic = it[1]
val teacherName = it[2]
val teacher = data.getTeacherByLastFirst(teacherName)
val addedDate = Date.fromY_m_d(it[3])
val body = it[4]
.replace("\n", "")
.replace(Regexes.HTML_BR, "\n")
event.topic = topic
event.homeworkBody = body
event.teacherId = teacher.id
event.addedDate = addedDate.inMillis
event.isDownloaded = true
}
data.eventList.add(event)
data.eventListReplace = true
EventBus.getDefault().postSticky(EventGetEvent(event))
onSuccess()
}
}
}

View File

@ -437,11 +437,13 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
}
fun getTeacherByLastFirst(nameLastFirst: String, loginId: String? = null): Teacher {
// comparing full name is safer than splitting and swapping
val teacher = teacherList.singleOrNull { it.fullNameLastFirst == nameLastFirst }
val nameParts = nameLastFirst.split(" ")
return if (nameParts.size == 1)
getTeacher(nameParts[0], "", loginId)
validateTeacher(teacher, nameParts[0], "", loginId)
else
getTeacher(nameParts[1], nameParts[0], loginId)
validateTeacher(teacher, nameParts[1], nameParts[0], loginId)
}
fun getTeacherByFirstLast(nameFirstLast: String, loginId: String? = null): Teacher {

View File

@ -43,7 +43,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
LibrusLesson::class,
TimetableManual::class,
Metadata::class
], version = 93)
], version = 94)
@TypeConverters(
ConverterTime::class,
ConverterDate::class,
@ -178,7 +178,8 @@ abstract class AppDb : RoomDatabase() {
Migration90(),
Migration91(),
Migration92(),
Migration93()
Migration93(),
Migration94()
).allowMainThreadQueries().build()
}
}

View File

@ -83,6 +83,13 @@ open class Event(
@ColumnInfo(name = "eventIsDone")
var isDone: Boolean = false
/**
* Whether the full contents of the event are already stored locally.
* There may be a need to download the full topic or body.
*/
@ColumnInfo(name = "eventIsDownloaded")
var isDownloaded: Boolean = true
/**
* Body/text of the event, if this is a [TYPE_HOMEWORK].
* May be null if the body is not downloaded yet, or the type is not [TYPE_HOMEWORK].

View File

@ -26,6 +26,7 @@ class EventFull(
sharedBy = it.sharedBy
sharedByName = it.sharedByName
blacklisted = it.blacklisted
isDownloaded = it.isDownloaded
homeworkBody = it.homeworkBody
attachmentIds = it.attachmentIds
attachmentNames = it.attachmentNames

View File

@ -0,0 +1,26 @@
/*
* Copyright (c) Kuba Szczodrzyński 2021-10-1.
*/
package pl.szczodrzynski.edziennik.data.db.migration
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import pl.szczodrzynski.edziennik.data.db.entity.Event
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
class Migration94 : Migration(93, 94) {
override fun migrate(database: SupportSQLiteDatabase) {
// events - is downloaded flag
// get all profiles using Mobidziennik
database.execSQL("CREATE TABLE _94_ids (id INTEGER NOT NULL);")
database.execSQL("INSERT INTO _94_ids SELECT profileId FROM profiles JOIN loginStores USING(loginStoreId) WHERE loginStores.loginStoreType = ${LoginStore.LOGIN_TYPE_MOBIDZIENNIK};")
database.execSQL("ALTER TABLE events ADD COLUMN eventIsDownloaded INT NOT NULL DEFAULT 1;")
// set isDownloaded = 0 for information events in Mobidziennik
database.execSQL("UPDATE events SET eventIsDownloaded = 0 WHERE profileId IN (SELECT id FROM _94_ids) AND eventType = ${Event.TYPE_INFORMATION};")
database.execSQL("DROP TABLE _94_ids;")
}
}

View File

@ -226,7 +226,7 @@ class EventDetailsDialog(
)
}
if (!event.addedManually && event.isHomework && event.homeworkBody == null) {
if (!event.addedManually && (!event.isDownloaded || event.isHomework && event.homeworkBody == null)) {
b.bodyTitle.isVisible = true
b.bodyProgressBar.isVisible = true
b.body.isVisible = false