Skip to content

Commit c8ff64c

Browse files
authored
add update member name support (#291)
1 parent 685ad17 commit c8ff64c

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

packages/federation-sdk/src/services/room.service.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,50 @@ export class RoomService {
712712
return kickEvent.eventId;
713713
}
714714

715+
async updateMemberProfile(
716+
roomId: RoomID,
717+
userId: UserID,
718+
displayName: string,
719+
): Promise<PersistentEventBase<RoomVersion, 'm.room.member'>> {
720+
const roomInfo = await this.stateService.getRoomInformation(roomId);
721+
const currentState = await this.stateService.getLatestRoomState(roomId);
722+
723+
const currentMembership = currentState.get(`m.room.member:${userId}`);
724+
if (!currentMembership || currentMembership.getMembership() !== 'join') {
725+
throw new Error(`User ${userId} is not a member of room ${roomId}`);
726+
}
727+
728+
const memberEvent = await this.stateService.buildEvent<'m.room.member'>(
729+
{
730+
type: 'm.room.member',
731+
content: {
732+
membership: 'join', // SAME membership (not changing)
733+
displayname: displayName, // NEW displayname
734+
},
735+
room_id: roomId,
736+
sender: userId,
737+
state_key: userId,
738+
auth_events: [],
739+
depth: 0,
740+
prev_events: [],
741+
origin_server_ts: Date.now(),
742+
},
743+
roomInfo.room_version,
744+
);
745+
746+
await this.stateService.handlePdu(memberEvent);
747+
748+
if (memberEvent.rejected) {
749+
throw new Error(
750+
`Member profile update rejected: ${memberEvent.rejectReason}`,
751+
);
752+
}
753+
754+
void this.federationService.sendEventToAllServersInRoom(memberEvent);
755+
756+
return memberEvent;
757+
}
758+
715759
async banUser(
716760
roomId: RoomID,
717761
bannedUserId: UserID,

0 commit comments

Comments
 (0)