mirror of
https://github.com/element-hq/element-web
synced 2024-11-23 09:46:09 +03:00
Merge pull request #2272 from matrix-org/travis/goto-command
Support room IDs and event permalinks in the join command
This commit is contained in:
commit
4f6a6df833
1 changed files with 78 additions and 4 deletions
|
@ -24,6 +24,8 @@ import sdk from './index';
|
||||||
import {_t, _td} from './languageHandler';
|
import {_t, _td} from './languageHandler';
|
||||||
import Modal from './Modal';
|
import Modal from './Modal';
|
||||||
import SettingsStore, {SettingLevel} from './settings/SettingsStore';
|
import SettingsStore, {SettingLevel} from './settings/SettingsStore';
|
||||||
|
import {MATRIXTO_URL_PATTERN} from "./linkify-matrix";
|
||||||
|
import * as querystring from "querystring";
|
||||||
|
|
||||||
|
|
||||||
class Command {
|
class Command {
|
||||||
|
@ -153,11 +155,24 @@ export const CommandMap = {
|
||||||
description: _td('Joins room with given alias'),
|
description: _td('Joins room with given alias'),
|
||||||
runFn: function(roomId, args) {
|
runFn: function(roomId, args) {
|
||||||
if (args) {
|
if (args) {
|
||||||
const matches = args.match(/^(\S+)$/);
|
// Note: we support 2 versions of this command. The first is
|
||||||
if (matches) {
|
// the public-facing one for most users and the other is a
|
||||||
let roomAlias = matches[1];
|
// power-user edition where someone may join via permalink or
|
||||||
if (roomAlias[0] !== '#') return reject(this.getUsage());
|
// room ID with optional servers. Practically, this results
|
||||||
|
// in the following variations:
|
||||||
|
// /join #example:example.org
|
||||||
|
// /join !example:example.org
|
||||||
|
// /join !example:example.org altserver.com elsewhere.ca
|
||||||
|
// /join https://matrix.to/#/!example:example.org?via=altserver.com
|
||||||
|
// The command also supports event permalinks transparently:
|
||||||
|
// /join https://matrix.to/#/!example:example.org/$something:example.org
|
||||||
|
// /join https://matrix.to/#/!example:example.org/$something:example.org?via=altserver.com
|
||||||
|
const params = args.split(' ');
|
||||||
|
if (params.length < 1) return reject(this.getUsage());
|
||||||
|
|
||||||
|
const matrixToMatches = params[0].match(MATRIXTO_URL_PATTERN);
|
||||||
|
if (params[0][0] === '#') {
|
||||||
|
let roomAlias = params[0];
|
||||||
if (!roomAlias.includes(':')) {
|
if (!roomAlias.includes(':')) {
|
||||||
roomAlias += ':' + MatrixClientPeg.get().getDomain();
|
roomAlias += ':' + MatrixClientPeg.get().getDomain();
|
||||||
}
|
}
|
||||||
|
@ -167,7 +182,65 @@ export const CommandMap = {
|
||||||
room_alias: roomAlias,
|
room_alias: roomAlias,
|
||||||
auto_join: true,
|
auto_join: true,
|
||||||
});
|
});
|
||||||
|
return success();
|
||||||
|
} else if (params[0][0] === '!') {
|
||||||
|
const roomId = params[0];
|
||||||
|
const viaServers = params.splice(0);
|
||||||
|
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'view_room',
|
||||||
|
room_id: roomId,
|
||||||
|
opts: {
|
||||||
|
// These are passed down to the js-sdk's /join call
|
||||||
|
server_name: viaServers,
|
||||||
|
},
|
||||||
|
auto_join: true,
|
||||||
|
});
|
||||||
|
return success();
|
||||||
|
} else if (matrixToMatches) {
|
||||||
|
let entity = matrixToMatches[1];
|
||||||
|
let eventId = null;
|
||||||
|
let viaServers = [];
|
||||||
|
|
||||||
|
if (entity[0] !== '!' && entity[0] !== '#') return reject(this.getUsage());
|
||||||
|
|
||||||
|
if (entity.indexOf('?') !== -1) {
|
||||||
|
const parts = entity.split('?');
|
||||||
|
entity = parts[0];
|
||||||
|
|
||||||
|
const parsed = querystring.parse(parts[1]);
|
||||||
|
viaServers = parsed["via"];
|
||||||
|
if (typeof viaServers === 'string') viaServers = [viaServers];
|
||||||
|
}
|
||||||
|
|
||||||
|
// We quietly support event ID permalinks too
|
||||||
|
if (entity.indexOf('/$') !== -1) {
|
||||||
|
const parts = entity.split("/$");
|
||||||
|
entity = parts[0];
|
||||||
|
eventId = `$${parts[1]}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dispatch = {
|
||||||
|
action: 'view_room',
|
||||||
|
auto_join: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (entity[0] === '!') dispatch["room_id"] = entity;
|
||||||
|
else dispatch["room_alias"] = entity;
|
||||||
|
|
||||||
|
if (eventId) {
|
||||||
|
dispatch["event_id"] = eventId;
|
||||||
|
dispatch["highlighted"] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viaServers) {
|
||||||
|
dispatch["opts"] = {
|
||||||
|
// These are passed down to the js-sdk's /join call
|
||||||
|
server_name: viaServers,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
dis.dispatch(dispatch);
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -492,6 +565,7 @@ export const CommandMap = {
|
||||||
const aliases = {
|
const aliases = {
|
||||||
j: "join",
|
j: "join",
|
||||||
newballsplease: "discardsession",
|
newballsplease: "discardsession",
|
||||||
|
goto: "join", // because it handles event permalinks magically
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue