1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-07-31 15:24:23 +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 myAccessToken = "QGV4YW1wbGU6bG9jYWxob3N0.qPEvLuYfNBjxikiCjP";
var sdk = require("matrix-js-sdk");
var clc = require("cli-color");
var matrixClient = sdk.createClient({
baseUrl: "http://localhost:8008",
accessToken: myAccessToken,
@ -28,68 +29,91 @@ rl.on('line', function(line) {
rl.prompt();
return;
}
if (line.indexOf("/join ") === 0 && !viewingRoom) {
var roomIndex = line.split(" ")[1];
viewingRoom = roomList[roomIndex];
if (viewingRoom.getMember(myUserId).membership === "invite") {
// join the room first
matrixClient.joinRoom(viewingRoom.roomId).done(function(room) {
roomList = matrixClient.getRooms();
viewingRoom = room;
if (line === "/help") {
printHelp();
rl.prompt();
return;
}
if (viewingRoom) {
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();
rl.prompt();
}, 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 {
printMessages();
}
}
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() {
matrixClient.sendTextMessage(viewingRoom.roomId, line).finally(function() {
printMessages();
rl.prompt();
}, function(err) {
console.log("/resend Error: %s", err);
});
// print local echo immediately
printMessages();
}
}
else if (line.indexOf("/more ") === 0 && viewingRoom) {
var amount = parseInt(line.split(" ")[1]) || 20;
matrixClient.scrollback(viewingRoom, amount).done(function(room) {
printMessages();
rl.prompt();
}, function(err) {
console.log("/more Error: %s", err);
});
}
else if (line === "/help") {
printHelp();
}
else if (viewingRoom) {
matrixClient.sendTextMessage(viewingRoom.roomId, line).finally(function() {
printMessages();
rl.prompt();
});
// print local echo immediately
printMessages();
else {
if (line.indexOf("/join ") === 0) {
var roomIndex = line.split(" ")[1];
viewingRoom = roomList[roomIndex];
if (viewingRoom.getMember(myUserId).membership === "invite") {
// join the room first
matrixClient.joinRoom(viewingRoom.roomId).done(function(room) {
roomList = matrixClient.getRooms();
viewingRoom = room;
printMessages();
rl.prompt();
}, function(err) {
print("/join Error: %s", err);
});
}
else {
printMessages();
}
}
}
rl.prompt();
});
@ -123,9 +147,9 @@ matrixClient.on("Room.timeline", function(event, room, toStartOfTimeline) {
});
function printRoomList() {
console.log("Room List:");
print("Room List:");
for (var i = 0; i < roomList.length; i++) {
console.log(
print(
"[%s] %s (%s members)",
i, roomList[i].name, roomList[i].getJoinedMembers().length
);
@ -133,20 +157,23 @@ function printRoomList() {
}
function printHelp() {
console.log("Global commands:");
console.log(" '/help' : Show this help.");
console.log("Room list index commands:");
console.log(" '/join <index>' Join a room, e.g. '/join 5'");
console.log("Room commands:");
console.log(" '/exit' Return to the room list index.");
console.log(" '/members' Show the room member list.");
console.log(" '/more 15' Scrollback 15 events");
console.log(" '/resend' Resend the oldest event which failed to send.");
var hlp = clc.italic;
print("Global commands:", hlp);
print(" '/help' : Show this help.");
print("Room list index commands:", hlp);
print(" '/join <index>' Join a room, e.g. '/join 5'");
print("Room commands:", hlp);
print(" '/exit' Return to the room list index.");
print(" '/members' Show the room member list.");
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) {
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 });
// show all completions if none found
@ -158,19 +185,15 @@ function printMessages() {
printRoomList();
return;
}
console.log(CLEAR_CONSOLE);
print(CLEAR_CONSOLE);
var mostRecentMessages = viewingRoom.timeline;
for (var i = 0; i < mostRecentMessages.length; i++) {
printLine(mostRecentMessages[i]);
}
}
function printMemberList() {
if (!viewingRoom) {
printRoomList();
return;
}
var members = viewingRoom.currentState.getMembers();
function printMemberList(room) {
var members = room.currentState.getMembers();
// sorted based on name.
members.sort(function(a, b) {
if (a.name > b.name) {
@ -181,23 +204,54 @@ function printMemberList() {
}
return 0;
});
console.log("Membership list for room \"%s\"", viewingRoom.name);
console.log(new Array(viewingRoom.name.length + 28).join("-"));
viewingRoom.currentState.getMembers().forEach(function(member) {
print("Membership list for room \"%s\"", room.name);
print(new Array(room.name.length + 28).join("-"));
room.currentState.getMembers().forEach(function(member) {
if (!member.membership) {
return;
}
var membershipWithPadding = (
member.membership + new Array(10 - member.membership.length).join(" ")
);
console.log(
print(
"%s :: %s (%s)", membershipWithPadding, member.name,
(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) {
var fmt;
var name = event.sender ? event.sender.name : event.getSender();
var time = new Date(
event.getTs()
@ -208,9 +262,11 @@ function printLine(event) {
separator = ">>>";
if (event.status === sdk.EventStatus.SENDING) {
separator = "...";
fmt = clc.xterm(8);
}
else if (event.status === sdk.EventStatus.NOT_SENT) {
separator = " x ";
fmt = clc.redBright;
}
}
var body = "";
@ -240,7 +296,32 @@ function printLine(event) {
);
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.