From 6232b435e52c88ba367418f0714c96d0e997a0a2 Mon Sep 17 00:00:00 2001 From: Infi Date: Wed, 30 Aug 2023 03:56:55 +0500 Subject: [PATCH] feat: support inline server identity also fixes the ServerMemberUpdate frame Signed-off-by: Infi --- .../java/chat/revolt/api/internals/Members.kt | 2 +- .../revolt/api/realtime/RealtimeSocket.kt | 3 ++ .../chat/revolt/api/routes/server/Server.kt | 4 +-- .../java/chat/revolt/api/schemas/Channel.kt | 4 +-- .../chat/revolt/components/chat/InReplyTo.kt | 3 +- .../chat/revolt/components/chat/Message.kt | 29 +++++++++++++++++-- .../views/channel/ChannelScreenViewModel.kt | 2 +- .../chat/revolt/sheets/MemberListSheet.kt | 6 ++-- 8 files changed, 39 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/chat/revolt/api/internals/Members.kt b/app/src/main/java/chat/revolt/api/internals/Members.kt index 6fb6819b..f13b4dfb 100644 --- a/app/src/main/java/chat/revolt/api/internals/Members.kt +++ b/app/src/main/java/chat/revolt/api/internals/Members.kt @@ -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) { diff --git a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt b/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt index bbe72d8c..c71ef20b 100644 --- a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt +++ b/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt @@ -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) } diff --git a/app/src/main/java/chat/revolt/api/routes/server/Server.kt b/app/src/main/java/chat/revolt/api/routes/server/Server.kt index 5c4fa396..23f3347a 100644 --- a/app/src/main/java/chat/revolt/api/routes/server/Server.kt +++ b/app/src/main/java/chat/revolt/api/routes/server/Server.kt @@ -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) } } diff --git a/app/src/main/java/chat/revolt/api/schemas/Channel.kt b/app/src/main/java/chat/revolt/api/schemas/Channel.kt index 556f4597..bd762aee 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Channel.kt +++ b/app/src/main/java/chat/revolt/api/schemas/Channel.kt @@ -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, diff --git a/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt b/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt index 3445254f..1f4fa8e0 100644 --- a/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt +++ b/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt @@ -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 ) diff --git a/app/src/main/java/chat/revolt/components/chat/Message.kt b/app/src/main/java/chat/revolt/components/chat/Message.kt index 76522715..94440657 100644 --- a/app/src/main/java/chat/revolt/components/chat/Message.kt +++ b/app/src/main/java/chat/revolt/components/chat/Message.kt @@ -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, ) } diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt index 261f4f5e..b2028400 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt @@ -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) } } diff --git a/app/src/main/java/chat/revolt/sheets/MemberListSheet.kt b/app/src/main/java/chat/revolt/sheets/MemberListSheet.kt index 183f9ee5..a95b4d6e 100644 --- a/app/src/main/java/chat/revolt/sheets/MemberListSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/MemberListSheet.kt @@ -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)