fix: federation reaction identity + remote server reload race condition

- Include user object in reaction_added WS broadcasts for isSelf() resolution
- Use isSelf() instead of userId comparison for reaction ownership checks
- Load remote server detail after ready event to prevent empty channel list
This commit is contained in:
Jannis Braun
2026-03-04 03:53:07 +01:00
parent dca9c4dc83
commit f7809cf457
3 changed files with 32 additions and 6 deletions
+14 -4
View File
@@ -709,19 +709,24 @@ function handleReactionAdd(event: Record<string, unknown>, userId: string): void
if (!serverId || !isMember(serverId, userId)) return;
const reactionId = generateSnowflake();
const now = Date.now();
try {
db.insert(schema.reactions).values({
id: reactionId,
messageId,
userId,
emoji,
createdAt: Date.now(),
createdAt: now,
}).run();
// Include user object so remote clients can use isSelf() for identity resolution
const reactionUser = db.select().from(schema.users).where(eq(schema.users.id, userId)).get();
const userObj = reactionUser ? sanitizeUser(reactionUser) : undefined;
connectionManager.sendToChannel(serverId, message.channelId, {
type: 'reaction_added',
messageId,
reaction: { id: reactionId, messageId, userId, emoji, createdAt: Date.now() },
reaction: { id: reactionId, messageId, userId, emoji, createdAt: now, user: userObj },
});
} catch (err) {
// Unique constraint violation (already reacted)
@@ -734,19 +739,24 @@ function handleReactionAdd(event: Record<string, unknown>, userId: string): void
if (!dmMsg || !isDmMember(dmMsg.dmChannelId, userId)) return;
const reactionId = generateSnowflake();
const now = Date.now();
try {
db.insert(schema.dmReactions).values({
id: reactionId,
dmMessageId: messageId,
userId,
emoji,
createdAt: Date.now(),
createdAt: now,
}).run();
// Include user object so remote clients can use isSelf() for identity resolution
const reactionUser = db.select().from(schema.users).where(eq(schema.users.id, userId)).get();
const userObj = reactionUser ? sanitizeUser(reactionUser) : undefined;
connectionManager.sendToDmMembers(dmMsg.dmChannelId, {
type: 'reaction_added',
messageId,
reaction: { id: reactionId, messageId, userId, emoji, createdAt: Date.now() },
reaction: { id: reactionId, messageId, userId, emoji, createdAt: now, user: userObj },
});
} catch (err) {
// Unique constraint violation (already reacted)