Add full support for multiple connections with one account in Socket.IO

Add LIST command
merge-requests/6/head
knotteye 4 years ago
parent 661d953919
commit be38b873eb
  1. 2
      package.json
  2. 30
      src/http.ts
  3. 7
      templates/chat.html

@ -1,6 +1,6 @@
{
"name": "satyr",
"version": "0.5.2",
"version": "0.5.3",
"description": "A livestreaming server.",
"license": "AGPL-3.0",
"author": "knotteye",

@ -13,6 +13,7 @@ import { readFileSync, writeFileSync } from "fs";
import { JWT, JWK } from "jose";
import { strict } from "assert";
import { parse } from "path";
import { isBuffer } from "util";
const app = express();
const server = http.createServer(app);
@ -77,13 +78,13 @@ async function newNick(socket, skip?: boolean) {
}
}
async function chgNick(socket, nick) {
async function chgNick(socket, nick, f?: boolean) {
let rooms = Object.keys(socket.rooms);
for(let i=1;i<rooms.length;i++){
io.to(rooms[i]).emit('ALERT', socket.nick+' is now known as '+nick);
}
store.rm(socket.nick);
store.set(nick, socket.id);
if(store.get(socket.nick)) store.rm(socket.nick);
if (!f) store.set(nick, socket.id);
socket.nick = nick;
}
@ -195,7 +196,7 @@ async function initAPI() {
if(t) {
if(t['exp'] - 86400 < Math.floor(Date.now() / 1000)){
return genToken(t['username']).then((t) => {
res.cookie('Authorization', t);
res.cookie('Authorization', t, {maxAge: 604800000, httpOnly: true});
res.send('{"success":""}');
return;
});
@ -214,7 +215,7 @@ async function initAPI() {
api.login(req.body.username, req.body.password).then((result) => {
if(!result){
genToken(req.body.username).then((t) => {
res.cookie('Authorization', t);
res.cookie('Authorization', t, {maxAge: 604800000, httpOnly: true});
res.send('{"success":""}');
})
}
@ -348,6 +349,21 @@ async function initChat(ircconf: any) {
}
else socket.emit('ALERT', 'Room does not exist');
});
socket.on('LIST', (data) => {
let str = "";
let client;
io.in(data.room).clients((err, clients) => {
if(err) throw err;
if(clients === []) {
socket.emit('LIST', 'The room is empty.');
return;
}
for(let i=0;i<clients.length;i++) {
str += io.sockets.connected[clients[i]].nick+', ';
}
socket.emit('LIST', str.substring(0, str.length - 2));
});
});
socket.on('LEAVEROOM', (data) => {
socket.leave(data);
if(ircconf.enable) irc.part(socket.nick, data);
@ -375,7 +391,7 @@ async function initChat(ircconf: any) {
return false;
}
if(await db.validatePassword(data.nick, data.password)){
chgNick(socket, data.nick);
chgNick(socket, data.nick, true);
}
else socket.emit('ALERT','Incorrect username or password');
}
@ -404,4 +420,4 @@ async function initChat(ircconf: any) {
});
}
export { init };
export { init };

@ -33,6 +33,9 @@
else if(m.startsWith('/kick')){
socket.emit('KICK', {nick: m.split(' ')[1], room: room});
}
else if(m.startsWith('/list')){
socket.emit('LIST', {room: room});
}
else socket.emit('MSG', {room: room, msg: m});
document.getElementById('m').value = '';
}
@ -52,6 +55,10 @@
document.getElementById('messages').innerHTML+='<li><i>'+data.nick+' has left the chat</i></li>';
window.scrollTo(0,document.body.scrollHeight);
});
socket.on('LIST', function(data){
document.getElementById('messages').innerHTML+='<li><i>'+data+'</i></li>';
window.scrollTo(0,document.body.scrollHeight);
});
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');