You've already forked matrix-js-sdk
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:
@ -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.
|
Reference in New Issue
Block a user