Client/game-server/src/game/ChatManager.js
2026-04-03 03:56:14 +03:00

95 lines
2.3 KiB
JavaScript

const Player = require("../models/Player");
const { Op } = require("sequelize");
const Message = require("../models/Message.js");
class ChatManager {
async getGlobalHistory(limit = 50) {
try {
return await Message.findAll({
where: { type: "global" },
limit,
order: [["createdAt", "ASC"]],
include: [
{
model: Player,
as: "sender",
attributes: ["username"],
},
],
});
} catch (error) {
console.error("History Error:", error);
return [];
}
}
async saveMessage({ content, type, senderId, receiverId = null }) {
try {
const newMessage = await Message.create({
content,
type,
senderId,
receiverId,
});
const sender = await Player.findByPk(senderId, {
attributes: ["username"],
});
return {
id: newMessage.id,
content: newMessage.content,
type: newMessage.type,
senderId: newMessage.senderId,
senderName: sender ? sender.username : "Unknown",
receiverId: newMessage.receiverId,
createdAt: newMessage.createdAt,
};
} catch (error) {
console.error("Save Message Error:", error);
throw error;
}
}
async getPrivateHistory(myId, friendId, limit = 50) {
try {
return await Message.findAll({
where: {
type: "private",
[Op.or]: [
{ senderId: myId, receiverId: friendId },
{ senderId: friendId, receiverId: myId },
],
},
limit,
order: [["createdAt", "ASC"]],
include: [
{
model: Player,
as: "sender",
attributes: ["username"],
},
],
});
} catch (error) {
console.error("Private History Error:", error);
return [];
}
}
async searchPlayers(query, excludeId) {
try {
return await Player.findAll({
where: {
username: { [Op.like]: `%${query}%` },
id: { [Op.ne]: excludeId },
},
attributes: ["id", "username", "level"],
limit: 10,
});
} catch (error) {
console.error("Search Error:", error);
return [];
}
}
}
module.exports = new ChatManager();