Add members to channel if they posted a message

This commit is contained in:
Henrik Hüttemann 2023-09-12 15:05:39 +02:00
parent d2543dca2f
commit a7afe7b570
No known key found for this signature in database
GPG Key ID: 9F7BD10E0A8A111E

View File

@ -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<void> {
}
}
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
}
}
}