Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f0137f3fa3 |
@@ -457,8 +457,22 @@ export function enqueueChatMessage(msg) {
|
|||||||
state.chatMessageFlushTimer = scheduleFlush(flushQueuedChatMessages);
|
state.chatMessageFlushTimer = scheduleFlush(flushQueuedChatMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 后台恢复时公屏最大渲染条数,避免暴刷 */
|
/**
|
||||||
const MAX_BURST_RENDER = 50;
|
* 判断是否为普通用户聊天消息(非系统/游戏通知)。
|
||||||
|
*/
|
||||||
|
function isUserChatMessage(msg) {
|
||||||
|
if (!msg || !msg.from_user) return false;
|
||||||
|
const u = msg.from_user;
|
||||||
|
if (SYSTEM_USERS.includes(u)) return false;
|
||||||
|
if (u.endsWith("播报")) return false;
|
||||||
|
if (u === "百家乐" || u === "跑马") return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 后台恢复时系统通知最多保留条数 */
|
||||||
|
const MAX_SYSTEM_BURST = 20;
|
||||||
|
/** 后台恢复时超过该时间的系统通知直接丢弃(分钟) */
|
||||||
|
const MAX_SYSTEM_AGE_MINUTES = 10;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分批渲染待处理消息,给动画、输入和滚动留出主线程时间。
|
* 分批渲染待处理消息,给动画、输入和滚动留出主线程时间。
|
||||||
@@ -469,21 +483,53 @@ export function flushQueuedChatMessages() {
|
|||||||
|
|
||||||
state.chatMessageFlushTimer = null;
|
state.chatMessageFlushTimer = null;
|
||||||
|
|
||||||
// 大批量消息堆积(后台标签页恢复)时,丢弃早于 MAX_BURST_RENDER 的消息,
|
// 大批量消息堆积(后台标签页恢复)时,保留所有用户聊天记录,
|
||||||
// 插入一条省略提示,避免用户一回来就看到满屏消息狂刷。
|
// 但过时的系统/游戏通知只保留最近 MAX_SYSTEM_BURST 条。
|
||||||
if (state.pendingChatMessages.length > MAX_BURST_RENDER + 20) {
|
if (state.pendingChatMessages.length > MAX_SYSTEM_BURST + 30) {
|
||||||
const skipped = state.pendingChatMessages.length - MAX_BURST_RENDER;
|
const now = Date.now();
|
||||||
state.pendingChatMessages.splice(0, skipped);
|
const maxAge = MAX_SYSTEM_AGE_MINUTES * 60 * 1000;
|
||||||
|
const totalSystem = state.pendingChatMessages.filter((m) => !isUserChatMessage(m)).length;
|
||||||
|
let systemSeen = 0;
|
||||||
|
let dropped = 0;
|
||||||
|
|
||||||
const container = state.container;
|
const filtered = state.pendingChatMessages.filter((msg) => {
|
||||||
if (container) {
|
if (isUserChatMessage(msg)) return true;
|
||||||
const notice = document.createElement("div");
|
|
||||||
notice.className = "msg-line msg-burst-notice";
|
systemSeen++;
|
||||||
notice.style.cssText =
|
|
||||||
"text-align:center;padding:6px 0;margin:4px 0;font-size:12px;color:#94a3b8;border-top:1px dashed #d1d5db;border-bottom:1px dashed #d1d5db;";
|
// 超过10分钟的系统通知直接丢弃
|
||||||
notice.textContent = `⏫ 省略了 ${skipped} 条未读消息`;
|
let msgTime = 0;
|
||||||
container.appendChild(notice);
|
if (msg.sent_at) {
|
||||||
|
msgTime = new Date(msg.sent_at.replace(" ", "T")).getTime();
|
||||||
|
}
|
||||||
|
if (msgTime > 0 && now - msgTime > maxAge) {
|
||||||
|
dropped++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从旧到新遍历,只保留最后 MAX_SYSTEM_BURST 条系统通知
|
||||||
|
const remainingAfter = totalSystem - systemSeen;
|
||||||
|
if (remainingAfter >= MAX_SYSTEM_BURST) {
|
||||||
|
dropped++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dropped > 0) {
|
||||||
|
const container = state.container;
|
||||||
|
if (container) {
|
||||||
|
const notice = document.createElement("div");
|
||||||
|
notice.className = "msg-line msg-burst-notice";
|
||||||
|
notice.style.cssText =
|
||||||
|
"text-align:center;padding:6px 0;margin:4px 0;font-size:12px;color:#94a3b8;border-top:1px dashed #d1d5db;border-bottom:1px dashed #d1d5db;";
|
||||||
|
notice.textContent = `⏫ 省略了 ${dropped} 条系统通知`;
|
||||||
|
container.appendChild(notice);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.pendingChatMessages = filtered;
|
||||||
}
|
}
|
||||||
|
|
||||||
const batch = state.pendingChatMessages.splice(0, CHAT_MESSAGE_FLUSH_BATCH_SIZE);
|
const batch = state.pendingChatMessages.splice(0, CHAT_MESSAGE_FLUSH_BATCH_SIZE);
|
||||||
|
|||||||
Reference in New Issue
Block a user