95 lines
2.0 KiB
JavaScript
95 lines
2.0 KiB
JavaScript
const Notification = require("../models/Notification");
|
|
|
|
class NotificationManager {
|
|
constructor() {
|
|
this.io = null;
|
|
}
|
|
|
|
init(io) {
|
|
this.io = io;
|
|
console.log("[NotificationManager] Initialized with Socket.io");
|
|
}
|
|
|
|
async send({
|
|
playerId,
|
|
type = "info",
|
|
title,
|
|
message,
|
|
data = {},
|
|
priority = "normal",
|
|
}) {
|
|
try {
|
|
const notification = await Notification.create({
|
|
playerId,
|
|
type,
|
|
title,
|
|
message,
|
|
data,
|
|
priority,
|
|
isRead: false,
|
|
});
|
|
|
|
const targetSocket = this._getSocketByPlayerId(playerId);
|
|
|
|
if (targetSocket) {
|
|
targetSocket.emit("notification:new", notification);
|
|
|
|
const unreadCount = await this.getUnreadCount(playerId);
|
|
targetSocket.emit("notifications:unread_count", unreadCount);
|
|
}
|
|
|
|
return notification;
|
|
} catch (error) {
|
|
console.error(
|
|
`[NotificationManager] Error sending to ${playerId}:`,
|
|
error,
|
|
);
|
|
}
|
|
}
|
|
|
|
_getSocketByPlayerId(playerId) {
|
|
if (!this.io) return null;
|
|
return [...this.io.sockets.sockets.values()].find(
|
|
(s) => s.user?.id === playerId,
|
|
);
|
|
}
|
|
async getPlayerHistory(playerId, limit = 50) {
|
|
return await Notification.findAll({
|
|
where: { playerId },
|
|
order: [["createdAt", "DESC"]],
|
|
limit,
|
|
});
|
|
}
|
|
|
|
async getUnreadCount(playerId) {
|
|
return await Notification.count({
|
|
where: { playerId, isRead: false },
|
|
});
|
|
}
|
|
|
|
async markAsRead(notificationId, playerId) {
|
|
await Notification.update(
|
|
{ isRead: true },
|
|
{ where: { id: notificationId, playerId } },
|
|
);
|
|
return await this.getUnreadCount(playerId);
|
|
}
|
|
|
|
async markAllAsRead(playerId) {
|
|
await Notification.update(
|
|
{ isRead: true },
|
|
{ where: { playerId, isRead: false } },
|
|
);
|
|
return 0;
|
|
}
|
|
|
|
async delete(notificationId, playerId) {
|
|
await Notification.destroy({
|
|
where: { id: notificationId, playerId },
|
|
});
|
|
return await this.getUnreadCount(playerId);
|
|
}
|
|
}
|
|
|
|
module.exports = new NotificationManager();
|