KI-AGENT: Matrix-Chat live aktualisieren

This commit is contained in:
2026-05-18 17:45:56 +02:00
parent 655459a46b
commit 8b40be7909
3 changed files with 217 additions and 27 deletions

View File

@@ -22,6 +22,13 @@ type MatrixRoomEvent = {
}
}
type MatrixJoinedMembersResponse = {
joined: Record<string, {
display_name?: string
avatar_url?: string
}>
}
const trimTrailingSlash = (value: string) => value.replace(/\/+$/, "")
const readLocalDevRegistrationSharedSecret = () => {
if (process.env.NODE_ENV === "production") return ""
@@ -687,6 +694,10 @@ export function matrixService(server: FastifyInstance) {
`/_matrix/client/v3/rooms/${encodeURIComponent(room.roomId)}/messages?dir=b&limit=50`,
session.accessToken
)
const members = await requestMatrixJson<MatrixJoinedMembersResponse>(
`/_matrix/client/v3/rooms/${encodeURIComponent(room.roomId)}/joined_members`,
session.accessToken
)
return {
roomId: room.roomId,
@@ -697,6 +708,7 @@ export function matrixService(server: FastifyInstance) {
.map((event) => ({
id: event.event_id,
sender: event.sender,
senderDisplayName: members.joined[event.sender]?.display_name || event.sender,
body: event.content?.body || "",
timestamp: event.origin_server_ts,
own: event.sender === session.matrixUserId,
@@ -705,6 +717,33 @@ export function matrixService(server: FastifyInstance) {
}
}
const getGeneralRoomMembers = async (userId: string, tenantId: number | null) => {
const room = await provisionTenantRoom(userId, tenantId, {
key: "allgemein",
name: "Allgemeiner Chat",
})
const session = await ensureCurrentUserJoinedRoom(userId, tenantId, {
roomId: room.roomId,
alias: room.alias,
})
const members = await requestMatrixJson<MatrixJoinedMembersResponse>(
`/_matrix/client/v3/rooms/${encodeURIComponent(room.roomId)}/joined_members`,
session.accessToken
)
return {
roomId: room.roomId,
alias: room.alias,
members: Object.entries(members.joined).map(([matrixUserId, member]) => ({
matrixUserId,
displayName: member.display_name || matrixUserId,
avatarUrl: member.avatar_url || null,
own: matrixUserId === session.matrixUserId,
})),
}
}
const sendGeneralRoomMessage = async (
userId: string,
tenantId: number | null,
@@ -746,6 +785,7 @@ export function matrixService(server: FastifyInstance) {
return {
id: response.event_id,
sender: session.matrixUserId,
senderDisplayName: await getCurrentUserDisplayName(userId, tenantId),
body: message,
timestamp: Date.now(),
own: true,
@@ -765,6 +805,7 @@ export function matrixService(server: FastifyInstance) {
provisionTenantRoom,
createAccessTokenForUser,
getGeneralRoomMessages,
getGeneralRoomMembers,
sendGeneralRoomMessage,
}
}

View File

@@ -86,6 +86,17 @@ export default async function communicationRoutes(server: FastifyInstance) {
}
})
server.get("/communication/matrix/rooms/general/members", async (req, reply) => {
try {
return await matrix.getGeneralRoomMembers(req.user.user_id, req.user.tenant_id)
} catch (err: any) {
req.log.error(err)
return reply
.code(err.statusCode || 500)
.send({ error: err.message || "Matrix members failed" })
}
})
server.post("/communication/matrix/rooms/general/messages", async (req, reply) => {
try {
const body = req.body as { text?: string }