fix server avatars

This commit is contained in:
2026-04-20 21:22:02 -04:00
parent 0b2b31d0bd
commit 59c9c6b7c6
2 changed files with 73 additions and 1 deletions
+64
View File
@@ -79,11 +79,43 @@ pub fn get_visible_image_ids(db: &Local, identity: Identity) -> HashSet<u64> {
}
}
// User's own avatar/banner
if let Some(user) = db.user().identity().find(identity) {
if let Some(id) = user.avatar_id { results.insert(id); }
if let Some(id) = user.banner_id { results.insert(id); }
}
// Server avatars for servers I am a member of or are public
let my_server_ids: HashSet<u64> = db.server_member().identity().filter(identity).map(|m| m.server_id).collect();
for s in db.server().name().filter(""..) {
if s.public || my_server_ids.contains(&s.id) {
if let Some(id) = s.avatar_id { results.insert(id); }
}
}
// Avatars for members of servers I am in (and redundant check for server avatars stored in membership)
for server_id in my_server_ids {
for member in db.server_member().server_id().filter(server_id) {
if let Some(id) = member.avatar_id { results.insert(id); }
}
// Also check if any server I'm in has an avatar id that might not have been caught in the name filter
if let Some(s) = db.server().id().find(server_id) {
if let Some(id) = s.avatar_id { results.insert(id); }
}
}
// Avatars for DM participants
for dm in db.direct_message().sender().filter(identity) {
if let Some(u) = db.user().identity().find(dm.recipient) {
if let Some(id) = u.avatar_id { results.insert(id); }
}
}
for dm in db.direct_message().recipient().filter(identity) {
if let Some(u) = db.user().identity().find(dm.sender) {
if let Some(id) = u.avatar_id { results.insert(id); }
}
}
results
}
@@ -99,11 +131,43 @@ pub fn get_visible_image_ids_read_only(db: &LocalReadOnly, identity: Identity) -
}
}
// User's own avatar/banner
if let Some(user) = db.user().identity().find(identity) {
if let Some(id) = user.avatar_id { results.insert(id); }
if let Some(id) = user.banner_id { results.insert(id); }
}
// Server avatars for servers I am a member of or are public
let my_server_ids: HashSet<u64> = db.server_member().identity().filter(identity).map(|m| m.server_id).collect();
for s in db.server().name().filter(""..) {
if s.public || my_server_ids.contains(&s.id) {
if let Some(id) = s.avatar_id { results.insert(id); }
}
}
// Avatars for members of servers I am in (and redundant check for server avatars stored in membership)
for server_id in my_server_ids {
for member in db.server_member().server_id().filter(server_id) {
if let Some(id) = member.avatar_id { results.insert(id); }
}
// Also check if any server I'm in has an avatar id that might not have been caught in the name filter
if let Some(s) = db.server().id().find(server_id) {
if let Some(id) = s.avatar_id { results.insert(id); }
}
}
// Avatars for DM participants
for dm in db.direct_message().sender().filter(identity) {
if let Some(u) = db.user().identity().find(dm.recipient) {
if let Some(id) = u.avatar_id { results.insert(id); }
}
}
for dm in db.direct_message().recipient().filter(identity) {
if let Some(u) = db.user().identity().find(dm.sender) {
if let Some(id) = u.avatar_id { results.insert(id); }
}
}
results
}
+9 -1
View File
@@ -1,7 +1,6 @@
import { Identity } from "spacetimedb";
import { SvelteMap, SvelteSet } from "svelte/reactivity";
import * as Types from "../../module_bindings/types";
import { reducers } from "../../module_bindings";
import { getUsername, formatTime } from "../utils";
import { getConnection } from "../../config";
import { DatabaseService } from "./database.svelte";
@@ -170,6 +169,8 @@ export class ChatService {
$effect(() => {
const blobs = this.#db.imageBlobs;
const currentImages = this.#db.images;
const conn = getConnection();
if (!conn || !this.identity) return;
for (const blob of blobs) {
const idStr = blob.imageId.toString();
@@ -211,7 +212,14 @@ export class ChatService {
const idStr = server.avatarId.toString();
const url = this.#blobUrls.get(idStr);
if (url && this.#serverAvatarUrls.get(idStr) !== url) {
console.log(`[ChatService] Mapping server avatar URL: ${idStr} -> ${url} for server ${server.name}`);
this.#serverAvatarUrls.set(idStr, url);
} else if (!url) {
// Check if we already requested this
if (!this.#blobUrls.has(idStr)) {
console.log(`[ChatService] Requesting missing server avatar blob for ${server.name}: ${idStr}`);
conn.reducers.requestImageBlob({ imageId: server.avatarId });
}
}
}
}