├── .gitignore ├── config.js.example ├── README.md ├── package.json ├── db.js ├── user.js └── main.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | 3 | config.js 4 | node_modules/* -------------------------------------------------------------------------------- /config.js.example: -------------------------------------------------------------------------------- 1 | "use strict" 2 | module.exports = { 3 | redis_port: 6379, 4 | redis_host: '127.0.0.1' 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simpleim 2 | Simple Instant Messanger over TCP with nodejs 3 | #Requirements 4 | - nodejs 5 | - redis-server 6 | 7 | #Installation 8 | - install dependency with this console command `npm install` 9 | - copy config.js.example as config.js 10 | - change parameters in config file 11 | #Run server 12 | $node main.js 13 | 14 | #Connect to client 15 | $nc|netcat ip port 16 | 17 | #Usage: 18 | Login with username 19 | me:{yourusername} 20 | 21 | To send message to user, write this command 22 | to:{nameofuser} 23 | 24 | Then write your message. 25 | If you want to switch user, you have to write to:{nameofuser} again 26 | 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simpleim", 3 | "version": "1.0.0", 4 | "description": "Simple im", 5 | "main": "main.js", 6 | "dependencies": { 7 | "ioredis": "^1.10.0" 8 | }, 9 | "devDependencies": {}, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/girginsoft/simpleim.git" 16 | }, 17 | "author": "Tugay Özgirgin", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/girginsoft/simpleim/issues" 21 | }, 22 | "homepage": "https://github.com/girginsoft/simpleim#readme" 23 | } 24 | -------------------------------------------------------------------------------- /db.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | var Redis = require('ioredis'); 3 | var Config = require('./config'); 4 | var redis = new Redis(Config.redis_port, Config.redis_host); 5 | 6 | module.exports = { 7 | set: function (key, value) { 8 | redis.set(key, value); 9 | }, 10 | get: function(key, callback) { 11 | redis.get(key, function(err, result) { 12 | if (!!err) { 13 | console.error(err); 14 | callback(null); 15 | return; 16 | } 17 | callback(result); 18 | }); 19 | }, 20 | delete: function(key) { 21 | redis.del(key); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /user.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | var db = require("./db"); 3 | module.exports = { 4 | concat_address: function(ip, port) { 5 | return ip + ":" + port; 6 | }, 7 | get_user_by_address : function(ip, port, callback) { 8 | db.get(this.concat_address(ip, port), callback); 9 | }, 10 | 11 | user_exists: function(username, callback) { 12 | db.get(username, function(data) { 13 | if (!!data) { 14 | callback(true); 15 | } else { 16 | callback(false); 17 | } 18 | }); 19 | }, 20 | 21 | get_address_by_username: function(username, callback) { 22 | db.get(username, callback); 23 | }, 24 | 25 | add_user: function(ip, port, username) { 26 | db.set(ip + ":" + port, username); 27 | db.set(username, ip + ":" + port); 28 | }, 29 | delete_user: function(ip, port) { 30 | var self = this; 31 | this.get_user_by_address(ip, port, function(username) { 32 | db.delete(self.concat_address(ip, port)); 33 | db.delete(username); 34 | }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | var net = require('net'); 3 | var events = require('events'); 4 | var User = require('./user'); 5 | var eventEmitter = new events.EventEmitter(); 6 | var server = net.createServer(function(c) { //'connection' listener 7 | console.log('client connected'); 8 | var sendToUser = ''; 9 | var remoteAddress = c.remoteAddress; 10 | var remotePort = c.remotePort; 11 | c.on('end', function() { 12 | User.delete_user(remoteAddress, remotePort); 13 | console.log('client disconnected ' + remoteAddress + ":" + remotePort); 14 | }); 15 | var sendMessage = function (msg, client) { 16 | msg = msg.replace("\n", "").replace("\r", ""); 17 | 18 | User.get_user_by_address(client.remoteAddress, client.remotePort, function(username){ 19 | c.write("\t"+ username + ":" + msg + "\n\r"); 20 | }); 21 | 22 | } 23 | c.on('data', function(data) { 24 | console.log('Server: ' + data); 25 | var outData = data.toString('utf8'); 26 | var to = outData.split("to:"); 27 | if (!!to[1]) { 28 | sendToUser = to[1].trim(); 29 | User.user_exists(sendToUser, function(result) { 30 | if (!result) { 31 | c.write('#user not found\r\n'); 32 | sendToUser = null; 33 | } 34 | }); 35 | return; 36 | } 37 | var user = outData.split("me:"); 38 | if (!!user[1]) { 39 | var username = user[1].trim(); 40 | User.user_exists(username, function(result) { 41 | if (!result) { 42 | User.add_user(c.remoteAddress, c.remotePort, user[1].trim()); 43 | c.write('hello ' + username +'\r\n'); 44 | } else { 45 | c.write('Username already in use, please change\r\n'); 46 | } 47 | }); 48 | return; 49 | } 50 | console.log ("Socketmessage: " + outData); 51 | User.get_address_by_username(sendToUser, function(result) { 52 | eventEmitter.emit('sendMessage'+result, outData, c); 53 | }); 54 | }); 55 | eventEmitter.on('sendMessage' + c.remoteAddress + ":" + c.remotePort, sendMessage); 56 | c.write('Welcome to messaging app\r\n'); 57 | }); 58 | server.listen(8124, function() { //'listening' listener 59 | console.log('server bound'); 60 | }); 61 | --------------------------------------------------------------------------------