dok/sockets/chat.js
2026-04-10 11:20:51 +01:00

88 lines
2.1 KiB
JavaScript

/* ============================================================
sockets/chat.js
Alle Socket-Events rund um Chat, Whisper & Online-Status
============================================================ */
const db = require("../database/database");
const onlineUsers = {}; // ingameName → socketId (wird für Whisper benötigt)
function registerChatHandlers(io, socket) {
/* ── Registrierung ── */
socket.on("register", async (username) => {
const [rows] = await db.query(
"SELECT ingame_name FROM accounts WHERE username = ?",
[username],
);
if (!rows.length) return;
const ingameName = rows[0].ingame_name;
socket.user = ingameName;
onlineUsers[ingameName] = socket.id;
});
/* ── Chat-Nachrichten ── */
socket.on("chatMessage", (data) => {
if (data.channel === "global") {
io.emit("chatMessage", {
user: socket.user,
message: data.message,
channel: "global",
});
}
if (data.channel === "guild") {
io.to("guild_" + data.guild).emit("chatMessage", {
user: socket.user,
message: data.message,
channel: "guild",
});
}
});
/* ── Flüstern ── */
socket.on("whisper", (data) => {
const targetSocket = onlineUsers[data.to];
if (!targetSocket) {
socket.emit("systemMessage", { message: data.to + " ist offline" });
return;
}
io.to(targetSocket).emit("chatMessage", {
user: socket.user,
message: data.message,
channel: "private",
});
socket.emit("chatMessage", {
user: "(an " + data.to + ")",
message: data.message,
channel: "private",
});
});
/* ── Private Nachricht ── */
socket.on("privateMessage", (data) => {
const target = onlineUsers[data.to];
if (target) {
io.to(target).emit("chatMessage", {
user: socket.user,
message: data.message,
channel: "private",
});
}
});
/* ── Disconnect ── */
socket.on("disconnect", () => {
if (socket.user) {
delete onlineUsers[socket.user];
}
});
}
module.exports = { registerChatHandlers };