diff --git a/src/handlers/messages.ts b/src/handlers/messages.ts index 6f8b4ae..5ca612c 100644 --- a/src/handlers/messages.ts +++ b/src/handlers/messages.ts @@ -102,11 +102,6 @@ export async function handle(rcMessage: RcMessage): Promise { return } - if (rcMessage.t) { - log.warn(`Message ${rcMessage._id} is of type ${rcMessage.t}, skipping.`) - return - } - const room_id = await getRoomId(rcMessage.rid) if (!room_id) { log.warn( @@ -115,6 +110,71 @@ export async function handle(rcMessage: RcMessage): Promise { return } + if (rcMessage.t) { + switch (rcMessage.t) { + case 'ru': // User removed by + case 'ul': // User left + case 'ult': // User left team + case 'removed-user-from-team': // Removed user from team + log.info( + `Message ${rcMessage._id} is of type ${rcMessage.t}, removing member ${rcMessage.msg} from room ${room_id}` + ) + + const members = ( + await axios.get( + `/_matrix/client/v3/rooms/${room_id}/joined_members`, + formatUserSessionOptions(applicationServiceToken) + ) + ).data.joined + if (!members) { + const errorMessage = `Could not determine members of room ${room_id}, aborting` + log.error(errorMessage) + throw new Error(errorMessage) + } + + const matrixUser = + Object.keys(members).find((key) => + key.includes(rcMessage.msg.toLowerCase()) + ) || '' + + const userMapping = await getMappingByMatrixId(matrixUser) + if (!userMapping?.accessToken) { + log.warn( + `Could not get access token for ${rcMessage.msg}, maybe user is not a member, skipping.` + ) + return + } + + log.http(`User ${matrixUser} leaves room ${room_id}`) + await axios.post( + `/_matrix/client/v3/rooms/${room_id}/leave`, + { reason: `Event type ${rcMessage.t}` }, + formatUserSessionOptions(userMapping.accessToken) + ) + return + + case 'uj': // User joined channel + case 'ujt': // User joined team + case 'ut': // User joined conversation + + case 'au': // User added by + case 'added-user-to-team': // Added user to team + case 'r': // Room name changed + case 'rm': // Message removed + log.info( + `Message ${rcMessage._id} is of type ${rcMessage.t}, for which Rocket.Chat does not provide the initial state information, skipping.` + ) + return + + case 'user-muted': // User muted by + default: + log.warn( + `Message ${rcMessage._id} is of unhandled type ${rcMessage.t}, skipping.` + ) + return + } + } + const user_id = await getUserId(rcMessage.u._id) if (!user_id) { log.warn(