1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-06 12:02:40 +03:00

Refactor terminal app; add /invite and /roominfo.

This commit is contained in:
Kegan Dougal
2015-06-23 15:22:57 +01:00
parent 57914969b8
commit 07d3f43d8b
3 changed files with 160 additions and 77 deletions

View File

@@ -3,6 +3,7 @@
var myUserId = "@example:localhost"; var myUserId = "@example:localhost";
var myAccessToken = "QGV4YW1wbGU6bG9jYWxob3N0.qPEvLuYfNBjxikiCjP"; var myAccessToken = "QGV4YW1wbGU6bG9jYWxob3N0.qPEvLuYfNBjxikiCjP";
var sdk = require("matrix-js-sdk"); var sdk = require("matrix-js-sdk");
var clc = require("cli-color");
var matrixClient = sdk.createClient({ var matrixClient = sdk.createClient({
baseUrl: "http://localhost:8008", baseUrl: "http://localhost:8008",
accessToken: myAccessToken, accessToken: myAccessToken,
@@ -28,68 +29,91 @@ rl.on('line', function(line) {
rl.prompt(); rl.prompt();
return; return;
} }
if (line.indexOf("/join ") === 0 && !viewingRoom) { if (line === "/help") {
var roomIndex = line.split(" ")[1]; printHelp();
viewingRoom = roomList[roomIndex]; rl.prompt();
if (viewingRoom.getMember(myUserId).membership === "invite") { return;
// join the room first }
matrixClient.joinRoom(viewingRoom.roomId).done(function(room) {
roomList = matrixClient.getRooms(); if (viewingRoom) {
viewingRoom = room; if (line === "/exit") {
viewingRoom = null;
printRoomList();
}
else if (line === "/members") {
printMemberList(viewingRoom);
}
else if (line === "/roominfo") {
printRoomInfo(viewingRoom);
}
else if (line === "/resend") {
// get the oldest not sent event.
var notSentEvent;
for (var i = 0; i < viewingRoom.timeline.length; i++) {
if (viewingRoom.timeline[i].status == sdk.EventStatus.NOT_SENT) {
notSentEvent = viewingRoom.timeline[i];
break;
}
}
if (notSentEvent) {
matrixClient.resendEvent(notSentEvent, viewingRoom).done(function() {
printMessages();
rl.prompt();
}, function(err) {
printMessages();
print("/resend Error: %s", err);
rl.prompt();
});
printMessages();
rl.prompt();
}
}
else if (line.indexOf("/more ") === 0) {
var amount = parseInt(line.split(" ")[1]) || 20;
matrixClient.scrollback(viewingRoom, amount).done(function(room) {
printMessages(); printMessages();
rl.prompt(); rl.prompt();
}, function(err) { }, function(err) {
console.log("/join Error: %s", err); print("/more Error: %s", err);
});
}
else if (line.indexOf("/invite ") === 0) {
var userId = line.split(" ")[1].trim();
matrixClient.invite(viewingRoom.roomId, userId).done(function() {
printMessages();
rl.prompt();
}, function(err) {
print("/invite Error: %s", err);
}); });
} }
else { else {
printMessages(); matrixClient.sendTextMessage(viewingRoom.roomId, line).finally(function() {
}
}
else if (line === "/exit" && viewingRoom) {
viewingRoom = null;
printRoomList();
}
else if (line === "/members" && viewingRoom) {
printMemberList();
}
else if (line === "/resend" && viewingRoom) {
// get the oldest not sent event.
var notSentEvent;
for (var i = 0; i < viewingRoom.timeline.length; i++) {
if (viewingRoom.timeline[i].status == sdk.EventStatus.NOT_SENT) {
notSentEvent = viewingRoom.timeline[i];
break;
}
}
if (notSentEvent) {
matrixClient.resendEvent(notSentEvent, viewingRoom).done(function() {
printMessages(); printMessages();
rl.prompt(); rl.prompt();
}, function(err) {
console.log("/resend Error: %s", err);
}); });
// print local echo immediately
printMessages();
} }
} }
else if (line.indexOf("/more ") === 0 && viewingRoom) { else {
var amount = parseInt(line.split(" ")[1]) || 20; if (line.indexOf("/join ") === 0) {
matrixClient.scrollback(viewingRoom, amount).done(function(room) { var roomIndex = line.split(" ")[1];
printMessages(); viewingRoom = roomList[roomIndex];
rl.prompt(); if (viewingRoom.getMember(myUserId).membership === "invite") {
}, function(err) { // join the room first
console.log("/more Error: %s", err); matrixClient.joinRoom(viewingRoom.roomId).done(function(room) {
}); roomList = matrixClient.getRooms();
} viewingRoom = room;
else if (line === "/help") { printMessages();
printHelp(); rl.prompt();
} }, function(err) {
else if (viewingRoom) { print("/join Error: %s", err);
matrixClient.sendTextMessage(viewingRoom.roomId, line).finally(function() { });
printMessages(); }
rl.prompt(); else {
}); printMessages();
// print local echo immediately }
printMessages(); }
} }
rl.prompt(); rl.prompt();
}); });
@@ -123,9 +147,9 @@ matrixClient.on("Room.timeline", function(event, room, toStartOfTimeline) {
}); });
function printRoomList() { function printRoomList() {
console.log("Room List:"); print("Room List:");
for (var i = 0; i < roomList.length; i++) { for (var i = 0; i < roomList.length; i++) {
console.log( print(
"[%s] %s (%s members)", "[%s] %s (%s members)",
i, roomList[i].name, roomList[i].getJoinedMembers().length i, roomList[i].name, roomList[i].getJoinedMembers().length
); );
@@ -133,20 +157,23 @@ function printRoomList() {
} }
function printHelp() { function printHelp() {
console.log("Global commands:"); var hlp = clc.italic;
console.log(" '/help' : Show this help."); print("Global commands:", hlp);
console.log("Room list index commands:"); print(" '/help' : Show this help.");
console.log(" '/join <index>' Join a room, e.g. '/join 5'"); print("Room list index commands:", hlp);
console.log("Room commands:"); print(" '/join <index>' Join a room, e.g. '/join 5'");
console.log(" '/exit' Return to the room list index."); print("Room commands:", hlp);
console.log(" '/members' Show the room member list."); print(" '/exit' Return to the room list index.");
console.log(" '/more 15' Scrollback 15 events"); print(" '/members' Show the room member list.");
console.log(" '/resend' Resend the oldest event which failed to send."); print(" '/invite @foo:bar' Invite @foo:bar to the room.");
print(" '/more 15' Scrollback 15 events");
print(" '/resend' Resend the oldest event which failed to send.");
print(" '/roominfo' Display room info e.g. name, topic.");
} }
function completer(line) { function completer(line) {
var completions = [ var completions = [
"/help", "/join ", "/exit", "/members", "/more ", "/resend" "/help", "/join ", "/exit", "/members", "/more ", "/resend", "/invite"
]; ];
var hits = completions.filter(function(c) { return c.indexOf(line) == 0 }); var hits = completions.filter(function(c) { return c.indexOf(line) == 0 });
// show all completions if none found // show all completions if none found
@@ -158,19 +185,15 @@ function printMessages() {
printRoomList(); printRoomList();
return; return;
} }
console.log(CLEAR_CONSOLE); print(CLEAR_CONSOLE);
var mostRecentMessages = viewingRoom.timeline; var mostRecentMessages = viewingRoom.timeline;
for (var i = 0; i < mostRecentMessages.length; i++) { for (var i = 0; i < mostRecentMessages.length; i++) {
printLine(mostRecentMessages[i]); printLine(mostRecentMessages[i]);
} }
} }
function printMemberList() { function printMemberList(room) {
if (!viewingRoom) { var members = room.currentState.getMembers();
printRoomList();
return;
}
var members = viewingRoom.currentState.getMembers();
// sorted based on name. // sorted based on name.
members.sort(function(a, b) { members.sort(function(a, b) {
if (a.name > b.name) { if (a.name > b.name) {
@@ -181,23 +204,54 @@ function printMemberList() {
} }
return 0; return 0;
}); });
console.log("Membership list for room \"%s\"", viewingRoom.name); print("Membership list for room \"%s\"", room.name);
console.log(new Array(viewingRoom.name.length + 28).join("-")); print(new Array(room.name.length + 28).join("-"));
viewingRoom.currentState.getMembers().forEach(function(member) { room.currentState.getMembers().forEach(function(member) {
if (!member.membership) { if (!member.membership) {
return; return;
} }
var membershipWithPadding = ( var membershipWithPadding = (
member.membership + new Array(10 - member.membership.length).join(" ") member.membership + new Array(10 - member.membership.length).join(" ")
); );
console.log( print(
"%s :: %s (%s)", membershipWithPadding, member.name, "%s :: %s (%s)", membershipWithPadding, member.name,
(member.userId === myUserId ? "Me" : member.userId) (member.userId === myUserId ? "Me" : member.userId)
); );
}); });
} }
function printRoomInfo(room) {
var eventDict = room.currentState.events;
var eTypeHeader = " Event Type(state_key) ";
var sendHeader = " Sender ";
// pad content to 100
var restCount = (
100 - "Content".length - " | ".length - " | ".length -
eTypeHeader.length - sendHeader.length
);
var padSide = new Array(Math.floor(restCount/2)).join(" ");
var contentHeader = padSide + "Content" + padSide;
print(eTypeHeader+sendHeader+contentHeader);
print(new Array(100).join("-"));
Object.keys(eventDict).forEach(function(eventType) {
if (eventType === "m.room.member") { return; } // use /members instead.
Object.keys(eventDict[eventType]).forEach(function(stateKey) {
var typeAndKey = eventType + (
stateKey.length > 0 ? "("+stateKey+")" : ""
);
var typeStr = fixWidth(typeAndKey, eTypeHeader.length);
var event = eventDict[eventType][stateKey];
var sendStr = fixWidth(event.getSender(), sendHeader.length);
var contentStr = fixWidth(
JSON.stringify(event.getContent()), contentHeader.length
);
print(typeStr+" | "+sendStr+" | "+contentStr);
});
})
}
function printLine(event) { function printLine(event) {
var fmt;
var name = event.sender ? event.sender.name : event.getSender(); var name = event.sender ? event.sender.name : event.getSender();
var time = new Date( var time = new Date(
event.getTs() event.getTs()
@@ -208,9 +262,11 @@ function printLine(event) {
separator = ">>>"; separator = ">>>";
if (event.status === sdk.EventStatus.SENDING) { if (event.status === sdk.EventStatus.SENDING) {
separator = "..."; separator = "...";
fmt = clc.xterm(8);
} }
else if (event.status === sdk.EventStatus.NOT_SENT) { else if (event.status === sdk.EventStatus.NOT_SENT) {
separator = " x "; separator = " x ";
fmt = clc.redBright;
} }
} }
var body = ""; var body = "";
@@ -240,7 +296,32 @@ function printLine(event) {
); );
separator = "---"; separator = "---";
} }
console.log("[%s] %s %s %s", time, name, separator, body); if (fmt) {
print(
"[%s] %s %s %s", fmt(time), fmt(name), fmt(separator), fmt(body)
);
}
else {
print("[%s] %s %s %s", time, name, separator, body);
}
}
function print(str, formatter) {
if (arguments.length == 2 && typeof arguments[1] === "function") {
console.log(arguments[1](str));
return;
}
console.log.apply(console.log, arguments);
}
function fixWidth(str, len) {
if (str.length > len) {
return str.substr(0, len-2) + "\u2026";
}
else if (str.length < len) {
return str + new Array(len - str.length).join(" ");
}
return str;
} }
matrixClient.startClient(numMessagesToShow); // messages for each room. matrixClient.startClient(numMessagesToShow); // messages for each room.

View File

@@ -7,5 +7,8 @@
"preinstall": "npm install ../.." "preinstall": "npm install ../.."
}, },
"author": "", "author": "",
"license": "Apache 2.0" "license": "Apache 2.0",
"dependencies": {
"cli-color": "^1.0.0"
}
} }

View File

@@ -348,7 +348,6 @@ function _sendEventHttpRequest(client, event) {
$stateKey: event.getStateKey(), $stateKey: event.getStateKey(),
$txnId: event._txnId ? event._txnId : new Date().getTime() $txnId: event._txnId ? event._txnId : new Date().getTime()
}; };
console.log("_txnId = %s", event._txnId);
var path; var path;