forked from snxraven/LinkUp-P2P-Chat
105 lines
3.4 KiB
JavaScript
105 lines
3.4 KiB
JavaScript
import b4a from 'b4a';
|
|
import fs from 'fs';
|
|
|
|
const agentAvatarPath = './assets/agent.png';
|
|
let agentAvatar = '';
|
|
|
|
// Load the agent avatar once when the module is imported
|
|
if (fs.existsSync(agentAvatarPath)) {
|
|
const avatarBuffer = fs.readFileSync(agentAvatarPath);
|
|
agentAvatar = `data:image/png;base64,${b4a.toString(avatarBuffer, 'base64')}`;
|
|
}
|
|
|
|
export default async function handleCommand(command, context) {
|
|
const { eventEmitter, currentTopic, clearMessages, addMessage, joinRoom, leaveRoom, createRoom, listFiles, deleteFile, servePort } = context;
|
|
|
|
console.log("Context received in handleCommand:", context); // Add logging
|
|
|
|
const args = command.trim().split(' ');
|
|
const cmd = args[0].toLowerCase();
|
|
const restArgs = args.slice(1).join(' ');
|
|
|
|
console.log("Command received:", cmd); // Add logging
|
|
console.log("Current topic:", currentTopic); // Add logging to check the current topic
|
|
|
|
switch (cmd) {
|
|
case '~clear':
|
|
clearMessages(currentTopic);
|
|
break;
|
|
case '~ping':
|
|
addMessage('LinkUp', 'pong', agentAvatar, currentTopic);
|
|
break;
|
|
case '~help':
|
|
addMessage('LinkUp', 'Available commands:\n- ~clear\n- ~ping\n- ~help\n- ~join [topic]\n- ~leave\n- ~create [alias]\n- ~list-files', agentAvatar, currentTopic);
|
|
break;
|
|
case '~join':
|
|
if (restArgs) {
|
|
await joinRoom(currentTopic, restArgs);
|
|
} else {
|
|
addMessage('LinkUp', 'Usage: ~join [topic]', agentAvatar, currentTopic);
|
|
}
|
|
break;
|
|
case '~leave':
|
|
leaveRoom(currentTopic);
|
|
break;
|
|
case '~create':
|
|
if (restArgs) {
|
|
await createRoom(currentTopic, restArgs);
|
|
} else {
|
|
addMessage('LinkUp', 'Usage: ~create [alias]', agentAvatar, currentTopic);
|
|
}
|
|
break;
|
|
case '~list-files':
|
|
const files = await listFiles();
|
|
const fileList = files.length > 0 ? files.map(file => `- ${file}`).join('\n') : 'No files available';
|
|
addMessage('LinkUp', `Available files:\n${fileList}`, agentAvatar, currentTopic);
|
|
|
|
// Render the file list with delete buttons
|
|
renderFileList(files, deleteFile, servePort);
|
|
break;
|
|
default:
|
|
addMessage('LinkUp', `Unknown command: ${cmd}`, agentAvatar, currentTopic);
|
|
console.log('Unknown command:', command);
|
|
}
|
|
}
|
|
|
|
function renderFileList(files, deleteFile, servePort) {
|
|
const container = document.querySelector('#messages');
|
|
if (!container) {
|
|
console.error('Element #messages not found');
|
|
return;
|
|
}
|
|
|
|
const fileList = document.createElement('ul');
|
|
|
|
files.forEach(file => {
|
|
const listItem = document.createElement('li');
|
|
const fileButton = document.createElement('button');
|
|
fileButton.textContent = file.trim();
|
|
fileButton.onclick = () => downloadFile(file.trim(), servePort);
|
|
|
|
const deleteButton = document.createElement('button');
|
|
deleteButton.textContent = 'Delete';
|
|
deleteButton.onclick = async () => {
|
|
await deleteFile(file);
|
|
listItem.remove();
|
|
};
|
|
|
|
listItem.appendChild(fileButton);
|
|
listItem.appendChild(deleteButton);
|
|
fileList.appendChild(listItem);
|
|
});
|
|
|
|
container.appendChild(fileList);
|
|
}
|
|
|
|
function downloadFile(filename, servePort) {
|
|
const url = `http://localhost:${servePort}/files/${filename}`;
|
|
const link = document.createElement('a');
|
|
link.href = url;
|
|
link.download = filename;
|
|
document.body.appendChild(link);
|
|
link.click();
|
|
document.body.removeChild(link);
|
|
}
|