diff --git a/lib/utils/convert-farcaster-message-to-comm-messages.js b/lib/utils/convert-farcaster-message-to-comm-messages.js --- a/lib/utils/convert-farcaster-message-to-comm-messages.js +++ b/lib/utils/convert-farcaster-message-to-comm-messages.js @@ -11,6 +11,7 @@ import type { Image, Video } from '../types/media-types.js'; import { messageTypes } from '../types/message-types-enum.js'; import type { RawMessageInfo } from '../types/message-types.js'; +import type { CompoundReactionInfo } from '../types/messages/compound-reaction.js'; function convertFarcasterMessageToCommMessages( farcasterMessage: FarcasterMessage, @@ -23,6 +24,33 @@ const threadID = farcasterThreadIDFromConversationID( farcasterMessage.conversationId, ); + const result: Array = []; + + if (farcasterMessage.reactions?.length > 0) { + const viewerReactions = new Set( + farcasterMessage.viewerContext?.reactions ?? [], + ); + const reactions: { [reaction: string]: CompoundReactionInfo } = {}; + for (const reaction of farcasterMessage.reactions) { + reactions[reaction.reaction] = { + count: reaction.count, + viewerReacted: viewerReactions.has(reaction.reaction), + }; + } + result.push({ + id: `${farcasterMessage.messageId}/reactions`, + type: messageTypes.COMPOUND_REACTION, + threadID, + // Doesn't matter - we don't use it + creatorID, + // We add 1 to the timestamp to make sure that the reactions are more + // recent than the message itself + time: parseInt(farcasterMessage.serverTimestamp, 10) + 1, + targetMessageID: farcasterMessage.messageId, + reactions, + }); + } + if ( farcasterMessage.type === 'group_membership_addition' && farcasterMessage.actionTargetUserContext?.fid @@ -31,19 +59,15 @@ farcasterMessage.actionTargetUserContext.fid.toString(); const addedUser = fcUserInfos.get(addedUserFID)?.userID ?? userIDFromFID(addedUserFID); - return [ - { - id: farcasterMessage.messageId, - type: messageTypes.ADD_MEMBERS, - threadID, - creatorID, - time: parseInt(farcasterMessage.serverTimestamp, 10), - addedUserIDs: [addedUser], - }, - ]; - } - - if ( + result.push({ + id: farcasterMessage.messageId, + type: messageTypes.ADD_MEMBERS, + threadID, + creatorID, + time: parseInt(farcasterMessage.serverTimestamp, 10), + addedUserIDs: [addedUser], + }); + } else if ( farcasterMessage.type === 'text' && (!!farcasterMessage?.metadata?.medias || !!farcasterMessage?.metadata?.videos) @@ -82,16 +106,14 @@ } const time = parseInt(farcasterMessage.serverTimestamp, 10); - const messages: Array = [ - { - id: farcasterMessage.messageId, - type: messageTypes.MULTIMEDIA, - threadID, - creatorID, - time, - media, - }, - ]; + result.push({ + id: farcasterMessage.messageId, + type: messageTypes.MULTIMEDIA, + threadID, + creatorID, + time, + media, + }); const captionText = media .reduce( @@ -101,7 +123,7 @@ .trim(); if (captionText.length > 0) { - messages.push({ + result.push({ id: farcasterMessage.messageId + '/caption', type: messageTypes.TEXT, threadID, @@ -110,38 +132,26 @@ text: captionText, }); } - - return messages; - } - - if (farcasterMessage.type === 'text') { - return [ - { - id: farcasterMessage.messageId, - type: messageTypes.TEXT, - threadID, - creatorID, - time: parseInt(farcasterMessage.serverTimestamp, 10), - text: farcasterMessage.message, - }, - ]; - } - - if (farcasterMessage.type === 'group_name_change') { - return [ - { - id: farcasterMessage.messageId, - type: messageTypes.CHANGE_SETTINGS, - threadID, - creatorID, - time: parseInt(farcasterMessage.serverTimestamp, 10), - field: 'name', - value: farcasterMessage.message, - }, - ]; - } - - if ( + } else if (farcasterMessage.type === 'text') { + result.push({ + id: farcasterMessage.messageId, + type: messageTypes.TEXT, + threadID, + creatorID, + time: parseInt(farcasterMessage.serverTimestamp, 10), + text: farcasterMessage.message, + }); + } else if (farcasterMessage.type === 'group_name_change') { + result.push({ + id: farcasterMessage.messageId, + type: messageTypes.CHANGE_SETTINGS, + threadID, + creatorID, + time: parseInt(farcasterMessage.serverTimestamp, 10), + field: 'name', + value: farcasterMessage.message, + }); + } else if ( farcasterMessage.type === 'group_membership_removal' && farcasterMessage.actionTargetUserContext?.fid ) { @@ -150,24 +160,22 @@ const removedUserID = fcUserInfos?.get(removedUserFID)?.userID ?? userIDFromFID(removedUserFID); - return [ - { - type: messageTypes.REMOVE_MEMBERS, - id: farcasterMessage.messageId, - threadID, - creatorID, - time: parseInt(farcasterMessage.serverTimestamp, 10), - removedUserIDs: [removedUserID], - }, - ]; + result.push({ + type: messageTypes.REMOVE_MEMBERS, + id: farcasterMessage.messageId, + threadID, + creatorID, + time: parseInt(farcasterMessage.serverTimestamp, 10), + removedUserIDs: [removedUserID], + }); + } else { + console.log( + 'UNSUPPORTED FARCASTER MESSAGE', + JSON.stringify(farcasterMessage, null, 2), + ); } - console.log( - 'UNSUPPORTED FARCASTER MESSAGE', - JSON.stringify(farcasterMessage, null, 2), - ); - - return []; + return result; } function removeMediaURIFromString(input: string, url: string): string {