ref: async and thread stuff
This commit is contained in:
@@ -9,6 +9,8 @@ import io.ktor.client.request.bearerAuth
|
||||
import io.ktor.client.request.get
|
||||
import io.ktor.client.statement.bodyAsText
|
||||
import io.ktor.http.HttpStatusCode
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import org.json.JSONObject
|
||||
import ru.risdeveau.pixeldragon.baseUrl
|
||||
import ru.risdeveau.pixeldragon.client
|
||||
@@ -58,21 +60,26 @@ suspend fun getRoom(rid: String, joined: Boolean? = null): Room {
|
||||
}
|
||||
}
|
||||
|
||||
val name = getState(rid, "m.room.name", "name")
|
||||
val type = getState(rid, "m.room.create", "type") ?: "m.room"
|
||||
val creator = getState(rid, "m.room.create", "creator")
|
||||
val avatar = getState(rid, "m.room.avatar", "url")
|
||||
return Room(
|
||||
return coroutineScope {
|
||||
val name = async { getState(rid, "m.room.name", "name") }
|
||||
val type = async { getState(rid, "m.room.create", "type") ?: "m.room" }
|
||||
val creator = async { getState(rid, "m.room.create", "creator") }
|
||||
val avatar = async { getState(rid, "m.room.avatar", "url") }
|
||||
val joined = async { joined ?: isJoined(rid) }
|
||||
val direct = async { if (directWith.isNotEmpty()) User.getById(directWith) else null }
|
||||
|
||||
Room(
|
||||
rid,
|
||||
name,
|
||||
type,
|
||||
creator,
|
||||
name.await(),
|
||||
type.await(),
|
||||
creator.await(),
|
||||
null,
|
||||
avatar,
|
||||
avatar.await(),
|
||||
null,
|
||||
joined ?: isJoined(rid),
|
||||
if (directWith.isNotEmpty()) User.getById(directWith) else null
|
||||
joined.await(),
|
||||
direct.await()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getState(rid: String, state: String, key: String): String? {
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
|
||||
package ru.risdeveau.pixeldragon.repo
|
||||
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import ru.risdeveau.pixeldragon.api.getJoinedRooms
|
||||
import ru.risdeveau.pixeldragon.api.getRoom
|
||||
import ru.risdeveau.pixeldragon.db.cacheDb
|
||||
@@ -32,8 +35,10 @@ class Room (
|
||||
(!cached or (cachedRoom == null) or (cachedRoom?.isExpired() == true))
|
||||
) {
|
||||
val room = getRoom(id)
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val cacheRoom = room.toEntity()
|
||||
cacheDb.roomDoa().insert(cacheRoom)
|
||||
}
|
||||
return room
|
||||
}
|
||||
return cachedRoom!!.toDomain()
|
||||
@@ -41,8 +46,15 @@ class Room (
|
||||
|
||||
suspend fun getJoined(cached: Boolean = true): List<Room> {
|
||||
val cacheJoined = cacheDb.roomDoa().getAllJoined()
|
||||
if (!isConnected() and cacheJoined.isEmpty()) {
|
||||
return getJoinedRooms()
|
||||
if (isConnected() and
|
||||
(!cached or cacheJoined.isEmpty() or (cacheJoined.any { it.isExpired() }))
|
||||
) {
|
||||
val rooms = getJoinedRooms()
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val roomsDb = List(rooms.size) { i -> rooms[i].toEntity() }
|
||||
cacheDb.roomDoa().insert(*roomsDb.toTypedArray())
|
||||
}
|
||||
return rooms
|
||||
}
|
||||
return List(cacheJoined.size) { i -> cacheJoined[i].toDomain() }
|
||||
}
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
package ru.risdeveau.pixeldragon.repo
|
||||
|
||||
import android.util.Log
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import org.json.JSONObject
|
||||
import ru.risdeveau.pixeldragon.api.getUserProfile
|
||||
import ru.risdeveau.pixeldragon.db.cacheDb
|
||||
@@ -23,7 +26,7 @@ class User (
|
||||
companion object {
|
||||
suspend fun getById(id: String, cached: Boolean = true): User? {
|
||||
val cachedUser = cacheDb.userDoa().getById(id)
|
||||
if (!isConnected() and
|
||||
if (isConnected() and
|
||||
(!cached or (cachedUser == null) or (cachedUser?.isExpired() == true))
|
||||
) {
|
||||
val userProfile = getUserProfile(id)
|
||||
@@ -37,7 +40,9 @@ class User (
|
||||
userProfile.avatarUrl,
|
||||
userProfile.other
|
||||
)
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
cacheDb.userDoa().insert(user.toEntity())
|
||||
}
|
||||
return user
|
||||
}
|
||||
return cachedUser!!.toDomain()
|
||||
|
||||
Reference in New Issue
Block a user