|
|
|
|
@ -182,7 +182,10 @@ class AvatarRepository(context: Context) {
|
|
|
|
|
} |
|
|
|
|
private fun requestMembers(group: String) { |
|
|
|
|
if (account == 0L) start() |
|
|
|
|
if (account == 0L || AvatarProtocol.node(group) == 0L) return |
|
|
|
|
if (account == 0L) return |
|
|
|
|
if (AvatarProtocol.groupId(group) == 0L) { |
|
|
|
|
log("WARN", "Member snapshot: invalid decimal channel_id=$group"); return |
|
|
|
|
} |
|
|
|
|
val now = android.os.SystemClock.elapsedRealtime() |
|
|
|
|
if (now - (memberRequests[group] ?: -5000) < 5000) return |
|
|
|
|
memberRequests[group] = now |
|
|
|
|
@ -191,12 +194,14 @@ class AvatarRepository(context: Context) {
|
|
|
|
|
|
|
|
|
|
private suspend fun request(type: Int, group: String, server: Long = 0, owner: Long = 0, command: Int = 0, |
|
|
|
|
enqueue: (Long, Long) -> Boolean): ByteArray { |
|
|
|
|
val id = ids.incrementAndGet(); val gid = AvatarProtocol.node(group) |
|
|
|
|
val id = ids.incrementAndGet(); val gid = AvatarProtocol.groupId(group) |
|
|
|
|
require(gid != 0L) { "invalid decimal channel_id=$group" } |
|
|
|
|
val result = CompletableDeferred<ByteArray>() |
|
|
|
|
val operation = Pending(type, gid, server, owner, command, result) |
|
|
|
|
pending[id] = operation |
|
|
|
|
var complete = false |
|
|
|
|
try { |
|
|
|
|
log("DEBUG", "Request id=$id type=$type group=$group parsedGroup=${gid.toULong()} server=${AvatarProtocol.hex(server)}") |
|
|
|
|
if (!enqueue(id, gid)) throw IOException("native enqueue failed id=$id type=$type group=$group") |
|
|
|
|
val data = withTimeout(60_000) { result.await() } |
|
|
|
|
complete = true |
|
|
|
|
@ -209,7 +214,10 @@ class AvatarRepository(context: Context) {
|
|
|
|
|
|
|
|
|
|
fun ensureGroup(group: String, force: Boolean = false) { |
|
|
|
|
if (account == 0L) start() |
|
|
|
|
if (account == 0L || AvatarProtocol.node(group) == 0L) return |
|
|
|
|
if (account == 0L) return |
|
|
|
|
if (AvatarProtocol.groupId(group) == 0L) { |
|
|
|
|
log("WARN", "Group snapshot: invalid decimal channel_id=$group"); return |
|
|
|
|
} |
|
|
|
|
if ("group:$group" in loads) { if (force) dirtyGroups.add(group); return } |
|
|
|
|
val current = _groups.value[group] |
|
|
|
|
if (!force && current != null && !current.error && |
|
|
|
|
|