UNPKG

matrix-react-sdk

Version:
129 lines (118 loc) 15.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getDisplayAliasForAliasSet = getDisplayAliasForAliasSet; exports.getDisplayAliasForRoom = getDisplayAliasForRoom; exports.guessAndSetDMRoom = guessAndSetDMRoom; exports.setDMRoom = setDMRoom; var _matrix = require("matrix-js-sdk/src/matrix"); var _Alias = _interopRequireDefault(require("./customisations/Alias")); /* Copyright 2024 New Vector Ltd. Copyright 2015-2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ /** * Given a room object, return the alias we should use for it, * if any. This could be the canonical alias if one exists, otherwise * an alias selected arbitrarily but deterministically from the list * of aliases. Otherwise return null; * * @param {Object} room The room object * @returns {string} A display alias for the given room */ function getDisplayAliasForRoom(room) { return getDisplayAliasForAliasSet(room.getCanonicalAlias(), room.getAltAliases()); } // The various display alias getters should all feed through this one path so // there's a single place to change the logic. function getDisplayAliasForAliasSet(canonicalAlias, altAliases) { if (_Alias.default.getDisplayAliasForAliasSet) { return _Alias.default.getDisplayAliasForAliasSet(canonicalAlias, altAliases); } return (canonicalAlias || altAliases?.[0]) ?? ""; } function guessAndSetDMRoom(room, isDirect) { let newTarget; if (isDirect) { const guessedUserId = guessDMRoomTargetId(room, room.client.getSafeUserId()); newTarget = guessedUserId; } else { newTarget = null; } return setDMRoom(room.client, room.roomId, newTarget); } /** * Marks or unmarks the given room as being as a DM room. * @param client the Matrix Client instance of the logged-in user * @param {string} roomId The ID of the room to modify * @param {string | null} userId The user ID of the desired DM room target user or * null to un-mark this room as a DM room * @returns {object} A promise */ async function setDMRoom(client, roomId, userId) { if (client.isGuest()) return; const mDirectEvent = client.getAccountData(_matrix.EventType.Direct); const currentContent = mDirectEvent?.getContent() || {}; const dmRoomMap = new Map(Object.entries(currentContent)); let modified = false; // remove it from the lists of any others users // (it can only be a DM room for one person) for (const thisUserId of dmRoomMap.keys()) { const roomList = dmRoomMap.get(thisUserId) || []; if (thisUserId != userId) { const indexOfRoom = roomList.indexOf(roomId); if (indexOfRoom > -1) { roomList.splice(indexOfRoom, 1); modified = true; } } } // now add it, if it's not already there if (userId) { const roomList = dmRoomMap.get(userId) || []; if (roomList.indexOf(roomId) == -1) { roomList.push(roomId); modified = true; } dmRoomMap.set(userId, roomList); } // prevent unnecessary calls to setAccountData if (!modified) return; await client.setAccountData(_matrix.EventType.Direct, Object.fromEntries(dmRoomMap)); } /** * Given a room, estimate which of its members is likely to * be the target if the room were a DM room and return that user. * * @param {Object} room Target room * @param {string} myUserId User ID of the current user * @returns {string} User ID of the user that the room is probably a DM with */ function guessDMRoomTargetId(room, myUserId) { let oldestTs; let oldestUser; // Pick the joined user who's been here longest (and isn't us), for (const user of room.getJoinedMembers()) { if (user.userId == myUserId) continue; if (oldestTs === undefined || user.events.member && user.events.member.getTs() < oldestTs) { oldestUser = user; oldestTs = user.events.member?.getTs(); } } if (oldestUser) return oldestUser.userId; // if there are no joined members other than us, use the oldest member for (const user of room.currentState.getMembers()) { if (user.userId == myUserId) continue; if (oldestTs === undefined || user.events.member && user.events.member.getTs() < oldestTs) { oldestUser = user; oldestTs = user.events.member?.getTs(); } } if (oldestUser === undefined) return myUserId; return oldestUser.userId; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9BbGlhcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJnZXREaXNwbGF5QWxpYXNGb3JSb29tIiwicm9vbSIsImdldERpc3BsYXlBbGlhc0ZvckFsaWFzU2V0IiwiZ2V0Q2Fub25pY2FsQWxpYXMiLCJnZXRBbHRBbGlhc2VzIiwiY2Fub25pY2FsQWxpYXMiLCJhbHRBbGlhc2VzIiwiQWxpYXNDdXN0b21pc2F0aW9ucyIsImd1ZXNzQW5kU2V0RE1Sb29tIiwiaXNEaXJlY3QiLCJuZXdUYXJnZXQiLCJndWVzc2VkVXNlcklkIiwiZ3Vlc3NETVJvb21UYXJnZXRJZCIsImNsaWVudCIsImdldFNhZmVVc2VySWQiLCJzZXRETVJvb20iLCJyb29tSWQiLCJ1c2VySWQiLCJpc0d1ZXN0IiwibURpcmVjdEV2ZW50IiwiZ2V0QWNjb3VudERhdGEiLCJFdmVudFR5cGUiLCJEaXJlY3QiLCJjdXJyZW50Q29udGVudCIsImdldENvbnRlbnQiLCJkbVJvb21NYXAiLCJNYXAiLCJPYmplY3QiLCJlbnRyaWVzIiwibW9kaWZpZWQiLCJ0aGlzVXNlcklkIiwia2V5cyIsInJvb21MaXN0IiwiZ2V0IiwiaW5kZXhPZlJvb20iLCJpbmRleE9mIiwic3BsaWNlIiwicHVzaCIsInNldCIsInNldEFjY291bnREYXRhIiwiZnJvbUVudHJpZXMiLCJteVVzZXJJZCIsIm9sZGVzdFRzIiwib2xkZXN0VXNlciIsInVzZXIiLCJnZXRKb2luZWRNZW1iZXJzIiwidW5kZWZpbmVkIiwiZXZlbnRzIiwibWVtYmVyIiwiZ2V0VHMiLCJjdXJyZW50U3RhdGUiLCJnZXRNZW1iZXJzIl0sInNvdXJjZXMiOlsiLi4vc3JjL1Jvb21zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE1LTIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgUm9vbSwgRXZlbnRUeXBlLCBSb29tTWVtYmVyLCBNYXRyaXhDbGllbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCBBbGlhc0N1c3RvbWlzYXRpb25zIGZyb20gXCIuL2N1c3RvbWlzYXRpb25zL0FsaWFzXCI7XG5cbi8qKlxuICogR2l2ZW4gYSByb29tIG9iamVjdCwgcmV0dXJuIHRoZSBhbGlhcyB3ZSBzaG91bGQgdXNlIGZvciBpdCxcbiAqIGlmIGFueS4gVGhpcyBjb3VsZCBiZSB0aGUgY2Fub25pY2FsIGFsaWFzIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZVxuICogYW4gYWxpYXMgc2VsZWN0ZWQgYXJiaXRyYXJpbHkgYnV0IGRldGVybWluaXN0aWNhbGx5IGZyb20gdGhlIGxpc3RcbiAqIG9mIGFsaWFzZXMuIE90aGVyd2lzZSByZXR1cm4gbnVsbDtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcm9vbSBUaGUgcm9vbSBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgZGlzcGxheSBhbGlhcyBmb3IgdGhlIGdpdmVuIHJvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3BsYXlBbGlhc0ZvclJvb20ocm9vbTogUm9vbSk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBnZXREaXNwbGF5QWxpYXNGb3JBbGlhc1NldChyb29tLmdldENhbm9uaWNhbEFsaWFzKCksIHJvb20uZ2V0QWx0QWxpYXNlcygpKTtcbn1cblxuLy8gVGhlIHZhcmlvdXMgZGlzcGxheSBhbGlhcyBnZXR0ZXJzIHNob3VsZCBhbGwgZmVlZCB0aHJvdWdoIHRoaXMgb25lIHBhdGggc29cbi8vIHRoZXJlJ3MgYSBzaW5nbGUgcGxhY2UgdG8gY2hhbmdlIHRoZSBsb2dpYy5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwbGF5QWxpYXNGb3JBbGlhc1NldChjYW5vbmljYWxBbGlhczogc3RyaW5nIHwgbnVsbCwgYWx0QWxpYXNlczogc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoQWxpYXNDdXN0b21pc2F0aW9ucy5nZXREaXNwbGF5QWxpYXNGb3JBbGlhc1NldCkge1xuICAgICAgICByZXR1cm4gQWxpYXNDdXN0b21pc2F0aW9ucy5nZXREaXNwbGF5QWxpYXNGb3JBbGlhc1NldChjYW5vbmljYWxBbGlhcywgYWx0QWxpYXNlcyk7XG4gICAgfVxuICAgIHJldHVybiAoY2Fub25pY2FsQWxpYXMgfHwgYWx0QWxpYXNlcz8uWzBdKSA/PyBcIlwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3Vlc3NBbmRTZXRETVJvb20ocm9vbTogUm9vbSwgaXNEaXJlY3Q6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbmV3VGFyZ2V0O1xuICAgIGlmIChpc0RpcmVjdCkge1xuICAgICAgICBjb25zdCBndWVzc2VkVXNlcklkID0gZ3Vlc3NETVJvb21UYXJnZXRJZChyb29tLCByb29tLmNsaWVudC5nZXRTYWZlVXNlcklkKCkpO1xuICAgICAgICBuZXdUYXJnZXQgPSBndWVzc2VkVXNlcklkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1RhcmdldCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldERNUm9vbShyb29tLmNsaWVudCwgcm9vbS5yb29tSWQsIG5ld1RhcmdldCk7XG59XG5cbi8qKlxuICogTWFya3Mgb3IgdW5tYXJrcyB0aGUgZ2l2ZW4gcm9vbSBhcyBiZWluZyBhcyBhIERNIHJvb20uXG4gKiBAcGFyYW0gY2xpZW50IHRoZSBNYXRyaXggQ2xpZW50IGluc3RhbmNlIG9mIHRoZSBsb2dnZWQtaW4gdXNlclxuICogQHBhcmFtIHtzdHJpbmd9IHJvb21JZCBUaGUgSUQgb2YgdGhlIHJvb20gdG8gbW9kaWZ5XG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHVzZXJJZCBUaGUgdXNlciBJRCBvZiB0aGUgZGVzaXJlZCBETSByb29tIHRhcmdldCB1c2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgdG8gdW4tbWFyayB0aGlzIHJvb20gYXMgYSBETSByb29tXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBBIHByb21pc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldERNUm9vbShjbGllbnQ6IE1hdHJpeENsaWVudCwgcm9vbUlkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjbGllbnQuaXNHdWVzdCgpKSByZXR1cm47XG5cbiAgICBjb25zdCBtRGlyZWN0RXZlbnQgPSBjbGllbnQuZ2V0QWNjb3VudERhdGEoRXZlbnRUeXBlLkRpcmVjdCk7XG4gICAgY29uc3QgY3VycmVudENvbnRlbnQgPSBtRGlyZWN0RXZlbnQ/LmdldENvbnRlbnQoKSB8fCB7fTtcblxuICAgIGNvbnN0IGRtUm9vbU1hcCA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY3VycmVudENvbnRlbnQpKTtcbiAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcblxuICAgIC8vIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0cyBvZiBhbnkgb3RoZXJzIHVzZXJzXG4gICAgLy8gKGl0IGNhbiBvbmx5IGJlIGEgRE0gcm9vbSBmb3Igb25lIHBlcnNvbilcbiAgICBmb3IgKGNvbnN0IHRoaXNVc2VySWQgb2YgZG1Sb29tTWFwLmtleXMoKSkge1xuICAgICAgICBjb25zdCByb29tTGlzdCA9IGRtUm9vbU1hcC5nZXQodGhpc1VzZXJJZCkgfHwgW107XG5cbiAgICAgICAgaWYgKHRoaXNVc2VySWQgIT0gdXNlcklkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleE9mUm9vbSA9IHJvb21MaXN0LmluZGV4T2Yocm9vbUlkKTtcbiAgICAgICAgICAgIGlmIChpbmRleE9mUm9vbSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcm9vbUxpc3Quc3BsaWNlKGluZGV4T2ZSb29tLCAxKTtcbiAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBub3cgYWRkIGl0LCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlXG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgICBjb25zdCByb29tTGlzdCA9IGRtUm9vbU1hcC5nZXQodXNlcklkKSB8fCBbXTtcbiAgICAgICAgaWYgKHJvb21MaXN0LmluZGV4T2Yocm9vbUlkKSA9PSAtMSkge1xuICAgICAgICAgICAgcm9vbUxpc3QucHVzaChyb29tSWQpO1xuICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGRtUm9vbU1hcC5zZXQodXNlcklkLCByb29tTGlzdCk7XG4gICAgfVxuXG4gICAgLy8gcHJldmVudCB1bm5lY2Vzc2FyeSBjYWxscyB0byBzZXRBY2NvdW50RGF0YVxuICAgIGlmICghbW9kaWZpZWQpIHJldHVybjtcblxuICAgIGF3YWl0IGNsaWVudC5zZXRBY2NvdW50RGF0YShFdmVudFR5cGUuRGlyZWN0LCBPYmplY3QuZnJvbUVudHJpZXMoZG1Sb29tTWFwKSk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSByb29tLCBlc3RpbWF0ZSB3aGljaCBvZiBpdHMgbWVtYmVycyBpcyBsaWtlbHkgdG9cbiAqIGJlIHRoZSB0YXJnZXQgaWYgdGhlIHJvb20gd2VyZSBhIERNIHJvb20gYW5kIHJldHVybiB0aGF0IHVzZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJvb20gVGFyZ2V0IHJvb21cbiAqIEBwYXJhbSB7c3RyaW5nfSBteVVzZXJJZCBVc2VyIElEIG9mIHRoZSBjdXJyZW50IHVzZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVzZXIgSUQgb2YgdGhlIHVzZXIgdGhhdCB0aGUgcm9vbSBpcyBwcm9iYWJseSBhIERNIHdpdGhcbiAqL1xuZnVuY3Rpb24gZ3Vlc3NETVJvb21UYXJnZXRJZChyb29tOiBSb29tLCBteVVzZXJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgb2xkZXN0VHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgb2xkZXN0VXNlcjogUm9vbU1lbWJlciB8IHVuZGVmaW5lZDtcblxuICAgIC8vIFBpY2sgdGhlIGpvaW5lZCB1c2VyIHdobydzIGJlZW4gaGVyZSBsb25nZXN0IChhbmQgaXNuJ3QgdXMpLFxuICAgIGZvciAoY29uc3QgdXNlciBvZiByb29tLmdldEpvaW5lZE1lbWJlcnMoKSkge1xuICAgICAgICBpZiAodXNlci51c2VySWQgPT0gbXlVc2VySWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChvbGRlc3RUcyA9PT0gdW5kZWZpbmVkIHx8ICh1c2VyLmV2ZW50cy5tZW1iZXIgJiYgdXNlci5ldmVudHMubWVtYmVyLmdldFRzKCkgPCBvbGRlc3RUcykpIHtcbiAgICAgICAgICAgIG9sZGVzdFVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgb2xkZXN0VHMgPSB1c2VyLmV2ZW50cy5tZW1iZXI/LmdldFRzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9sZGVzdFVzZXIpIHJldHVybiBvbGRlc3RVc2VyLnVzZXJJZDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBqb2luZWQgbWVtYmVycyBvdGhlciB0aGFuIHVzLCB1c2UgdGhlIG9sZGVzdCBtZW1iZXJcbiAgICBmb3IgKGNvbnN0IHVzZXIgb2Ygcm9vbS5jdXJyZW50U3RhdGUuZ2V0TWVtYmVycygpKSB7XG4gICAgICAgIGlmICh1c2VyLnVzZXJJZCA9PSBteVVzZXJJZCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKG9sZGVzdFRzID09PSB1bmRlZmluZWQgfHwgKHVzZXIuZXZlbnRzLm1lbWJlciAmJiB1c2VyLmV2ZW50cy5tZW1iZXIuZ2V0VHMoKSA8IG9sZGVzdFRzKSkge1xuICAgICAgICAgICAgb2xkZXN0VXNlciA9IHVzZXI7XG4gICAgICAgICAgICBvbGRlc3RUcyA9IHVzZXIuZXZlbnRzLm1lbWJlcj8uZ2V0VHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRlc3RVc2VyID09PSB1bmRlZmluZWQpIHJldHVybiBteVVzZXJJZDtcbiAgICByZXR1cm4gb2xkZXN0VXNlci51c2VySWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFRQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxzQkFBc0JBLENBQUNDLElBQVUsRUFBaUI7RUFDOUQsT0FBT0MsMEJBQTBCLENBQUNELElBQUksQ0FBQ0UsaUJBQWlCLENBQUMsQ0FBQyxFQUFFRixJQUFJLENBQUNHLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDckY7O0FBRUE7QUFDQTtBQUNPLFNBQVNGLDBCQUEwQkEsQ0FBQ0csY0FBNkIsRUFBRUMsVUFBb0IsRUFBaUI7RUFDM0csSUFBSUMsY0FBbUIsQ0FBQ0wsMEJBQTBCLEVBQUU7SUFDaEQsT0FBT0ssY0FBbUIsQ0FBQ0wsMEJBQTBCLENBQUNHLGNBQWMsRUFBRUMsVUFBVSxDQUFDO0VBQ3JGO0VBQ0EsT0FBTyxDQUFDRCxjQUFjLElBQUlDLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFO0FBQ3BEO0FBRU8sU0FBU0UsaUJBQWlCQSxDQUFDUCxJQUFVLEVBQUVRLFFBQWlCLEVBQWlCO0VBQzVFLElBQUlDLFNBQVM7RUFDYixJQUFJRCxRQUFRLEVBQUU7SUFDVixNQUFNRSxhQUFhLEdBQUdDLG1CQUFtQixDQUFDWCxJQUFJLEVBQUVBLElBQUksQ0FBQ1ksTUFBTSxDQUFDQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzVFSixTQUFTLEdBQUdDLGFBQWE7RUFDN0IsQ0FBQyxNQUFN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