mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-09-13 22:32:26 +03:00
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:
parent
752a19a4e7
commit
1ad7fe8deb
3 changed files with 49 additions and 8 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue