dok/sockets/chat.js
2026-03-18 11:45:10 +00:00

90 lines
2.2 KiB
JavaScript

/* ============================================================
sockets/chat.js
Alle Socket-Events rund um Chat, Whisper & Online-Status
============================================================ */
const db = require("../database/database");
const onlineUsers = {}; // ingameName → socketId
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;
io.emit("onlineUsers", Object.keys(onlineUsers));
});
/* ── 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: aus Online-Liste entfernen ── */
socket.on("disconnect", () => {
if (socket.user) {
delete onlineUsers[socket.user];
io.emit("onlineUsers", Object.keys(onlineUsers));
}
});
}
module.exports = { registerChatHandlers };