moebius-web

web based ansi art editor

moebius-web

src/ansiedit.js


var fs = require("fs");
var binaryText = require("./binary_text");

var imageData;
var userList = {};
var chat = [];

function sendToAll(clients, msg) {
    clients.forEach((client) => {
        try {
            client.send(JSON.stringify(msg));
        } catch (err) {
            // ignore errors
        }
    });
}

function saveSessionWithTimestamp(callback) {
    binaryText.save("joint " + new Date().toUTCString() + ".bin", imageData, callback);
}

function saveSession(callback) {
    fs.writeFile("joint.json", JSON.stringify({"chat": chat}), () => {
        binaryText.save("joint.bin", imageData, callback);
    });
}

fs.readFile("joint.json", "utf8", (err, data) => {
    if (!err) {
        chat = JSON.parse(data).chat;
    }
    binaryText.load("joint.bin", (loadedImageData) => {
        if (loadedImageData !== undefined) {
            imageData = loadedImageData;
        }
    });
});

function getStart(sessionID) {
    return JSON.stringify(["start", {
        "columns": imageData.columns,
        "rows": imageData.rows,
        "letterSpacing": imageData.letterSpacing,
        "iceColours": imageData.iceColours,
        "chat": chat
    }, sessionID, userList]);
}

function getImageData() {
    return imageData;
}

function message(msg, sessionID, clients) {
    switch(msg[0]) {
    case "join":
        console.log(msg[1] + " has joined.");
        userList[sessionID] = msg[1];
        msg.push(sessionID);
        break;
    case "nick":
        userList[sessionID] = msg[1];
        msg.push(sessionID);
        break;
    case "chat":
        msg.splice(1, 0, userList[sessionID]);
        chat.push([msg[1], msg[2]]);
        if (chat.length > 128) {
            chat.shift();
        }
        break;
    case "draw":
        msg[1].forEach((block) => {
            imageData.data[block >> 16] = block & 0xffff;
        });
        break;
    default:
        break;
    }
    sendToAll(clients, msg);
}

function closeSession(sessionID, clients) {
    if (userList[sessionID] !== undefined) {
        console.log(userList[sessionID] + " is gone.");
        delete userList[sessionID];
    }
    sendToAll(clients, ["part", sessionID]);
}

module.exports = {
    "saveSessionWithTimestamp": saveSessionWithTimestamp,
    "saveSession": saveSession,
    "getStart": getStart,
    "getImageData": getImageData,
    "message": message,
    "closeSession": closeSession
};

Download

raw zip tar