修复自动钓鱼状态与播报屏蔽范围

This commit is contained in:
pllx
2026-04-29 16:51:28 +08:00
parent 449894e3e5
commit 6748fbc44e
3 changed files with 48 additions and 31 deletions
+28 -12
View File
@@ -50,19 +50,12 @@ function appendFishingMessage(html) {
return;
}
const blockedSet = window.chatState?.blockedSystemSenders;
const isBlocked = blockedSet instanceof Set && blockedSet.has("钓鱼播报");
const line = document.createElement("div");
line.className = "msg-line";
line.dataset.blockKey = "钓鱼播报";
if (isBlocked) {
line.dataset.blockHidden = "1";
line.style.display = "none";
}
line.innerHTML = html;
container.appendChild(line);
if (!isBlocked && shouldAutoScroll()) {
if (shouldAutoScroll()) {
container.scrollTop = container.scrollHeight;
}
}
@@ -233,6 +226,8 @@ function hasActiveFishingSession() {
* @returns {void}
*/
function startAutoFishingCooldown(cooldown) {
clearAutoFishingTimers();
const endTime = Date.now() + cooldown * 1000;
setFishingButton(`⏳ 冷却 ${cooldown}s`, true);
showAutoFishStopButton(cooldown);
@@ -254,10 +249,13 @@ function startAutoFishingCooldown(cooldown) {
const checkEnd = () => {
if (Date.now() >= endTime) {
autoFishCooldownTimer = null;
hideAutoFishStopButton();
if (autoFishing) {
updateAutoFishStopButtonCountdown(0, "正在继续自动钓鱼");
void startFishing();
return;
}
hideAutoFishStopButton();
return;
}
autoFishCooldownTimer = window.setTimeout(checkEnd, 200);
@@ -272,7 +270,9 @@ function startAutoFishingCooldown(cooldown) {
* @returns {void}
*/
function showAutoFishStopButton(cooldown) {
if (document.getElementById("auto-fish-stop-btn")) {
const currentButton = document.getElementById("auto-fish-stop-btn");
if (currentButton) {
updateAutoFishStopButtonCountdown(cooldown);
return;
}
@@ -304,16 +304,17 @@ function showAutoFishStopButton(cooldown) {
* 同步更新停止自动钓鱼浮层上的冷却秒数,避免与主按钮倒计时不一致。
*
* @param {number} cooldown
* @param {string|null} text
* @returns {void}
*/
function updateAutoFishStopButtonCountdown(cooldown) {
function updateAutoFishStopButtonCountdown(cooldown, text = null) {
const hint = document.querySelector("#auto-fish-stop-btn .drag-hint");
if (!(hint instanceof HTMLElement)) {
return;
}
hint.textContent = `冷却 ${Number(cooldown) || 0}s · 可拖动`;
hint.textContent = text || `冷却 ${Number(cooldown) || 0}s · 可拖动`;
}
/**
@@ -425,6 +426,12 @@ export async function startFishing() {
const data = await response.json();
if (!response.ok || data.status !== "success") {
if (autoFishing && response.status === 429) {
// 服务端冷却 TTL 可能与前端倒计时有毫秒级误差,自动模式下按服务端剩余时间续等。
startAutoFishingCooldown(Math.max(1, Number(data.cooldown) || 1));
return;
}
window.chatDialog?.alert?.(data.message || "钓鱼失败", "操作失败", "#cc4444");
setFishingButton("🎣 钓鱼", false);
return;
@@ -439,11 +446,20 @@ export async function startFishing() {
const bobber = createBobber(data.bobber_x, data.bobber_y);
document.body.appendChild(bobber);
if (data.auto_fishing) {
showAutoFishStopButton(0);
updateAutoFishStopButtonCountdown(0, "等待鱼儿上钩 · 可拖动");
}
fishingTimer = window.setTimeout(() => {
// 等待计时器触发后必须立即释放句柄,否则自动钓鱼冷却结束会误判仍有会话进行中。
fishingTimer = null;
bobber.classList.add("sinking");
bobber.textContent = "🐟";
if (data.auto_fishing) {
showAutoFishStopButton(0);
updateAutoFishStopButtonCountdown(0, "自动收竿中 · 可拖动");
appendFishingMessage(`<span style="color:#7c3aed;font-weight:bold;">🎣 自动钓鱼卡生效!自动收竿中... <span style="font-size:10px;opacity:0.7">(剩余${Number(data.auto_fishing_minutes_left) || 0}分钟)</span></span>`);
fishingReelTimeout = window.setTimeout(() => {
removeBobber();
+6 -6
View File
@@ -585,9 +585,13 @@ export function appendMessage(msg, renderBatch = null) {
}
const isMe = msg.from_user === window.chatContext?.username;
// 系统播报屏蔽只作用于公屏窗口;自己相关消息仍要进入包厢窗口,避免屏蔽误伤个人提示。
const isIdiomWinnerHistory = msg.action === "idiom_result" && msg.winner_username === window.chatContext?.username;
const isRelatedToMe = isMe || msg.is_secret || msg.to_user === window.chatContext?.username || isIdiomWinnerHistory;
const fontColor = msg.font_color || "#000000";
const blockRuleKey = resolveBlockedSystemSenderKey(msg);
const shouldHideByBlock = blockRuleKey ? state.blockedSystemSenders.has(blockRuleKey) : false;
const shouldApplyBlockRule = Boolean(blockRuleKey && !isRelatedToMe);
const shouldHideByBlock = shouldApplyBlockRule ? state.blockedSystemSenders.has(blockRuleKey) : false;
const div = document.createElement("div");
div.className = "msg-line";
@@ -598,7 +602,7 @@ export function appendMessage(msg, renderBatch = null) {
div.dataset.idiomRoundId = String(idiomRoundId);
div.dataset.quizRoundId = String(idiomRoundId);
}
if (blockRuleKey) {
if (shouldApplyBlockRule) {
div.dataset.blockKey = blockRuleKey;
}
@@ -848,10 +852,6 @@ export function appendMessage(msg, renderBatch = null) {
removeSameWelcome(renderBatch?.privateFragment);
}
// 路由规则:公众窗口(say1) — 别人的公聊消息;包厢窗口(say2) — 自己发的 + 悄悄话 + 对自己说的
const isIdiomWinnerHistory = msg.action === "idiom_result" && msg.winner_username === window.chatContext?.username;
const isRelatedToMe = isMe || msg.is_secret || msg.to_user === window.chatContext?.username || isIdiomWinnerHistory;
// 存点通知标记
const isAutoSave = (msg.from_user === "系统" || msg.from_user === "") &&
msg.content && (msg.content.includes("自动存点") || msg.content.includes("手动存点"));
+14 -13
View File
@@ -673,27 +673,28 @@ export function syncBlockedSystemSenderCheckboxes() {
*/
export function setRenderedMessagesVisibilityBySender(blockKey, hidden) {
const state = window.chatState;
[state?.container, state?.container2].forEach(targetContainer => {
if (!targetContainer) return;
const targetContainer = state?.container;
if (targetContainer) {
targetContainer.querySelectorAll("[data-block-key]").forEach(node => {
if (node.dataset.blockKey === blockKey) {
if (hidden) {
node.dataset.blockHidden = "1";
node.style.display = "none";
} else if (node.dataset.blockHidden === "1") {
node.removeAttribute("data-block-hidden");
node.style.display = "";
}
if (node.dataset.blockKey !== blockKey) {
return;
}
// 屏蔽项只清理公屏已有播报,包厢窗口保留用户自己的钓鱼过程和结果提示。
if (hidden) {
node.dataset.blockHidden = "1";
node.style.display = "none";
} else if (node.dataset.blockHidden === "1") {
node.removeAttribute("data-block-hidden");
node.style.display = "";
}
});
});
}
if (!hidden && state?.autoScroll) {
const container = state.container;
const container2 = state.container2;
if (container) container.scrollTop = container.scrollHeight;
if (container2) container2.scrollTop = container2.scrollHeight;
}
}