diff --git a/agent.user.js b/agent.user.js index 050c59f..4938a15 100644 --- a/agent.user.js +++ b/agent.user.js @@ -56,6 +56,40 @@ delay: (ms) => new Promise(resolve => setTimeout(resolve, ms)), }; + + // ====== DOM helpers ====== + TL.ui = { + isVisible: (el) => { + if (!el) return false; + const cs = getComputedStyle(el); + if (cs.display === 'none' || cs.visibility === 'hidden' || cs.opacity === '0') return false; + return (el.offsetWidth + el.offsetHeight) > 0; + }, + + isDisabled: (el) => { + return el?.disabled === true || el?.getAttribute('aria-disabled') === 'true'; + }, + + isInViewport: (el) => { + if (!el) return false; + const rect = el.getBoundingClientRect(); + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && + rect.right <= (window.innerWidth || document.documentElement.clientWidth) + ); + }, + + click: (el) => { + if (el && typeof el.click === 'function') el.click(); + }, + + scrollToView: (el, behavior = 'smooth') => { + el?.scrollIntoView?.({ behavior, block: 'center' }); + }, + }; + // ====== Network helpers (GM_xmlhttpRequest) ====== TL.net = { gmRequest(url, init = {}) { @@ -175,6 +209,35 @@ } + // ====== BINANCE (isLoggedIn) ====== + const BINANCE = { + detectLoginState: () => { + const loginBtn = document.querySelector('#toLoginPage'); + const regBtn = document.querySelector('#toRegisterPage'); + + if (TL.dom.isVisible?.(loginBtn) || TL.dom.isVisible?.(regBtn)) return false; + if (!loginBtn && !regBtn) return true; + + return null; // đang load hoặc chưa rõ + }, + + isLoggedIn: async (timeoutMs = 6000, pollMs = 200) => { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + const state = BINANCE.detectLoginState(); + if (state !== null) { + TL.log(`[BINANCE] isLoggedIn => ${state ? 'true' : 'false'}`); + return state; + } + await TL.delay(pollMs); + } + + const fallback = BINANCE.detectLoginState() ?? false; + TL.log(`[BINANCE] isLoggedIn (timeout, fallback) => ${fallback ? 'true' : 'false'}`); + return fallback; + }, + }; + // ====== Main ====== async function welcome_message() { @@ -183,7 +246,7 @@ const res = await BAF.ping(); const resStr = `Server: ${s.label} (${s.url})\n` + - `Status: ${res.ok ? 'Connected ✅' : 'Failed ❌'} (${res.status})`; + `Status: ${res.ok ? 'Connected ✅' : 'Failed ❌'} (${res.status})`; TL.log(resStr); }