1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-06 12:02:40 +03:00
Files
matrix-js-sdk/examples/node/app.js
2015-06-12 16:26:44 +01:00

183 lines
5.2 KiB
JavaScript

"use strict";
var myUserId = "@example:localhost";
var myAccessToken = "QGV4YW1wbGU6bG9jYWxob3N0.qPEvLuYfNBjxikiCjP";
var sdk = require("matrix-js-sdk");
var matrixClient = sdk.createClient({
baseUrl: "http://localhost:8008",
accessToken: myAccessToken,
userId: myUserId
});
// Data structures
var roomList = [];
var viewingRoom = null;
var numMessagesToShow = 20;
// Reading from stdin
var readline = require("readline");
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
rl.on('line', function(line) {
if (line.indexOf("/enter ") === 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() {
printMessages();
}, function(err) {
console.log("Error: %s", err);
});
}
else {
printMessages();
}
}
else if (line === "/exit" && viewingRoom) {
viewingRoom = null;
printRoomList();
}
else if (line === "/members" && viewingRoom) {
printMemberList();
}
else if (line === "/help") {
printHelp();
}
else if (viewingRoom) {
matrixClient.sendTextMessage(viewingRoom.roomId, line).done(function() {
console.log('\x1B[2J'); // clear console
printMessages();
}, function(err) {
console.log("Error: %s", err);
});
}
});
// ==== END User input
// show the room list after syncing.
matrixClient.on("syncComplete", function() {
roomList = matrixClient.getRooms();
printRoomList();
printHelp();
});
// print incoming messages.
matrixClient.on("Room.timeline", function(event, room, toStartOfTimeline) {
if (toStartOfTimeline) {
return; // don't print paginated results
}
if (!viewingRoom || viewingRoom.roomId !== room.roomId) {
return; // not viewing a room or viewing the wrong room.
}
printLine(event);
});
function printRoomList() {
console.log("Room List:");
for (var i = 0; i < roomList.length; i++) {
console.log(
"[%s] %s (%s members)",
i, roomList[i].name, roomList[i].getJoinedMembers().length
);
}
}
function printHelp() {
console.log("Global commands:");
console.log(" '/help' : Show this help.");
console.log("Room list index commands:");
console.log(" '/enter <index>' Enter a room, e.g. '/enter 5'");
console.log("Room commands:");
console.log(" '/exit' Return to the room list index.");
console.log(" '/members' Show the room member list.");
}
function printMessages() {
if (!viewingRoom) {
printRoomList();
return;
}
console.log('\x1B[2J'); // clear console
var mostRecentMessages = viewingRoom.timeline.slice(numMessagesToShow * -1);
for (var i = 0; i < mostRecentMessages.length; i++) {
printLine(mostRecentMessages[i]);
}
}
function printMemberList() {
if (!viewingRoom) {
printRoomList();
return;
}
var members = viewingRoom.currentState.getMembers();
// sorted based on name.
members.sort(function(a, b) {
if (a.name > b.name) {
return -1;
}
if (a.name < b.name) {
return 1;
}
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) {
if (!member.membership) {
return;
}
var membershipWithPadding = (
member.membership + new Array(10 - member.membership.length).join(" ")
);
console.log(
"%s :: %s (%s)", membershipWithPadding, member.name,
(member.userId === myUserId ? "Me" : member.userId)
);
});
}
function printLine(event) {
var name = event.sender ? event.sender.name : event.getSender();
var time = new Date(
event.getTs()
).toISOString().replace(/T/, ' ').replace(/\..+/, '');
var separator = "<<<";
if (event.getSender() === myUserId) {
name = "Me";
separator = ">>>";
}
var body = "";
var maxNameWidth = 15;
if (name.length > maxNameWidth) {
name = name.substr(0, maxNameWidth-1) + "\u2026";
}
if (event.getType() === "m.room.message") {
body = event.getContent().body;
}
else if (event.isState()) {
var stateName = event.getType();
if (event.getStateKey().length > 0) {
stateName += " ("+event.getStateKey()+")";
}
body = (
"[State: "+stateName+" updated to: "+JSON.stringify(event.getContent())+"]"
);
separator = "---";
}
else {
// random message event
body = (
"[Message: "+event.getType()+" Content: "+JSON.stringify(event.getContent())+"]"
);
separator = "---";
}
console.log("[%s] %s %s %s", time, name, separator, body);
}
matrixClient.startClient(numMessagesToShow); // messages for each room.