working messages!!@!@
All checks were successful
Android Build / publish (push) Successful in 31s
Linux Build / publish (push) Successful in 51s

This commit is contained in:
olcxja 2026-06-02 12:53:41 +02:00
commit 92edb123f3
8 changed files with 189 additions and 18 deletions

View file

@ -1645,6 +1645,7 @@ async function gotoHome() {
switchRoomContent("title.splash", splashScreen, false);
switchRoomsBar("title.home", homeRoomBar);
setActiveRoombarItem(null);
setupWebSocket();
await refreshDms(210);
}
@ -1852,7 +1853,7 @@ async function openDm(dmId, username, targetId) {
let msgContainer = document.getElementById("chat-messages");
if (msgContainer) {
msgContainer.innerHTML = `<div style="text-align: center; opacity: 0.5; padding: 1rem;"><blah>desc.messages.encryption.active</blah></div>`;
msgContainer.innerHTML = `<div style="text-align: center; opacity: 0.5; padding: 1rem;"><blah>desc.messages.loading</blah></div>`;
let blahTags = msgContainer.getElementsByTagName("blah");
for (let i = 0; i < blahTags.length; i++) {
blahTags[i].innerHTML = processBlah(blahTags[i].innerHTML);
@ -1861,6 +1862,15 @@ async function openDm(dmId, username, targetId) {
await loadDmMessages(dmId);
if (dmMessagePollInterval) clearInterval(dmMessagePollInterval);
dmMessagePollInterval = setInterval(() => {
if (currentDmId === dmId) {
loadDmMessages(dmId);
} else {
clearInterval(dmMessagePollInterval);
}
}, 15000);
setActiveRoombarItem(`dm-btn-${dmId}`);
clearAction("dmopen");
} catch (e) {
@ -1906,7 +1916,8 @@ async function renderMessages(messages) {
if (msg.key && msg.key !== "") {
try {
content = await decryptAesGcmFromBase64(content, currentDmKey);
let dmKeyBytes = await sha256Bytes(base64ToUint8(currentDmKey));
content = await decryptAesGcmFromBase64(content, dmKeyBytes);
} catch(e) {
content = `<span style="color:var(--error-color)"><blah>error:messages.decrypt.failed</blah></span>`;
}
@ -1957,4 +1968,79 @@ async function renderMessages(messages) {
container.innerHTML = html;
container.scrollTop = container.scrollHeight;
}
async function sendMessage() {
if (!currentDmId || !currentDmKey) return;
let input = document.getElementById("chat-input");
let content = input.value.trim();
if (!content) return;
try {
let dmKeyBytes = await sha256Bytes(base64ToUint8(currentDmKey));
let encryptedContent = await encryptAesGcmToBase64(content, dmKeyBytes);
let msgPayload = {
string1: currentDmId,
string2: encryptedContent,
string3: ""
};
input.value = "";
let res = await fetchEncrypted("dm/message/send", JSON.stringify(msgPayload));
if (res && res.startsWith("error:")) {
showBlahNotification(res);
} else {
await loadDmMessages(currentDmId);
}
} catch (e) {
console.error(e);
showBlahNotification("error:message.send.failed");
}
}
function handleChatInputKey(event) {
if (event.key === "Enter" && !event.shiftKey) {
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
if (!isMobile) {
event.preventDefault();
sendMessage();
}
}
}
let dmMessagePollInterval = null;
let appWebSocket = null;
function setupWebSocket() {
if (appWebSocket && appWebSocket.readyState === WebSocket.OPEN) return;
let wsUrl = url.replace(/^http/, "ws") + "/ws";
appWebSocket = new WebSocket(wsUrl);
appWebSocket.onopen = async () => {
try {
let nonce = await getNonce(id, passwordHash);
let secretEnc = await encryptWithNonce(passwordHash, passwordHash, nonce);
appWebSocket.send(JSON.stringify({ string1: id, string2: secretEnc }));
} catch (e) {
console.error("WS auth failed", e);
}
};
appWebSocket.onmessage = (event) => {
let data = event.data;
if (data.startsWith("dm_message:")) {
let msgDmId = data.substring("dm_message:".length);
if (currentDmId === msgDmId) {
loadDmMessages(msgDmId);
}
}
};
appWebSocket.onclose = () => {
setTimeout(setupWebSocket, 5000);
};
}