Compare commits
1 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
e0b1685070 |
|
|
@ -98,7 +98,7 @@ window.makeUser = (user, url, context) => {
|
|||
membername.textContent = user.displayname;
|
||||
memberusername.textContent = `${user.name}@${url}`;
|
||||
memberbio.textContent = user.bio;
|
||||
}}>${user.displayname}</span>`;
|
||||
}}>${user.displayname || user.id}</span>`;
|
||||
span.user = user;
|
||||
return span;
|
||||
};
|
||||
|
|
@ -207,7 +207,7 @@ document.body.append(html.node`
|
|||
<button class='hidden' id='saveprofile' onclick=${saveProfile}>save</button>
|
||||
</p>
|
||||
<label class='heading'>display name</label>
|
||||
<input id='newname' onkeyup=${profileEdit}>
|
||||
<input id='newname' onkeyup=${profileEdit} autocomplete='off' spellcheck='false'>
|
||||
<p>
|
||||
<input id='profilepublic' type='checkbox' oninput=${saveProfile}>
|
||||
<label for='profilepublic'>show profile in instance user list</label>
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ your keys are stored in your browser's local storage only, so do this on a brows
|
|||
</p>
|
||||
<form onsubmit=${submit} id='registerform'>
|
||||
<label for='username'>username: </label>
|
||||
<input id='username' type='text' />
|
||||
<input id='username' type='text' autocomplete='off' spellcheck='false'>
|
||||
<br>
|
||||
<button id='submit' type='submit'>register</button>
|
||||
<button onclick=${submit}>authenticate</button>
|
||||
|
|
|
|||
|
|
@ -44,11 +44,13 @@ function loadMessages(callback) {
|
|||
now.getDate() === date.getDate() && date.getTime() > now.getTime() - 24 * 60 * 60000
|
||||
? date.toLocaleTimeString() : date.toLocaleString()
|
||||
}</span></div>`;
|
||||
let author;
|
||||
let content = html.node`<span class='content'>: ${message.content}</span>`;
|
||||
content.prepend(user ? window.makeUser(user, user.id.split?.('@')[1] || instance.url)
|
||||
content.prepend(author = user ? window.makeUser(user, user.id.split?.('@')[1] || instance.url)
|
||||
: html.node`<span>${message.user.id}</span>`);
|
||||
div.prepend(content);
|
||||
messages.append(div);
|
||||
return author;
|
||||
}
|
||||
|
||||
instance.emit('get_history', {
|
||||
|
|
@ -67,25 +69,25 @@ function loadMessages(callback) {
|
|||
let user;
|
||||
if (message.user.name)
|
||||
user = message.user;
|
||||
else if (message.user.id.indexOf('@') === -1)
|
||||
else if (!message.user.id.includes('@'))
|
||||
message.user.id = 'deleted user';
|
||||
else {
|
||||
user = users[message.user.id];
|
||||
if (user === undefined)
|
||||
try {
|
||||
user = users[message.user.id] = await window.getUser(message.user.id);
|
||||
if (!user)
|
||||
user = users[message.user.id] = {
|
||||
...message.user,
|
||||
messages: []
|
||||
};
|
||||
}
|
||||
catch (e) {
|
||||
console.log(`error getting user ${message.user.id}:`, e);
|
||||
users[message.user.id] = false;
|
||||
}
|
||||
if (user) {
|
||||
user.id = message.user.id;
|
||||
user.permissions = message.user.permissions;
|
||||
}
|
||||
}
|
||||
addMessage(message, user);
|
||||
let author = addMessage(message, user);
|
||||
if (user?.messages)
|
||||
user.messages.push(author);
|
||||
}
|
||||
for (let id in users)
|
||||
window.getUser(id).then(user => {
|
||||
for (let author of users[id].messages)
|
||||
author.replaceWith(window.makeUser(user, id.split('@')[1]));
|
||||
});
|
||||
}
|
||||
if (msg.more)
|
||||
document.getElementById('loadmore').classList.remove('hidden');
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ function loadStreams() {
|
|||
name: this.value
|
||||
});
|
||||
currentThread.streamname = this.value;
|
||||
}}>
|
||||
}} autocomplete='off'>
|
||||
<p id='listeners'>${currentThread.listeners ?
|
||||
currentThread.listeners + ' listeners' : ''}
|
||||
</p>`);
|
||||
|
|
|
|||
|
|
@ -219,7 +219,7 @@ function newThread(instance) {
|
|||
<h4>create thread</h4>
|
||||
<label for='newthreadname' class='heading'>thread name</label>
|
||||
<p id='newnameempty' class='hidden'>name cannot be empty</p>
|
||||
<input type='text' id='newthreadname' />
|
||||
<input type='text' id='newthreadname' autocomplete='off'>
|
||||
<p id='permissions'>thread permissions</p>
|
||||
<input type='radio' name='newpermissions'
|
||||
id='public' value='public' checked />
|
||||
|
|
@ -236,7 +236,7 @@ function newThread(instance) {
|
|||
event.preventDefault();
|
||||
addMember();
|
||||
}
|
||||
}} />
|
||||
}} autocomplete='off'>
|
||||
<button type='button' onclick=${addMember}>add</button>
|
||||
<p id='newmembererror'></p>
|
||||
<div id='newmembers'>
|
||||
|
|
@ -292,7 +292,7 @@ function editThread() {
|
|||
}}>
|
||||
<h4>edit thread</h4>
|
||||
<label for='editthreadname' class='heading'>thread name</label>
|
||||
<input type='text' id='editthreadname' />
|
||||
<input type='text' id='editthreadname' autocomplete='off'>
|
||||
<p id='nameempty' class='hidden'>name cannot be empty</p>
|
||||
<p id='permissions'>thread permissions</p>
|
||||
<input type='radio' name='permissions'
|
||||
|
|
@ -445,7 +445,7 @@ async function loadThreads(instancediv, select) {
|
|||
<input id='addmembername' onblur=${addMember} onkeydown=${event => {
|
||||
if (event.key === 'Enter')
|
||||
addMember();
|
||||
}}>
|
||||
}} autocomplete='off'>
|
||||
<p id='membererror'></p>
|
||||
</div>
|
||||
<div id='memberlist'>
|
||||
|
|
|
|||
23
server.js
23
server.js
|
|
@ -76,6 +76,29 @@ global.celi = {
|
|||
await new Promise(connecting);
|
||||
}
|
||||
return instance;
|
||||
},
|
||||
emitcall: async function(thread) {
|
||||
let msg = {
|
||||
thread: thread.id,
|
||||
call: thread.call
|
||||
};
|
||||
if ((await db.query(
|
||||
`select * from permission
|
||||
where thread = ? and type = 'everyone' and value = 'true' and permission = 'view'`,
|
||||
thread.id)).rows.length) {
|
||||
for (let id in celi.users)
|
||||
for (let socket of celi.users[id].sockets)
|
||||
socket.emit('call', msg);
|
||||
} else {
|
||||
for (let member of (
|
||||
await db.query('select user from member where member.thread = ?', thread.id)
|
||||
).rows) {
|
||||
member = celi.users[member.user];
|
||||
if (member)
|
||||
for (let socket of member.sockets)
|
||||
socket.emit('call', msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ async function join(msg, respond, socket) {
|
|||
for (let id in call)
|
||||
if (id != msg.auth_user.id)
|
||||
connection.addTrack(call[id].track);
|
||||
await thread.emitcall();
|
||||
await celi.emitcall(thread);
|
||||
break;
|
||||
case 'failed':
|
||||
console.log('peer connection failed');
|
||||
|
|
@ -91,7 +91,7 @@ async function join(msg, respond, socket) {
|
|||
}
|
||||
delete call[msg.auth_user.id];
|
||||
delete thread.call[msg.auth_user.id];
|
||||
await thread.emitcall();
|
||||
await celi.emitcall(thread);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -159,7 +159,7 @@ async function leave(msg, respond) {
|
|||
connection.close();
|
||||
delete call[msg.auth_user.id];
|
||||
delete thread.call[msg.auth_user.id];
|
||||
await thread.emitcall();
|
||||
await celi.emitcall(thread);
|
||||
respond({ success: true });
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,30 +9,7 @@ db.ready.then(async () => {
|
|||
celi.threads[thread.id] = {
|
||||
...thread,
|
||||
streams: [],
|
||||
call: {}, // list of members in call
|
||||
emitcall: async function() {
|
||||
let msg = {
|
||||
thread: this.id,
|
||||
call: this.call
|
||||
};
|
||||
if ((await db.query(
|
||||
`select * from permission
|
||||
where thread = ? and type = 'everyone' and value = 'true' and permission = 'view'`,
|
||||
this.id)).rows.length) {
|
||||
for (let id in celi.users)
|
||||
for (let socket of celi.users[id].sockets)
|
||||
socket.emit('call', msg);
|
||||
} else {
|
||||
for (let member of (
|
||||
await db.query('select user from member where member.thread = ?', this.id)
|
||||
).rows) {
|
||||
member = celi.users[member.user];
|
||||
if (member)
|
||||
for (let socket of member.sockets)
|
||||
socket.emit('call', msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
call: {} // list of members in call
|
||||
};
|
||||
celi.calls[thread.id] = {};
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue