Peercord/Peercord Source/src/p2p/modules/servers.js
0% [█ █ █ █ █ █ █ █ █ █] 100% 29e61f07f2 Full source
2026-06-14 21:28:04 -05:00

104 lines
3.6 KiB
JavaScript

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();
}
}