const b4a = window.require('b4a'); import { generateUUID, sodium } from '../utils.js'; export async function createServer(network, name, icon, allowAnyoneToInvite, isGroupChat = false) { const topic = b4a.alloc(32); sodium.randombytes_buf(topic); const topicHex = b4a.toString(topic, 'hex'); const channels = { text: ['general-chat'], voice: ['general-voice'] }; const serverInfo = { name, icon, owner: network.myKey, allowAnyoneToInvite, isGroupChat, channels }; network.servers.push({ topicHex, ...serverInfo }); network._emitServers(); await network.serverDb.put(topicHex, serverInfo); await network._joinTopic(topicHex); await network._appendSignedMessage({ type: 'server_join', serverTopicHex: topicHex, timestamp: Date.now() }); return { topicHex, ...serverInfo }; } export async function joinServer(network, topicHex, name, icon, owner, allowAnyoneToInvite, isGroupChat = false, channels = null) { if (network.servers.some(s => s.topicHex === topicHex)) return; const serverInfo = { name, icon, owner, allowAnyoneToInvite, isGroupChat, channels: channels || { text: ['general-chat'], voice: ['general-voice'] } }; network.servers.push({ topicHex, ...serverInfo }); network._emitServers(); await network.serverDb.put(topicHex, serverInfo); await network._joinTopic(topicHex); await network._appendSignedMessage({ type: 'server_join', serverTopicHex: topicHex, timestamp: Date.now() }); await network._reloadCores(); } export async function deleteServer(network, topicHex) { await network._appendSignedMessage({ type: 'server_delete', serverTopicHex: topicHex, timestamp: Date.now() }); await network._wipeLocalServerData(topicHex); } export async function leaveServer(network, topicHex) { await network._appendSignedMessage({ type: 'server_leave', serverTopicHex: topicHex, timestamp: Date.now() }); await network._wipeLocalServerData(topicHex); } export async function sendServerInvite(network, targetKey, serverTopicHex) { const server = network.servers.find(s => s.topicHex === serverTopicHex); if (!server) return; await network._appendEncryptedMessage(targetKey, { id: generateUUID(), type: 'server_invite', timestamp: Date.now(), inviterName: network.displayName, serverName: server.name, serverIcon: server.icon, serverTopicHex: server.topicHex, serverOwner: server.owner, allowAnyoneToInvite: server.allowAnyoneToInvite, isGroupChat: server.isGroupChat, channels: server.channels }); } export async function sendGroupChatAdd(network, targetKey, serverTopicHex) { const server = network.servers.find(s => s.topicHex === serverTopicHex); if (!server) return; await network._appendEncryptedMessage(targetKey, { id: generateUUID(), type: 'group_chat_add', timestamp: Date.now(), topicHex: server.topicHex, name: server.name, icon: server.icon, owner: server.owner, channels: server.channels }); } export async function updateServerSettings(network, serverTopicHex, name, icon, allowAnyoneToInvite, channels) { await network._appendSignedMessage({ type: 'server_settings_update', serverTopicHex, name, icon, allowAnyoneToInvite, channels, timestamp: Date.now() }); const server = network.servers.find(s => s.topicHex === serverTopicHex); if (server) { if (name !== undefined) server.name = name; if (icon !== undefined) server.icon = icon; if (allowAnyoneToInvite !== undefined) server.allowAnyoneToInvite = allowAnyoneToInvite; if (channels !== undefined) server.channels = channels; await network.serverDb.put(serverTopicHex, server); network._emitServers(); } }