import { Room } from 'matrix-js-sdk';
import { IPowerLevels } from '../hooks/usePowerLevels';
-import { getMxIdServer } from '../utils/matrix';
-import { StateEvent } from '../../types/matrix/room';
+import { creatorsSupported, getMxIdServer } from '../utils/matrix';
+import { IRoomCreateContent, StateEvent } from '../../types/matrix/room';
import { getStateEvent } from '../utils/room';
export const getViaServers = (room: Room): string[] => {
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>();
if (!powerLevels) return undefined;
import { CryptoBackend } from 'matrix-js-sdk/lib/common-crypto/CryptoBackend';
import { AccountDataEvent } from '../../types/matrix/accountData';
import {
+ IRoomCreateContent,
Membership,
MessageEvent,
NotificationType,
export const getAccountData = (
mx: MatrixClient,
eventType: AccountDataEvent
-): MatrixEvent | undefined => mx.getAccountData(eventType);
+): MatrixEvent | undefined => mx.getAccountData(eventType as any);
export const getMDirects = (mDirectEvent: MatrixEvent): Set<string> => {
const roomIds = new Set<string>();
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 = (
mx: MatrixClient,
roomId: string,
}
const getSpecialUsers = (rId: string): string[] => {
+ const specialUsers: Set<string> = new Set();
+
const r = mx.getRoom(rId);
- const powerLevels =
- r && getStateEvent(r, StateEvent.RoomPowerLevels)?.getContent<IPowerLevelsContent>();
+ if (!r) return [];
- const { users_default: usersDefault, users } = powerLevels ?? {};
- if (typeof users !== 'object') return [];
+ getAllVersionsRoomCreator(r).forEach((c) => specialUsers.add(c));
+
+ const powerLevels = getStateEvent(
+ r,
+ StateEvent.RoomPowerLevels
+ )?.getContent<IPowerLevelsContent>();
+ const { users_default: usersDefault, users } = powerLevels ?? {};
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;