[API/Mobidziennik] Add sent messages endpoint.

This commit is contained in:
Kuba Szczodrzyński 2020-02-18 20:10:05 +01:00
parent 169a900f01
commit 626bbfa7a4
4 changed files with 114 additions and 2 deletions

View File

@ -54,6 +54,9 @@ object Regexes {
val MOBIDZIENNIK_MESSAGE_ATTACHMENT by lazy { val MOBIDZIENNIK_MESSAGE_ATTACHMENT by lazy {
"""href="https://.+?\.mobidziennik.pl/.+?&(?:amp;)?zalacznik=([0-9]+)"(?:.+?<small.+?\(([0-9.]+)\s(M|K|G|)B\))*""".toRegex(DOT_MATCHES_ALL) """href="https://.+?\.mobidziennik.pl/.+?&(?:amp;)?zalacznik=([0-9]+)"(?:.+?<small.+?\(([0-9.]+)\s(M|K|G|)B\))*""".toRegex(DOT_MATCHES_ALL)
} }
val MOBIDZIENNIK_MESSAGE_SENT_READ_BY by lazy {
"""([0-9]+)/([0-9]+)""".toRegex()
}
val MOBIDZIENNIK_MESSAGE_RECIPIENTS_JSON by lazy { val MOBIDZIENNIK_MESSAGE_RECIPIENTS_JSON by lazy {
"""odbiorcy: (\[.+?]),${'$'}""".toRegex(RegexOption.MULTILINE) """odbiorcy: (\[.+?]),${'$'}""".toRegex(RegexOption.MULTILINE)

View File

@ -52,6 +52,10 @@ class MobidziennikData(val data: DataMobidziennik, val onSuccess: () -> Unit) {
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox) data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
MobidziennikWebMessagesInbox(data, lastSync, onSuccess) MobidziennikWebMessagesInbox(data, lastSync, onSuccess)
} }
ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_SENT -> {
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
MobidziennikWebMessagesSent(data, lastSync, onSuccess)
}
ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_ALL -> { ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_ALL -> {
data.startProgress(R.string.edziennik_progress_endpoint_messages) data.startProgress(R.string.edziennik_progress_endpoint_messages)
MobidziennikWebMessagesAll(data, lastSync, onSuccess) MobidziennikWebMessagesAll(data, lastSync, onSuccess)

View File

@ -0,0 +1,104 @@
/*
* Copyright (c) Kuba Szczodrzyński 2020-2-18.
*/
package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web
import org.jsoup.Jsoup
import pl.szczodrzynski.edziennik.DAY
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_MESSAGES
import pl.szczodrzynski.edziennik.data.api.Regexes
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_SENT
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.entity.MessageRecipient
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.fixName
import pl.szczodrzynski.edziennik.get
import pl.szczodrzynski.edziennik.singleOrNull
import pl.szczodrzynski.edziennik.utils.models.Date
class MobidziennikWebMessagesSent(override val data: DataMobidziennik,
override val lastSync: Long?,
val onSuccess: (endpointId: Int) -> Unit
) : MobidziennikWeb(data, lastSync) {
companion object {
private const val TAG = "MobidziennikWebMessagesSent"
}
init {
webGet(TAG, "/dziennik/wiadomosciwyslane") { text ->
MobidziennikLuckyNumberExtractor(data, text)
if (text.contains("Brak wiadomości wysłanych.")) {
data.setSyncNext(ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_SENT, SYNC_ALWAYS)
onSuccess(ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_SENT)
return@webGet
}
val doc = Jsoup.parse(text)
val list = doc.getElementsByClass("spis").first().getElementsByClass("podswietl")
for (item in list) {
val id = item.attr("rel").toLongOrNull() ?: continue
val subjectEl = item.select("td:eq(0)").first()
var hasAttachments = false
if (subjectEl.getElementsByTag("a").size != 0) {
hasAttachments = true
}
val subject = subjectEl.ownText()
val readByString = item.select("td:eq(2)").first().text()
val (readBy, sentTo) = Regexes.MOBIDZIENNIK_MESSAGE_SENT_READ_BY.find(readByString).let {
(it?.get(1)?.toIntOrNull() ?: 0) to (it?.get(2)?.toIntOrNull() ?: 0)
}
val recipientEl = item.select("td:eq(1) a span").first()
val recipientNames = recipientEl.ownText().split(", ")
val readState = when (readBy) {
0 -> 0
sentTo -> 1
else -> -1
}.toLong()
for (recipientName in recipientNames) {
val name = recipientName.fixName()
val recipientId = data.teacherList.singleOrNull { it.fullNameLastFirst == name }?.id ?: -1
data.messageRecipientIgnoreList.add(MessageRecipient(profileId, recipientId, -1, readState, id))
}
val addedDateEl = item.select("td:eq(3) small").first()
val addedDate = Date.fromIsoHm(addedDateEl.text())
val message = Message(
profileId,
id,
subject,
null,
Message.TYPE_SENT,
-1,
-1
)
if (hasAttachments)
message.setHasAttachments()
data.messageIgnoreList.add(message)
data.setSeenMetadataList.add(
Metadata(
profileId,
Metadata.TYPE_MESSAGE,
message.id,
true,
true,
addedDate
))
}
data.setSyncNext(ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_SENT, 1*DAY, DRAWER_ITEM_MESSAGES)
onSuccess(ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_SENT)
}
}
}

View File

@ -18,8 +18,9 @@ public class MessageRecipient {
@ColumnInfo(name = "messageRecipientReplyId") @ColumnInfo(name = "messageRecipientReplyId")
public long replyId = -1; public long replyId = -1;
/** /**
* -1 for not read * -1 for unknown
* 0 for read, date unknown * 0 for not read
* 1 for read, date unknown
* time in millis for read, date known * time in millis for read, date known
*/ */
@ColumnInfo(name = "messageRecipientReadDate") @ColumnInfo(name = "messageRecipientReadDate")