Skip to content

Instantly share code, notes, and snippets.

@19h
Created May 14, 2014 11:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 19h/c36870b677fa47e6543c to your computer and use it in GitHub Desktop.
Save 19h/c36870b677fa47e6543c to your computer and use it in GitHub Desktop.
Funny little, co-routines abusing chat server based on raw tcp sockets, made for @wtr7.
["net", "fs", "querystring", "child_process", "co"].forEach(function (v) {
global[v] = require(v)
});
var users = {/*
nick: socket
*/};
var operators = {
"apx": "123456789",
"wtr": "yoloswag"
};
var methods = {
whoami: function (cb) {
cb("You are " + this.nick);
},
version: function (cb) {
cb("This server is running: " + process.version);
},
names: function (cb) {
var ulist = Object.keys(users);
cb("There " + (ulist.length !== 1 ? "are" : "is") +" currently " + ulist.length + " user" + (ulist.length !== 1 ? "s" : "") + ": " + ulist.join(", "));
},
kick: function (user, cb) {
if ( users[user] ) {
users[user].end("\r\033[31m>> \033[33m" + this.nick + "\033[31m kicked you from the server.\033[0m\n");
delete users[user];
cb("OK. Kicked " + user + " from the server.");
var self = this;
Object.keys(users).forEach(function (ruser) {
ruser !== self.nick
&& users[ruser].write("\r\033[31m>> " + self.nick + " kicked \033[33m" + user + "\033[31m from the server.\033[0m\n");
});
} else
cb("There's no user called " + user);
}
};
var cowrap = function (method, args, nick) {
return function (cb) {
if ( methods[method] ) {
if ( typeof args !== "object" )
args = [args];
args.push(function (retval) {
cb (false, retval);
})
methods[method].apply({
nick: nick
}, args);
} else {
cb (true, void 0);
// ^^^^ ------
// err result
}
}
}
var sock = net.createServer(function (s) {
var nick = void 0;
var _handler = co(function *(chunk) {
if ( !nick ) {
var rchunk = chunk.toString().replace(/\r\n/, "").split(" ");
if ((rchunk.length !== 2 && rchunk.length !== 3) || rchunk[0] !== ".nick") {
return s.write("\033[0m>> \033[31mPlease identify yourself! Usage: .nick <nick>\033[0m\n");
} else {
if ( rchunk[1] in users ) {
return s.write("\033[0m>> \033[31mNick is already used! Use a different one.\033[0m\n");
} else {
if ( rchunk[1] in operators )
if ( rchunk[2] )
if ( operators[rchunk[1]] === rchunk[2] );
// ok
else
return s.end("\033[0m>> \033[31mBad authentication! Die in hell\033[0m\n");
else
return s.write("\033[0m>> \033[31mOperators have to authenticate.\033[0m\n");
nick = rchunk[1];
users[rchunk[1]] = s;
var ulist = Object.keys(users).filter(function (user) {
return user !== nick
});
var rmotd; // message of the day
if ( !ulist.length )
rmotd = "You're alone on the server, currently.\n";
else {
rmotd = "These users are currently connected: " + ulist.join(", ") + "\n";
ulist.forEach(function (user) {
users[user].write("\r\033[31m>> \033[33m" + (nick in operators ? "@" : "") + nick + "\033[31m joined\033[0m\n");
users[user].write("\033[0m>> \033[33m" + user + "\033[0m: ");
});
}
s.write("\033[0m>> \033[31mHello, " + rchunk[1] + "! " + rmotd + "\033[0m");
s.write("\033[0m>> \033[33m" + nick + "\033[0m: ");
}
}
} else {
var rchunk = chunk.toString().replace(/\r\n/, "").split(" ");
if ( rchunk[0][0] === "." ) {
var mthd = rchunk[0].substr(1);
if ( mthd in methods ) {
var resp = yield cowrap ( mthd, rchunk.slice(1, rchunk.length), nick )
return s.write("\033[0m>> \033[31m" + resp + "\n");
} else {
return s.write("\033[0m>> \033[31mUnknown command: " + mthd + "\n");
}
}
var ulist = Object.keys(users).filter(function (user) {
return user !== nick
});
var msg = chunk.toString().replace(/\r\n/, " ");
ulist.forEach(function (user) {
users[user].write("\r\033[0m>> \033[33m" + nick + "\033[0m: \033[36m" + msg + "\n");
users[user].write("\033[0m>> \033[33m" + user + "\033[0m: ");
});
s.write("\033[0m>> \033[33m" + nick + "\033[0m: ");
}
});
s.on("data", _handler);
})
sock.listen(1239);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment