diff --git a/src/http.ts b/src/http.ts index 695f40a..a3f774e 100644 --- a/src/http.ts +++ b/src/http.ts @@ -95,7 +95,11 @@ async function chgNick(socket, nick, f?: boolean) { for(let i=1;i<rooms.length;i++){ io.to(rooms[i]).emit('ALERT', socket.nick+' is now known as '+nick); } - if(store.get(socket.nick)) store.rm(socket.nick); + if(store.get(socket.nick)) { + if(Array.isArray(store.get(socket.nick))) store.set(socket.nick, store.get(socket.nick).filter(item => item !== socket.id)); + else store.rm(socket.nick); + } + if(f) store.set(nick, [].concat(store.get(nick), socket.id).filter(item => item !== undefined)); store.set(nick, socket.id); socket.nick = nick; } @@ -336,12 +340,6 @@ async function initSite(openReg) { async function initChat() { //set a cookie to request same nick - //apply same nick if the request comes from the same ip - //structure of entry in store should be: - // knotteye: { - // ip: "127.0.0.1", - // id: ["aklsjdnaksj", "asjdnaksjnd", "aksjdnkajs"] - //} //socket.io chat logic io.on('connection', async (socket) => { @@ -387,6 +385,11 @@ async function initChat() { for(let i=1;i<rooms.length;i++){ io.to(rooms[i]).emit('ALERT', socket.nick+' disconnected'); } + if(Array.isArray(store.get(socket.nick))) { + store.set(socket.nick, store.get(socket.nick).filter(item => item !== socket.id)) + if(store.get(socket.nick) !== []) + return; + } store.rm(socket.nick); }); socket.on('NICK', async (data) => { @@ -419,6 +422,11 @@ async function initChat() { //find client with data.nick let id: string = store.get(data.nick); if(id){ + if(Array.isArray(id)) { + for(let i=0;i<id.length+1;i++) + io.sockets.connected[id[i]].leave(data.room) + return; + } let target = io.sockets.connected[id]; io.in(data.room).emit('ALERT', data.nick+' has been kicked.'); target.disconnect(true); @@ -431,10 +439,20 @@ async function initChat() { if(socket.nick === data['room']){ let id: string = store.get(data['nick']); if(id){ + if(Array.isArray(id)) { + for(let i=0;i<id.length+1;i++){ + let target = io.sockets.connected[id[i]]; + if(typeof(data['time']) === 'number' && (data['time'] !== 0 && data['time'] !== NaN)) banlist.set(data['room'], Object.assign({}, banlist.get(data['room']), {[target.ip]: {time: Math.floor(Date.now() / 1000), length: data['time']}})); + else banlist.set(data['room'], Object.assign({}, banlist.get(data['room']), {[target.ip]: {time: Math.floor(Date.now() / 1000), length: 30}})); + target.leave(data['room']); + } + io.to(data['room']).emit('ALERT', data['nick']+' was banned.'); + return; + } let target = io.sockets.connected[id]; - if(typeof(data['time']) === 'number' && (data['time'] !== 0 || data['time'] !== NaN)) banlist.set(data['room'], Object.assign({}, banlist.get(data['room']), {[target.ip]: {time: Math.floor(Date.now() / 1000), length: data['time']}})); + if(typeof(data['time']) === 'number' && (data['time'] !== 0 && data['time'] !== NaN)) banlist.set(data['room'], Object.assign({}, banlist.get(data['room']), {[target.ip]: {time: Math.floor(Date.now() / 1000), length: data['time']}})); else banlist.set(data['room'], Object.assign({}, banlist.get(data['room']), {[target.ip]: {time: Math.floor(Date.now() / 1000), length: 30}})); - target.disconnect(true); + target.leave(data['room']); io.to(data['room']).emit('ALERT', target.nick+' was banned.'); } else socket.emit('ALERT', 'No such user found.');