From a7afe7b5700607dbb7a0d84034fee2c3f24e1afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20H=C3=BCttemann?= Date: Tue, 12 Sep 2023 15:05:39 +0200 Subject: [PATCH] Add members to channel if they posted a message --- src/handlers/messages.ts | 80 +++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/src/handlers/messages.ts b/src/handlers/messages.ts index 3180ea6..6f8b4ae 100644 --- a/src/handlers/messages.ts +++ b/src/handlers/messages.ts @@ -1,8 +1,17 @@ +import { AxiosError } from 'axios' import { Entity, entities } from '../Entities' import { IdMapping } from '../entity/IdMapping' import log from '../helpers/logger' -import { getMessageId, getRoomId, getUserId, save } from '../helpers/storage' +import { + getMapping, + getMappingByMatrixId, + getMessageId, + getRoomId, + getUserId, + save, +} from '../helpers/storage' import { axios, formatUserSessionOptions } from '../helpers/synapse' +import { acceptInvitation, inviteMember } from './rooms' const applicationServiceToken = process.env.AS_TOKEN || '' if (!applicationServiceToken) { @@ -134,13 +143,66 @@ export async function handle(rcMessage: RcMessage): Promise { } } - const event_id = await createMessage( - matrixMessage, - room_id, - user_id, - ts, - rcMessage._id - ) + try { + const event_id = await createMessage( + matrixMessage, + room_id, + user_id, + ts, + rcMessage._id + ) + createMapping(rcMessage._id, event_id) + } catch (error) { + if ( + error instanceof AxiosError && + error.response && + error.response.data.errcode === 'M_FORBIDDEN' && + error.response.data.error === `User ${user_id} not in room ${room_id}` + ) { + log.info(error.response.data.error + ', adding.') - createMapping(rcMessage._id, event_id) + const userMapping = await getMapping( + rcMessage.u._id, + entities[Entity.Users].mappingType + ) + if (!userMapping || !userMapping.matrixId || !userMapping.accessToken) { + log.warn(`Could not determine joining user, skipping.`, rcMessage) + return + } + + // Get room creator session or use empty axios options + let userSessionOptions = {} + const roomCreatorId = ( + await axios.get(`/_synapse/admin/v1/rooms/${room_id}`) + ).data.creator + if (!roomCreatorId) { + log.warn( + `Could not determine room creator for room ${room_id}, using admin credentials.` + ) + } else { + const creatorMapping = await getMappingByMatrixId(roomCreatorId) + if (!creatorMapping?.accessToken) { + log.warn(`Could not access token for ${roomCreatorId}, skipping.`) + return + } + userSessionOptions = formatUserSessionOptions( + creatorMapping.accessToken + ) + } + + await inviteMember(userMapping.matrixId, room_id, userSessionOptions) + await acceptInvitation(userMapping, room_id) + + const event_id = await createMessage( + matrixMessage, + room_id, + user_id, + ts, + rcMessage._id + ) + createMapping(rcMessage._id, event_id) + } else { + throw error + } + } }