fix: persist homeUserId for federated users to ensure consistent avatar colors

Store the original home snowflake ID (homeUserId) during federation replication
so that avatar gradient colors resolve identically across instances. Previously,
replicated users got new snowflake IDs on each instance, causing different
gradient colors. Now Avatar, UserProfilePopout, VoiceUser, StreamTile, and
VoiceChannel all resolve through homeUserId when available. Includes backfill
logic for existing federated users missing the field.
This commit is contained in:
Jannis Braun
2026-03-04 13:45:25 +01:00
parent 9432f81ba3
commit c7c3331dbf
15 changed files with 47 additions and 22 deletions
+9 -1
View File
@@ -38,7 +38,7 @@ export async function userRoutes(app: FastifyInstance): Promise<void> {
});
app.patch<{ Body: UpdateUserRequest }>('/api/users/@me', { preHandler: authenticate }, async (request, reply) => {
const { displayName, avatar, customStatus, status, replicatedInstances } = request.body;
const { displayName, avatar, customStatus, status, replicatedInstances, homeUserId } = request.body;
const db = getDb();
const updateData: Record<string, string | null | undefined> = {};
@@ -97,6 +97,14 @@ export async function userRoutes(app: FastifyInstance): Promise<void> {
updateData.replicatedInstances = JSON.stringify(replicatedInstances);
}
if (homeUserId !== undefined) {
// Only allow setting homeUserId for replicated users (has homeInstance)
const currentUser = db.select().from(schema.users).where(eq(schema.users.id, request.userId)).get();
if (currentUser?.homeInstance && typeof homeUserId === 'string' && homeUserId.length > 0) {
updateData.homeUserId = homeUserId;
}
}
if (Object.keys(updateData).length === 0) {
return reply.code(400).send({ error: 'No fields to update', statusCode: 400 });
}