Remove excess members from rooms
This commit is contained in:
parent
b141488f16
commit
9c9dd97f33
76
src/app.ts
76
src/app.ts
@ -1,18 +1,26 @@
|
|||||||
import dotenv from 'dotenv'
|
import dotenv from 'dotenv'
|
||||||
dotenv.config()
|
dotenv.config()
|
||||||
|
import { AxiosError } from 'axios'
|
||||||
import lineByLine from 'n-readlines'
|
import lineByLine from 'n-readlines'
|
||||||
import 'reflect-metadata'
|
import 'reflect-metadata'
|
||||||
import { handle as handleRoom } from './handlers/rooms'
|
|
||||||
import { handle as handleUser } from './handlers/users'
|
|
||||||
import { handle as handleMessage } from './handlers/messages'
|
|
||||||
import log from './helpers/logger'
|
|
||||||
import { initStorage } from './helpers/storage'
|
|
||||||
import { whoami } from './helpers/synapse'
|
|
||||||
import { Entity, entities } from './Entities'
|
import { Entity, entities } from './Entities'
|
||||||
import { AxiosError } from 'axios'
|
import { handle as handleMessage } from './handlers/messages'
|
||||||
|
import { getFilteredMembers, 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, whoami } from './helpers/synapse'
|
||||||
|
|
||||||
|
const applicationServiceToken = process.env.AS_TOKEN || ''
|
||||||
|
|
||||||
log.info('rocketchat2matrix starts.')
|
log.info('rocketchat2matrix starts.')
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
async function loadRcExport(entity: Entity) {
|
async function loadRcExport(entity: Entity) {
|
||||||
const rl = new lineByLine(`./inputs/${entities[entity].filename}`)
|
const rl = new lineByLine(`./inputs/${entities[entity].filename}`)
|
||||||
|
|
||||||
@ -38,6 +46,57 @@ async function loadRcExport(entity: Entity) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function removeExcessRoomMembers() {
|
||||||
|
const roomMappings = await getAllMappingsByType(
|
||||||
|
entities[Entity.Rooms].mappingType
|
||||||
|
)
|
||||||
|
if (!roomMappings) {
|
||||||
|
throw new Error(`No room mappings found`)
|
||||||
|
}
|
||||||
|
|
||||||
|
roomMappings.forEach(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[] = Object.keys(
|
||||||
|
(
|
||||||
|
await axios.get(
|
||||||
|
`/_matrix/client/v3/rooms/${roomMapping.matrixId}/joined_members`,
|
||||||
|
formatUserSessionOptions(applicationServiceToken)
|
||||||
|
)
|
||||||
|
).data.joined
|
||||||
|
)
|
||||||
|
|
||||||
|
// do action for any user in mx, but not in rc
|
||||||
|
await Promise.all(
|
||||||
|
actualMembers.map(async (actualMember) => {
|
||||||
|
if (!memberNames.includes(actualMember)) {
|
||||||
|
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() {
|
async function main() {
|
||||||
try {
|
try {
|
||||||
await whoami()
|
await whoami()
|
||||||
@ -48,6 +107,9 @@ async function main() {
|
|||||||
await loadRcExport(Entity.Rooms)
|
await loadRcExport(Entity.Rooms)
|
||||||
log.info('Parsing messages')
|
log.info('Parsing messages')
|
||||||
await loadRcExport(Entity.Messages)
|
await loadRcExport(Entity.Messages)
|
||||||
|
log.info('Checking room memberships')
|
||||||
|
await removeExcessRoomMembers()
|
||||||
|
|
||||||
log.info('Done.')
|
log.info('Done.')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error instanceof AxiosError) {
|
if (error instanceof AxiosError) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user