Move removeExcessRoomMembers to new file
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
parent
55e4e252fe
commit
4d014d4e06
75
src/app.ts
75
src/app.ts
|
@ -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()
|
||||
|
|
71
src/handlers/removeExcessRoomMembers.ts
Normal file
71
src/handlers/removeExcessRoomMembers.ts
Normal 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)
|
||||
)
|
||||
}
|
||||
})
|
||||
)
|
||||
})
|
||||
)
|
||||
}
|
Loading…
Reference in a new issue