This commit is contained in:
Dobromir Popov 2024-06-10 14:45:52 +03:00
parent 407affa979
commit 43f3f9a281
2 changed files with 100 additions and 31 deletions

View File

@ -18,36 +18,43 @@
</div> </div>
<!-- Active Users List --> <!-- Active Users List -->
<div class="flex justify-center items-center mb-4"> <div id="active-users-container" class="hidden flex justify-center items-center mb-4">
<div class="w-1/3"> <div class="w-1/3">
<h2 class="text-xl font-bold mb-2">Active Users</h2> <h2 class="text-xl font-bold mb-2">Active Users</h2>
<ul id="users-list" class="list-disc list-inside bg-white p-4 rounded shadow"> <select id="users-list" class="w-full bg-white p-4 rounded shadow" multiple size="10">
<!-- Dynamic list of users --> <!-- Dynamic list of users -->
</ul> </select>
<button onclick="startChat()" class="bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded mt-4">Start Chat</button>
</div> </div>
<div class="w-2/3 ml-4"> </div>
<h2 class="text-xl font-bold mb-2">Chat Room</h2>
<div id="chat-room" class="bg-white p-4 rounded shadow"> <!-- Chat Room -->
<!-- Chat room content --> <div id="chat-room-container" class="hidden w-2/3 mx-auto">
<div class="mb-4"> <h2 class="text-xl font-bold mb-2">Chat Room</h2>
<label class="flex items-center space-x-2"> <div id="chat-room" class="bg-white p-4 rounded shadow mb-4">
<input type="checkbox" id="autosend" class="mr-2"> <!-- Chat room content -->
<span>Continuous</span> <div class="mb-4">
</label> <label class="flex items-center space-x-2">
</div> <input type="checkbox" id="autosend" class="mr-2">
<div class="mb-4"> <span>Continuous</span>
<button id="record-button" disabled </label>
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded mr-4">Push to Talk</button>
</div>
<div id="transcription" class="border rounded p-4 h-48 overflow-y-scroll mb-4">
<!-- Transcription content -->
</div>
<canvas id="canvas" class="w-full mb-4"></canvas>
<div class="flex justify-between items-center">
<button id="copyButton" class="bg-gray-200 hover:bg-gray-300 text-gray-700 font-medium py-2 px-4 rounded focus:outline-none" onclick="copyToClipboard('transcription')">Copy</button>
<button id="clearButton" class="bg-gray-200 hover:bg-gray-300 text-gray-700 font-medium py-2 px-4 rounded focus:outline-none" onclick="clearTranscription()">Clear</button>
</div>
</div> </div>
<div class="mb-4">
<button id="record-button" disabled
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded mr-4">Push to Talk</button>
</div>
<div id="transcription" class="border rounded p-4 h-48 overflow-y-scroll mb-4">
<!-- Transcription content -->
</div>
<canvas id="canvas" class="w-full mb-4"></canvas>
<div class="flex justify-between items-center">
<button id="copyButton" class="bg-gray-200 hover:bg-gray-300 text-gray-700 font-medium py-2 px-4 rounded focus:outline-none" onclick="copyToClipboard('transcription')">Copy</button>
<button id="clearButton" class="bg-gray-200 hover:bg-gray-300 text-gray-700 font-medium py-2 px-4 rounded focus:outline-none" onclick="clearTranscription()">Clear</button>
</div>
</div>
<h2 class="text-xl font-bold mb-2">Previous Chats</h2>
<div id="previous-chats" class="bg-white p-4 rounded shadow">
<!-- Previous chats content -->
</div> </div>
</div> </div>
@ -63,6 +70,7 @@
<script> <script>
let sessionId; let sessionId;
let username;
let selectedDeviceId = "default"; let selectedDeviceId = "default";
let socket; let socket;
let audioRecorder; let audioRecorder;
@ -75,6 +83,8 @@
let audioContext; let audioContext;
let serverTime; let serverTime;
let users = []; let users = [];
let selectedUsers = [];
let chats = [];
let volumeChecker; let volumeChecker;
let lastVolumes = new Array(5); let lastVolumes = new Array(5);
let averageVolume; let averageVolume;
@ -225,6 +235,10 @@
users = json.users; users = json.users;
updateUserList(); updateUserList();
} }
if (json.hasOwnProperty("chats")) {
chats = json.chats;
updateChatList();
}
return; return;
} catch (e) { } catch (e) {
} }
@ -320,7 +334,7 @@
function sendAudioToServer(data) { function sendAudioToServer(data) {
if (connected) { if (connected) {
socket.send(data); socket.send(JSON.stringify({ type: 'audio', audio: data }));
serverTime = Date.now(); serverTime = Date.now();
if (!autosend.checked) { if (!autosend.checked) {
transcription.innerHTML = "Processing audio..."; transcription.innerHTML = "Processing audio...";
@ -339,21 +353,64 @@
} }
function joinChat() { function joinChat() {
const username = document.getElementById('username').value; username = document.getElementById('username').value;
if (username.trim() === "") { if (username.trim() === "") {
alert("Please enter a username"); alert("Please enter a username");
return; return;
} }
socket.send(JSON.stringify({ type: 'join', username })); socket.send(JSON.stringify({ type: 'join', username }));
document.getElementById('active-users-container').classList.remove('hidden');
fetchPreviousChats(username);
}
function startChat() {
const selectedOptions = Array.from(document.querySelectorAll('#users-list option:checked'));
selectedUsers = selectedOptions.map(option => option.value);
if (selectedUsers.length === 0) {
alert("Please select at least one user to start a chat.");
return;
}
socket.send(JSON.stringify({ type: 'startChat', users: selectedUsers }));
document.getElementById('chat-room-container').classList.remove('hidden');
} }
function updateUserList() { function updateUserList() {
const usersList = document.getElementById('users-list'); const usersList = document.getElementById('users-list');
usersList.innerHTML = ''; usersList.innerHTML = '';
users.forEach(user => { users.forEach(user => {
const li = document.createElement('li'); const option = document.createElement('option');
li.innerText = user.username; option.value = user.sessionId;
usersList.appendChild(li); option.innerText = user.username;
if (user.username === username) {
option.innerText += " (me)";
// option.disabled = true;
}
usersList.appendChild(option);
});
}
function fetchPreviousChats(username) {
fetch(`/chats?username=${username}`)
.then(response => response.json())
.then(data => {
chats = data.chats;
updateChatList();
});
}
function updateChatList() {
const previousChats = document.getElementById('previous-chats');
previousChats.innerHTML = '';
chats.forEach(chat => {
const chatDiv = document.createElement('div');
chatDiv.classList.add('border', 'rounded', 'p-2', 'mb-2');
const participants = chat.participants.join(', ');
const status = chat.participants.map(participant => {
const user = users.find(u => u.username === participant);
return user ? `${participant} (online)` : `${participant} (offline)`;
}).join(', ');
chatDiv.innerHTML = `<strong>Participants:</strong> ${participants}<br><strong>Status:</strong> ${status}`;
previousChats.appendChild(chatDiv);
}); });
} }

View File

@ -23,7 +23,8 @@ let storeRecordings = false;
let queueCounter = 0; let queueCounter = 0;
const sessions = new Map(); const sessions = new Map();
const users = new Map(); // Store users with their usernames and session IDs const users = new Map();
const chats = new Map(); // Store chat rooms
storage.init().then(() => { storage.init().then(() => {
storage.getItem('language').then((value) => { storage.getItem('language').then((value) => {
@ -52,6 +53,11 @@ wss.on('connection', (ws) => {
const { username } = data; const { username } = data;
users.set(ws.sessionId, { username, sessionId: ws.sessionId }); users.set(ws.sessionId, { username, sessionId: ws.sessionId });
broadcastUserList(); broadcastUserList();
} else if (data.type === 'startChat') {
const { users: chatUsers } = data;
const chatId = Math.random().toString(36).substring(2);
chats.set(chatId, { participants: [ws.sessionId, ...chatUsers], messages: [] });
broadcastUserList();
} else if (data.type === 'audio') { } else if (data.type === 'audio') {
handleAudioData(ws, data.audio); handleAudioData(ws, data.audio);
} }
@ -187,6 +193,12 @@ app.post('/upload', (req, res) => {
}); });
}); });
app.get('/chats', (req, res) => {
const { username } = req.query;
const userChats = Array.from(chats.values()).filter(chat => chat.participants.includes(username));
res.status(200).send({ chats: userChats });
});
app.listen(PORT_HTTP, () => { app.listen(PORT_HTTP, () => {
console.log(`Server listening on port ${PORT_HTTP}`); console.log(`Server listening on port ${PORT_HTTP}`);
}); });