Request Android member snapshots on the core thread

This commit is contained in:
evgeny committed 2026-10-04 16:00:41 +02:00
1 parent 6c5c1ef0a0
commit 658c248867
3 files changed
+34 -3

No files matched your search

@@ -72,6 +72,7 @@ data class Message(val id: Long, val author: String, val text: String, val ts: L
data class ChatMember(val nodeId: Long, val name: String, val online: Boolean = false,
val isAdmin: Boolean = false, val isSuper: Boolean = false,
val isModer: Boolean = false, val isStorage: Boolean = false,
val radioActive: Boolean = false,
val isVerified: Boolean = false, val isDeleted: Boolean = false,
val nodeType: Int = 0,
val rtt: Int = 0, val isSelf: Boolean = false,
@@ -167,7 +168,7 @@ data class MemberWire(
)
fun parseMemberWire(data: ByteArray, offset: Int = 0): MemberWire? {
if (offset + 79 > data.size) return null
if (offset < 0 || offset > data.size - 79) return null
val buf = ByteBuffer.wrap(data, offset, 79).order(ByteOrder.LITTLE_ENDIAN)
val nodeId = buf.getLong()
val online = buf.get().toInt() and 0xFF
@@ -181,10 +182,12 @@ fun parseMemberWire(data: ByteArray, offset: Int = 0): MemberWire? {
return MemberWire(nodeId, online, isSelf, flags, rtt, natType, storage, name)
}
fun MemberWire.toChatMember(): ChatMember = ChatMember(
nodeId = nodeId, name = name, online = online != 0,
/* Wire не содержит verified/nodeType и состояния транспортов: сохраняем их из текущей строки. */
fun MemberWire.toChatMember(previous: ChatMember = ChatMember(nodeId, name)): ChatMember = previous.copy(
name = name, online = online != 0,
isAdmin = (flags and 2) != 0, isSuper = (flags and 1) != 0,
isModer = (flags and 4) != 0, isStorage = storage,
isDeleted = (flags and 8) != 0, radioActive = (flags and 0x10) != 0,
rtt = if (rtt == 0xFFFF) 0 else rtt, isSelf = isSelf
)
@@ -115,6 +115,8 @@ object NativeLib {
/* ── Channel members ── */
fun getChannelMembers(channelId: String): String = nativeGetChannelMembers(channelId) ?: "[]"
/** Асинхронный live-снимок; ответ — событие MEMBER_LIST. */
fun requestMemberList(channelId: String): Boolean = nativeRequestMemberList(channelId)
fun getMemberDetail(channelId: String, nodeId: Long): String = nativeGetMemberDetail(channelId, nodeId) ?: "{}"
fun setMemberNick(channelId: String, nodeId: Long, nick: String) { nativeSetMemberNick(channelId, nodeId, nick) }
fun isChannelOwner(channelId: String): Boolean = nativeIsChannelOwner(channelId)
@@ -240,6 +242,7 @@ object NativeLib {
/* ── Channel members JNI ── */
private external fun nativeGetChannelMembers(channelId: String): String?
private external fun nativeRequestMemberList(channelId: String): Boolean
private external fun nativeGetMemberDetail(channelId: String, nodeId: Long): String?
private external fun nativeSetMemberNick(channelId: String, nodeId: Long, nick: String)
private external fun nativeIsChannelOwner(channelId: String): Boolean