diff --git a/examples/node/app.js b/examples/node/app.js index e6f4a34fc..67e50cb10 100644 --- a/examples/node/app.js +++ b/examples/node/app.js @@ -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 ' 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 ' 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. \ No newline at end of file diff --git a/examples/node/package.json b/examples/node/package.json index 67ae8d550..6319e367d 100644 --- a/examples/node/package.json +++ b/examples/node/package.json @@ -7,5 +7,8 @@ "preinstall": "npm install ../.." }, "author": "", - "license": "Apache 2.0" + "license": "Apache 2.0", + "dependencies": { + "cli-color": "^1.0.0" + } } diff --git a/lib/client.js b/lib/client.js index 79c55234f..ab28ce4b7 100644 --- a/lib/client.js +++ b/lib/client.js @@ -348,7 +348,6 @@ function _sendEventHttpRequest(client, event) { $stateKey: event.getStateKey(), $txnId: event._txnId ? event._txnId : new Date().getTime() }; - console.log("_txnId = %s", event._txnId); var path;