/* ============================================================ 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, server_id FROM accounts WHERE username = ?", [username], ); if (!rows.length) return; const ingameName = rows[0].ingame_name; socket.user = ingameName; socket.serverId = rows[0].server_id; 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 };