Move removeExcessRoomMembers to new file
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Henrik HerHde Huettemann 2024-04-17 12:49:16 +02:00
parent 55e4e252fe
commit 4d014d4e06
Signed by: HueHe
GPG key ID: 68FE5FEEBF1EAF5B
2 changed files with 75 additions and 71 deletions

View file

@ -7,22 +7,13 @@ import { Entity, entities } from './Entities'
import { handleDirectChats } from './handlers/directChats'
import { handlePinnedMessages } from './handlers/pinnedMessages'
import { handle as handleMessage } from './handlers/messages'
import { getFilteredMembers, handle as handleRoom } from './handlers/rooms'
import { handle as handleRoom } from './handlers/rooms'
import { handle as handleUser } from './handlers/users'
import log from './helpers/logger'
import {
getAllMappingsByType,
getMappingByMatrixId,
getMemberships,
initStorage,
} from './helpers/storage'
import {
axios,
formatUserSessionOptions,
getMatrixMembers,
whoami,
} from './helpers/synapse'
import { initStorage } from './helpers/storage'
import { whoami } from './helpers/synapse'
import { exit } from 'node:process'
import { removeExcessRoomMembers } from './handlers/removeExcessRoomMembers'
log.info('rocketchat2matrix starts.')
@ -55,64 +46,6 @@ async function loadRcExport(entity: Entity) {
}
}
/**
* Remove all excess Matrix room members, which are not part of the Rocket.Chat room and not an admin
*/
async function removeExcessRoomMembers() {
const roomMappings = await getAllMappingsByType(
entities[Entity.Rooms].mappingType
)
if (!roomMappings) {
throw new Error(`No room mappings found`)
}
await Promise.all(
roomMappings.map(async (roomMapping) => {
log.info(
`Checking memberships for room ${roomMapping.rcId} / ${roomMapping.matrixId}`
)
// get all memberships from db
const rcMemberIds = await getMemberships(roomMapping.rcId)
const memberMappings = await getFilteredMembers(rcMemberIds, '')
const memberNames: string[] = memberMappings.map(
(memberMapping) => memberMapping.matrixId || ''
)
// get each mx rooms' mx users
const actualMembers: string[] = await getMatrixMembers(
roomMapping.matrixId || ''
)
// do action for any user in mx, but not in rc
const adminUsername = process.env.ADMIN_USERNAME || ''
await Promise.all(
actualMembers.map(async (actualMember) => {
if (
!memberNames.includes(actualMember) &&
!actualMember.includes(adminUsername) // exclude admin from removal
) {
log.warn(
`Member ${actualMember} should not be in room ${roomMapping.matrixId}, removing`
)
const memberMapping = await getMappingByMatrixId(actualMember)
if (!memberMapping || !memberMapping.accessToken) {
throw new Error(
`Could not find access token for member ${actualMember}, this is a bug`
)
}
await axios.post(
`/_matrix/client/v3/rooms/${roomMapping.matrixId}/leave`,
{},
formatUserSessionOptions(memberMapping.accessToken)
)
}
})
)
})
)
}
async function main() {
try {
await whoami()

View file

@ -0,0 +1,71 @@
import { Entity, entities } from '../Entities'
import log from '../helpers/logger'
import {
getAllMappingsByType,
getMappingByMatrixId,
getMemberships,
} from '../helpers/storage'
import {
axios,
formatUserSessionOptions,
getMatrixMembers,
} from '../helpers/synapse'
import { getFilteredMembers } from './rooms'
/**
* Remove all excess Matrix room members, which are not part of the Rocket.Chat room and not an admin
*/
export async function removeExcessRoomMembers() {
const roomMappings = await getAllMappingsByType(
entities[Entity.Rooms].mappingType
)
if (!roomMappings) {
throw new Error(`No room mappings found`)
}
await Promise.all(
roomMappings.map(async (roomMapping) => {
log.info(
`Checking memberships for room ${roomMapping.rcId} / ${roomMapping.matrixId}`
)
// get all memberships from db
const rcMemberIds = await getMemberships(roomMapping.rcId)
const memberMappings = await getFilteredMembers(rcMemberIds, '')
const memberNames: string[] = memberMappings.map(
(memberMapping) => memberMapping.matrixId || ''
)
// get each mx rooms' mx users
const actualMembers: string[] = await getMatrixMembers(
roomMapping.matrixId || ''
)
// do action for any user in mx, but not in rc
const adminUsername = process.env.ADMIN_USERNAME || ''
await Promise.all(
actualMembers.map(async (actualMember) => {
if (
!memberNames.includes(actualMember) &&
!actualMember.includes(adminUsername) // exclude admin from removal
) {
log.warn(
`Member ${actualMember} should not be in room ${roomMapping.matrixId}, removing`
)
const memberMapping = await getMappingByMatrixId(actualMember)
if (!memberMapping || !memberMapping.accessToken) {
throw new Error(
`Could not find access token for member ${actualMember}, this is a bug`
)
}
await axios.post(
`/_matrix/client/v3/rooms/${roomMapping.matrixId}/leave`,
{},
formatUserSessionOptions(memberMapping.accessToken)
)
}
})
)
})
)
}