방금 먹은 크래커 양을 🍪로 표시하며, 중복 감지를 방지하고 스타일을 강조합니다.
// ==UserScript==
// @name 크래커 차감 팝업 표시기🍪
// @namespace http://tampermonkey.net/
// @version 1.4
// @description 방금 먹은 크래커 양을 🍪로 표시하며, 중복 감지를 방지하고 스타일을 강조합니다.
// @match https://crack.wrtn.ai/*
// @grant GM_addStyle
// @license MIT
// ==/UserScript==
(function () {
'use strict';
console.log("[Cracker Delta Popup] 스크립트 시작됨");
const LAST_KEY = 'wrtnCrackerLastValue';
const POS_LEFT_KEY = 'wrtnCrackerDeltaPopup_left';
const POS_TOP_KEY = 'wrtnCrackerDeltaPopup_top';
const popup = document.createElement('div');
popup.id = 'crackerDeltaPopup';
popup.innerHTML = `
<div style="font-weight:bold; margin-bottom:4px;">[방금 먹은 🍪양]</div>
<div id="crackerDeltaAmount">-</div>
`;
document.body.appendChild(popup);
GM_addStyle(`
#crackerDeltaPopup {
position: fixed;
background: #fff3e0;
color: #bf360c;
border: 1px solid #ffcc80;
border-radius: 10px;
padding: 10px 14px;
font-size: 14px;
z-index: 99999;
font-weight: bold;
cursor: move;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
user-select: none;
max-width: 220px;
}
#crackerDeltaAmount {
font-size: 21px; /* 1.5배 크기 */
color: red;
}
`);
let isDragging = false;
let offsetX = 0, offsetY = 0;
let lastShown = 0; // ✅ 이전에 표시한 값 저장용
popup.addEventListener('mousedown', (e) => {
if (e.button !== 0) return;
isDragging = true;
const rect = popup.getBoundingClientRect();
offsetX = e.clientX - rect.left;
offsetY = e.clientY - rect.top;
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
});
function onMouseMove(e) {
if (!isDragging) return;
let left = e.clientX - offsetX;
let top = e.clientY - offsetY;
const maxW = window.innerWidth - popup.offsetWidth;
const maxH = window.innerHeight - popup.offsetHeight;
popup.style.left = Math.min(Math.max(0, left), maxW) + 'px';
popup.style.top = Math.min(Math.max(0, top), maxH) + 'px';
}
function onMouseUp() {
if (!isDragging) return;
isDragging = false;
document.removeEventListener('mousemove', onMouseMove);
document.removeEventListener('mouseup', onMouseUp);
localStorage.setItem(POS_LEFT_KEY, popup.offsetLeft);
localStorage.setItem(POS_TOP_KEY, popup.offsetTop);
}
function restorePopupPosition() {
const savedLeft = localStorage.getItem(POS_LEFT_KEY);
const savedTop = localStorage.getItem(POS_TOP_KEY);
if (savedLeft && savedTop) {
popup.style.left = savedLeft + 'px';
popup.style.top = savedTop + 'px';
} else {
popup.style.left = '20px';
popup.style.top = '200px';
}
}
function getCrackerCount() {
const allP = document.querySelectorAll('p[color="text_primary"]');
for (const p of allP) {
const text = p.textContent?.trim();
if (text && /^\d+[,]?\d*$/.test(text)) {
return parseInt(text.replace(/[^0-9]/g, ''), 10);
}
}
return null;
}
function updateDelta() {
const now = getCrackerCount();
if (now === null) return;
const prev = parseInt(localStorage.getItem(LAST_KEY) || now.toString(), 10);
const diff = prev - now;
if (now < prev && diff !== lastShown) {
document.getElementById('crackerDeltaAmount').textContent = `🍪${diff}개`;
lastShown = diff;
}
if (now > prev) {
// 크래커가 충전되었거나 복구된 경우 초기화
lastShown = 0;
}
localStorage.setItem(LAST_KEY, now.toString());
}
restorePopupPosition();
setInterval(updateDelta, 1000);
})();