feat: support inline server identity

also fixes the ServerMemberUpdate frame

Signed-off-by: Infi <wingit@geist.ga>
This commit is contained in:
Infi 2023-08-30 03:56:55 +05:00
parent a45b07f9de
commit 6232b435e5
8 changed files with 39 additions and 14 deletions

View File

@ -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) {

View File

@ -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)
}

View File

@ -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)
}
}

View File

@ -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,

View File

@ -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
)

View File

@ -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,
)
}

View File

@ -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)
}
}

View File

@ -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)