fix(chat): correct legacy payout tip when unavailable

This commit is contained in:
2026-10-21 16:16:53 -04:00
parent 86ed262628
commit 6fca51695b
3 changed files with 119 additions and 5 deletions
+2 -1
View File
@@ -25,6 +25,7 @@ class ChatHandler {
this.chatHistory = new ChatHistoryManager({
db: db || (gameModeManager?.db),
debugManager: debugManager,
gameModeManager,
maxHistoryMessages: 50
});
@@ -453,4 +454,4 @@ class ChatHandler {
}
}
module.exports = ChatHandler;
module.exports = ChatHandler;
+29 -4
View File
@@ -3,10 +3,16 @@
* Handles persistent storage and retrieval of chat messages
*/
const { isWowPaymentsPaused } = require('../config/operatedProductProfiles');
const LEGACY_PAYOUT_TIP = 'Escape the dungeon to win. Collect treasure for bonus payout!';
const NO_PAYOUT_TIP = 'Escape the dungeon to win. Treasure can improve your score.';
class ChatHistoryManager {
constructor({ db, debugManager, maxHistoryMessages = 50, inMemoryFallbackSize = 100 }) {
constructor({ db, debugManager, gameModeManager = null, maxHistoryMessages = 50, inMemoryFallbackSize = 100 }) {
this.db = db;
this.debugManager = debugManager;
this.gameModeManager = gameModeManager;
this.maxHistoryMessages = maxHistoryMessages;
// In-memory fallback for when DB is not available
@@ -23,6 +29,25 @@ class ChatHistoryManager {
this._maxMessageAge = 7 * 24 * 60 * 60 * 1000; // 7 days in ms
}
_presentMessage(message) {
// Migration 011 seeded this one system tip before free/prestige-only policy existed.
// Keep the stored row intact and leave player-authored copies untouched.
if (message.socketId !== 'system' || message.username !== 'SERVER'
|| message.type !== 'system' || message.message !== LEGACY_PAYOUT_TIP) return message;
const manager = this.gameModeManager;
if (!manager || typeof manager.isPayoutEnabledForMode !== 'function') return message;
let payoutAvailable = false;
try {
payoutAvailable = !isWowPaymentsPaused(process.env) && manager.paymentsEnabled && (
(manager.directModeEnabled && manager.isPayoutEnabledForMode('PAID_SINGLE'))
|| (manager.creditsModeEnabled && manager.isPayoutEnabledForMode('PAID_CREDITS'))
);
} catch (_) {
// A failed policy read cannot justify advertising an old payout promise.
}
return payoutAvailable ? message : { ...message, message: NO_PAYOUT_TIP };
}
/**
* Initialize the manager - load recent messages into cache
*/
@@ -206,7 +231,7 @@ class ChatHistoryManager {
LIMIT $1
`, [maxCount, minCount]);
return result.rows.map(row => ({
return result.rows.map(row => this._presentMessage({
id: row.id,
socketId: row.socket_id,
username: row.username,
@@ -225,13 +250,13 @@ class ChatHistoryManager {
if (this._cacheInitialized && this._recentMessagesCache.length > 0) {
const activeMessages = this._recentMessagesCache.filter(m => !m.deletedAt);
return activeMessages.slice(-limit);
return activeMessages.slice(-limit).map(message => this._presentMessage(message));
}
// Final fallback to in-memory
if (this._inMemoryHistory.length > 0) {
const activeMessages = this._inMemoryHistory.filter(m => !m.deletedAt);
return activeMessages.slice(-limit);
return activeMessages.slice(-limit).map(message => this._presentMessage(message));
}
return [];