Make love, not var_dump())

Kaptanın seyir defteri

Geek'lik yapmadan, nerd'lük yapmadan duramıyoruz :) Geçenlerde, kodu deploy ettikten sonra, ilk Fatih Kadir Akın buldu bu "sürpriz yumurtamızı".

Telnet easter egg


Olayı bilmeyenler için kısaca özetlemek gerekirse, sunucumuzun 1453 portu üzerinde çalışan, ve gelen isteklere, logomuzun ASCII halini ufak bir animasyon ile sunan bir servis.

Denemek isterseniz komut satırından
telnet sonsuzdongu.com 1453
ile deneyebilirsiniz.

Peki bunu nasıl yaptık? :)

Bu tip işleri en kolay yapabileceğiniz araç node.js. Aşağıdaki gibi bir kod ile, ~100 satırda bu işi hallettik.

/*jshint white: true, browser: true, devel: true, evil: true, undef: true, nomen: true, 
eqeqeq: true, plusplus: false, bitwise: true, regexp: true, newcap: true, immed: true */
/*global require:true*/

/**
 * NodeJS powered telnet server for geeky "$ telnet sonsuzdongu.com 1453"
 */
var net = require('net'),
    fs = require('fs'),
    port = 1453,
    arr = [],
    logoFile = "logo.txt",
    footerText, /** will be the last line of logo.txt */
    lineNumber = 0,
    text;

var onNewSocket = function (socket) {
    console.log("Incoming connection");

    var clearTelnetScreen = function () {
        socket.write("\u001B[2J");
    };

    clearTelnetScreen();

    var currentLine = 0;

    /**
     * Write current buffer and clear screen in given interval
     */
    var blink = function (times, callback) {
        var blinkCount = 0;
        var doBlink = function () {
            setTimeout(function () {
                clearTelnetScreen();
                if (blinkCount % 2 === 0) {
                    socket.write(text);
                }
                blinkCount++;

                /**
                 * After blink stop put all text to socket
                 */
                if (blinkCount === times) {
                    socket.write(text);
                    return callback();
                }

                doBlink();

            }, 250);
        };

        doBlink();
    };

    /**
     * Write text in array 'arr' line by line
     */
    var writeLineByLine = function () {
        if (currentLine < lineNumber) {
            socket.write(arr[currentLine] + "\r\n");
            currentLine++;
            setTimeout(writeLineByLine, 200);
        }
        else {
            blink(10, function () {
                socket.end(footerText + '\r\n');
            });
        }
    };

    writeLineByLine();
};

/**
 * Read logo file and start server
 */
fs.readFile(logoFile, 'utf8', function (err, data) {
    if (err) {
        return console.log(err);
    }

    arr = data.split("\n");
    arr.pop(); /** remove line end entry from array */
    footerText = arr.pop(); /** set last line of text as footer text */
    lineNumber = arr.length;

    text = arr.join('\r\n');

    var server = net.createServer(onNewSocket);
    console.log('Server listening on ' + port);
    server.listen(port);
});

Olay 79. satırda logo.txt dosyasını okuduktan sonra, metni satırlara bölme, 91. satırda da 1453 portundan gelen istekleri dinleyecek bir sunucu başlatmakla başlıyor. Porta gelen her istek de 17. satırdaki "onNewSocket" fonksiyonuna iletiliyor.
Kodun geri kalanı işin "animasyon" tarafı ve basitçe setTimeout kullanarak socket'e text basmaktan ibaret.


Node.js'in kurulu olduğunu varsaydığım sisteminizde, basitçe
node telnet.js
ile sunucuyu başlattıktan sonra artık gelen isteklere cevap veriyor oluyorsunuz ;)

Kodu incelemek, fork'lamak, kendi "telnet easter egg"inizi hazırlamak isterseniz, kodlar https://github.com/sonsuzdongu/telnet-nodejs adresindeki git deposunda.
Eğer olur da siz de kendi telnet easter egg'inizi geliştirirseniz, yorum olarak paylaşırsanız seviniriz ;)