Created
May 14, 2014 11:08
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
["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