Fix missing creators support using via (#2431)

* add additional_creators in IRoomCreateContent type

* use creators in getViaServers

* consider creators in guessing perfect parent
This commit is contained in:
Ajay Bura 2025-08-16 17:00:02 +05:30 committed by GitHub
parent 752a19a4e7
commit 1ad7fe8deb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 49 additions and 8 deletions

View file

@ -1,11 +1,19 @@
import { Room } from 'matrix-js-sdk'; import { Room } from 'matrix-js-sdk';
import { IPowerLevels } from '../hooks/usePowerLevels'; import { IPowerLevels } from '../hooks/usePowerLevels';
import { getMxIdServer } from '../utils/matrix'; import { creatorsSupported, getMxIdServer } from '../utils/matrix';
import { StateEvent } from '../../types/matrix/room'; import { IRoomCreateContent, StateEvent } from '../../types/matrix/room';
import { getStateEvent } from '../utils/room'; import { getStateEvent } from '../utils/room';
export const getViaServers = (room: Room): string[] => { export const getViaServers = (room: Room): string[] => {
const getHighestPowerUserId = (): string | undefined => { const getHighestPowerUserId = (): string | undefined => {
const creatorEvent = getStateEvent(room, StateEvent.RoomCreate);
if (
creatorEvent &&
creatorsSupported(creatorEvent.getContent<IRoomCreateContent>().room_version)
) {
return creatorEvent.getSender();
}
const powerLevels = getStateEvent(room, StateEvent.RoomPowerLevels)?.getContent<IPowerLevels>(); const powerLevels = getStateEvent(room, StateEvent.RoomPowerLevels)?.getContent<IPowerLevels>();
if (!powerLevels) return undefined; if (!powerLevels) return undefined;

View file

@ -20,6 +20,7 @@ import {
import { CryptoBackend } from 'matrix-js-sdk/lib/common-crypto/CryptoBackend'; import { CryptoBackend } from 'matrix-js-sdk/lib/common-crypto/CryptoBackend';
import { AccountDataEvent } from '../../types/matrix/accountData'; import { AccountDataEvent } from '../../types/matrix/accountData';
import { import {
IRoomCreateContent,
Membership, Membership,
MessageEvent, MessageEvent,
NotificationType, NotificationType,
@ -43,7 +44,7 @@ export const getStateEvents = (room: Room, eventType: StateEvent): MatrixEvent[]
export const getAccountData = ( export const getAccountData = (
mx: MatrixClient, mx: MatrixClient,
eventType: AccountDataEvent eventType: AccountDataEvent
): MatrixEvent | undefined => mx.getAccountData(eventType); ): MatrixEvent | undefined => mx.getAccountData(eventType as any);
export const getMDirects = (mDirectEvent: MatrixEvent): Set<string> => { export const getMDirects = (mDirectEvent: MatrixEvent): Set<string> => {
const roomIds = new Set<string>(); const roomIds = new Set<string>();
@ -480,6 +481,23 @@ export const bannedInRooms = (mx: MatrixClient, rooms: string[], otherUserId: st
return banned; return banned;
}); });
export const getAllVersionsRoomCreator = (room: Room): Set<string> => {
const creators = new Set<string>();
const createEvent = getStateEvent(room, StateEvent.RoomCreate);
const createContent = createEvent?.getContent<IRoomCreateContent>();
const creator = createEvent?.getSender();
if (typeof creator === 'string') creators.add(creator);
if (createContent && Array.isArray(createContent.additional_creators)) {
createContent.additional_creators.forEach((c) => {
if (typeof c === 'string') creators.add(c);
});
}
return creators;
};
export const guessPerfectParent = ( export const guessPerfectParent = (
mx: MatrixClient, mx: MatrixClient,
roomId: string, roomId: string,
@ -490,15 +508,29 @@ export const guessPerfectParent = (
} }
const getSpecialUsers = (rId: string): string[] => { const getSpecialUsers = (rId: string): string[] => {
const specialUsers: Set<string> = new Set();
const r = mx.getRoom(rId); const r = mx.getRoom(rId);
const powerLevels = if (!r) return [];
r && getStateEvent(r, StateEvent.RoomPowerLevels)?.getContent<IPowerLevelsContent>();
getAllVersionsRoomCreator(r).forEach((c) => specialUsers.add(c));
const powerLevels = getStateEvent(
r,
StateEvent.RoomPowerLevels
)?.getContent<IPowerLevelsContent>();
const { users_default: usersDefault, users } = powerLevels ?? {}; const { users_default: usersDefault, users } = powerLevels ?? {};
if (typeof users !== 'object') return [];
const defaultPower = typeof usersDefault === 'number' ? usersDefault : 0; const defaultPower = typeof usersDefault === 'number' ? usersDefault : 0;
return Object.keys(users).filter((userId) => users[userId] > defaultPower);
if (typeof users === 'object')
Object.keys(users).forEach((userId) => {
if (users[userId] > defaultPower) {
specialUsers.add(userId);
}
});
return Array.from(specialUsers);
}; };
let perfectParent: string | undefined; let perfectParent: string | undefined;

View file

@ -70,6 +70,7 @@ export type IRoomCreateContent = {
['m.federate']?: boolean; ['m.federate']?: boolean;
room_version: string; room_version: string;
type?: string; type?: string;
additional_creators?: string[];
predecessor?: { predecessor?: {
event_id?: string; event_id?: string;
room_id: string; room_id: string;