feat: support inline server identity
also fixes the ServerMemberUpdate frame Signed-off-by: Infi <wingit@geist.ga>
This commit is contained in:
parent
a45b07f9de
commit
6232b435e5
|
|
@ -19,7 +19,7 @@ class Members {
|
|||
memberCache[serverId] = mutableMapOf()
|
||||
}
|
||||
|
||||
memberCache[serverId]?.set(member.id.user, member)
|
||||
memberCache[serverId]?.set(member.id!!.user, member)
|
||||
}
|
||||
|
||||
fun removeMember(serverId: String, userId: String) {
|
||||
|
|
|
|||
|
|
@ -360,6 +360,7 @@ object RealtimeSocket {
|
|||
}
|
||||
|
||||
"ServerMemberUpdate" -> {
|
||||
Log.d("RealtimeSocket", "Received server member update frame. Raw: $rawFrame")
|
||||
val serverMemberUpdateFrame =
|
||||
RevoltJson.decodeFromString(ServerMemberUpdateFrame.serializer(), rawFrame)
|
||||
Log.d(
|
||||
|
|
@ -383,6 +384,8 @@ object RealtimeSocket {
|
|||
}
|
||||
}
|
||||
|
||||
Log.d("RealtimeSocket", "Updated member: $updated")
|
||||
|
||||
RevoltAPI.members.setMember(serverMemberUpdateFrame.id.server, updated)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ suspend fun fetchMembers(
|
|||
}
|
||||
|
||||
membersResponse.members.forEach { member ->
|
||||
if (!RevoltAPI.members.hasMember(serverId, member.id.user)) {
|
||||
if (!RevoltAPI.members.hasMember(serverId, member.id!!.user)) {
|
||||
RevoltAPI.members.setMember(serverId, member)
|
||||
}
|
||||
}
|
||||
|
|
@ -81,7 +81,7 @@ suspend fun fetchMember(serverId: String, userId: String, pure: Boolean = false)
|
|||
val member = RevoltJson.decodeFromString(Member.serializer(), response.bodyAsText())
|
||||
|
||||
if (!pure) {
|
||||
if (!RevoltAPI.members.hasMember(serverId, member.id.user)) {
|
||||
if (!RevoltAPI.members.hasMember(serverId, member.id!!.user)) {
|
||||
RevoltAPI.members.setMember(serverId, member)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ data class ServerUserChoice(
|
|||
@Serializable
|
||||
data class Member(
|
||||
@SerialName("_id")
|
||||
val id: ServerUserChoice,
|
||||
val id: ServerUserChoice? = null,
|
||||
|
||||
@SerialName("joined_at")
|
||||
val joinedAt: String? = null,
|
||||
|
|
@ -36,7 +36,7 @@ data class Member(
|
|||
) {
|
||||
fun mergeWithPartial(other: Member): Member {
|
||||
return Member(
|
||||
id = other.id,
|
||||
id = other.id ?: id,
|
||||
joinedAt = other.joinedAt ?: joinedAt,
|
||||
avatar = other.avatar ?: avatar,
|
||||
roles = other.roles ?: roles,
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ import androidx.compose.ui.unit.sp
|
|||
import chat.revolt.R
|
||||
import chat.revolt.api.RevoltAPI
|
||||
import chat.revolt.api.internals.solidColor
|
||||
import chat.revolt.api.routes.microservices.january.asJanuaryProxyUrl
|
||||
import chat.revolt.api.schemas.User
|
||||
import chat.revolt.components.generic.UserAvatar
|
||||
|
||||
|
|
@ -63,7 +62,7 @@ fun InReplyTo(
|
|||
username = username,
|
||||
userId = author?.id ?: "",
|
||||
avatar = author?.avatar,
|
||||
rawUrl = message.masquerade?.avatar?.let { asJanuaryProxyUrl(it) },
|
||||
rawUrl = authorAvatarUrl(message),
|
||||
size = 16.dp
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ fun authorColour(message: MessageSchema): Brush {
|
|||
val highestRole = message.author?.let {
|
||||
Roles.resolveHighestRole(serverId, it, withColour = true)
|
||||
} ?: return defaultColour
|
||||
|
||||
|
||||
highestRole.colour?.let { WebCompat.parseColour(it) }
|
||||
?: defaultColour
|
||||
}
|
||||
|
|
@ -81,11 +81,34 @@ fun authorColour(message: MessageSchema): Brush {
|
|||
|
||||
@Composable
|
||||
fun authorName(message: MessageSchema): String {
|
||||
return message.masquerade?.name
|
||||
if (message.masquerade?.name != null) {
|
||||
return message.masquerade.name
|
||||
}
|
||||
|
||||
val serverId =
|
||||
RevoltAPI.channelCache[message.channel]?.server ?: return stringResource(R.string.unknown)
|
||||
val member = message.author?.let { RevoltAPI.members.getMember(serverId, it) }
|
||||
?: return stringResource(R.string.unknown)
|
||||
|
||||
return member.nickname
|
||||
?: RevoltAPI.userCache[message.author]?.let { User.resolveDefaultName(it) }
|
||||
?: stringResource(R.string.unknown)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun authorAvatarUrl(message: MessageSchema): String? {
|
||||
if (message.masquerade?.avatar != null) {
|
||||
return asJanuaryProxyUrl(message.masquerade.avatar)
|
||||
}
|
||||
|
||||
val serverId =
|
||||
RevoltAPI.channelCache[message.channel]?.server ?: return null
|
||||
val member = message.author?.let { RevoltAPI.members.getMember(serverId, it) }
|
||||
?: return null
|
||||
|
||||
return member.avatar?.let { "$REVOLT_FILES/avatars/${it.id}?max_side=256" }
|
||||
}
|
||||
|
||||
fun viewUrlInBrowser(ctx: android.content.Context, url: String) {
|
||||
val customTab = CustomTabsIntent
|
||||
.Builder()
|
||||
|
|
@ -212,7 +235,7 @@ fun Message(
|
|||
username = User.resolveDefaultName(author),
|
||||
userId = author.id ?: message.id ?: ULID.makeSpecial(0),
|
||||
avatar = author.avatar,
|
||||
rawUrl = message.masquerade?.avatar?.let { asJanuaryProxyUrl(it) },
|
||||
rawUrl = authorAvatarUrl(message),
|
||||
onClick = onAvatarClick,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ class ChannelScreenViewModel : ViewModel() {
|
|||
}
|
||||
|
||||
it.members?.forEach { member ->
|
||||
if (!RevoltAPI.members.hasMember(member.id.server, member.id.user)) {
|
||||
if (!RevoltAPI.members.hasMember(member.id!!.server, member.id.user)) {
|
||||
RevoltAPI.members.setMember(member.id.server, member)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ class MemberListSheetViewModel @Inject constructor(
|
|||
val defaultCategoryName = context.getString(R.string.status_online)
|
||||
|
||||
memberList.forEach { member ->
|
||||
val user = RevoltAPI.userCache[member.id.user] ?: run {
|
||||
val user = RevoltAPI.userCache[member.id!!.user] ?: run {
|
||||
Log.w(
|
||||
"MemberListSheet",
|
||||
"User ${member.id.user} found in member list of server $serverId but not in user cache"
|
||||
|
|
@ -201,7 +201,7 @@ fun MemberListSheet(
|
|||
MemberListCategory(text = item.category, count = item.count)
|
||||
}
|
||||
|
||||
is MemberListItem.MemberItem -> item(key = item.member.id.user) {
|
||||
is MemberListItem.MemberItem -> item(key = item.member.id!!.user) {
|
||||
MemberListMember(
|
||||
member = item.member,
|
||||
user = RevoltAPI.userCache[item.member.id.user]!!,
|
||||
|
|
@ -225,7 +225,7 @@ fun MemberListMember(
|
|||
serverId: String,
|
||||
onSelectUser: (String) -> Unit
|
||||
) {
|
||||
val highestColourRole = Roles.resolveHighestRole(serverId, member.id.user, true)
|
||||
val highestColourRole = Roles.resolveHighestRole(serverId, member.id!!.user, true)
|
||||
val colour = highestColourRole?.colour?.let { WebCompat.parseColour(it) }
|
||||
?: Brush.solidColor(LocalContentColor.current)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue