mirror of
https://github.com/cubixle/cli-chat.git
synced 2026-04-24 19:44:47 +01:00
114 lines
3.3 KiB
JavaScript
114 lines
3.3 KiB
JavaScript
// Load the TCP Library
|
|
var net = require('net'),
|
|
clc = require('cli-color'),
|
|
moment = require('moment'),
|
|
config = require('./config');
|
|
|
|
// Keep track of the chat clients
|
|
var clients = [];
|
|
var names = {};
|
|
|
|
var broadcastService = {
|
|
sendMessageHome: function(socket, message) {
|
|
socket.write(message + '\n');
|
|
},
|
|
sendMessage: function(sender, message) {
|
|
var message = String(message);
|
|
var date = moment().format('HH:mm:ss');
|
|
clientService.clients.forEach(function (client) {
|
|
// Don't want to send it to sender
|
|
if (client === sender) return;
|
|
client.write(date + ' - ' + message.trim() + "\n");
|
|
});
|
|
|
|
// Log it to the server output too
|
|
process.stdout.write(message)
|
|
}
|
|
};
|
|
|
|
var serverService = {
|
|
getHelpCommands: function(socket) {
|
|
broadcastService.sendMessageHome(socket, clc.green('List of commands you can run'));
|
|
broadcastService.sendMessageHome(socket, clc.yellow('/list') + ' - List all connected users.');
|
|
broadcastService.sendMessageHome(socket, clc.yellow('/name {name}') + ' - Set your user name.');
|
|
}
|
|
}
|
|
|
|
var clientService = {
|
|
|
|
clients: [],
|
|
names: {},
|
|
addNewUser: function (socket) {
|
|
// Identify this client
|
|
socket.name = socket.remoteAddress + ":" + socket.remotePort
|
|
this.names[socket.name] = socket.name;
|
|
// Put this new client in the list
|
|
this.clients.push(socket);
|
|
broadcastService.sendMessageHome(socket, 'Welcome ' + socket.name + ', if you need any help type /help');
|
|
|
|
broadcastService.sendMessage(socket, socket.name + " joined the chat");
|
|
return socket;
|
|
},
|
|
removeUser: function(socket) {
|
|
this.clients.splice(this.clients.indexOf(socket), 1);
|
|
var name = this.names[socket.name];
|
|
delete this.names[socket.name];
|
|
|
|
broadcastService.sendMessage(socket, name + " left the chat.");
|
|
},
|
|
getUserName: function(socket) {
|
|
return this.names[socket.name];
|
|
},
|
|
setUserName: function(socket, name) {
|
|
this.names[socket.name] = name.trim();
|
|
|
|
broadcastService.sendMessageHome(socket, clc.green('Your name has been updated'));
|
|
},
|
|
getListOfNames: function() {
|
|
var list = [];
|
|
for (var key in this.names) {
|
|
|
|
list.push(this.names[key].trim());
|
|
}
|
|
|
|
return list.join(', ');
|
|
}
|
|
|
|
};
|
|
|
|
// Start a TCP Server
|
|
net.createServer(function (socket) {
|
|
|
|
socket = clientService.addNewUser(socket);
|
|
|
|
// Handle incoming messages from clients.
|
|
socket.on('data', function (data) {
|
|
var data = String(data);
|
|
if (data.indexOf('/help') > -1) {
|
|
serverService.getHelpCommands(socket);
|
|
}
|
|
else if (data.indexOf('/list') > -1) {
|
|
broadcastService.sendMessageHome(socket, clientService.getListOfNames());
|
|
}
|
|
else if (data.indexOf('/name ') > -1) {
|
|
clientService.setUserName(socket, data.substring(6));
|
|
}
|
|
else {
|
|
var name = clientService.getUserName(socket);
|
|
|
|
broadcastService.sendMessage(
|
|
socket,
|
|
clc.redBright(name) + clc.blueBright(": ") + data
|
|
);
|
|
}
|
|
});
|
|
|
|
// Remove the client from the list when it leaves
|
|
socket.on('end', function () {
|
|
clientService.removeUser(socket);
|
|
});
|
|
}).listen(config.server.port);
|
|
|
|
// Put a friendly message on the terminal of the server.
|
|
console.log("Chat server running at port " + config.server.port);
|