Enhance agent.user.js by implementing a timer system for session management, including start, pause, and stop functionalities. Introduce new session keys for timer state and accumulated time, and update the dashboard overlay to display timer information. Refactor task handling to improve clarity and maintainability.
This commit is contained in:
518
agent.user.js
518
agent.user.js
@@ -34,10 +34,14 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
SESSION_ID: 'aRah9OhHeijee6sho3baequu9phoovah',
|
||||
SESSION_BINDED: 'Oos2uoth2thae8Ir8iakahj1OohaMahb',
|
||||
SESSION_TOKEN: 'ThiegiecohViuZ1Iecio7gahphiechub',
|
||||
SESSION_INITIALIZED: 'iR4choo2Ieg2ew0ogheeyaer8Aisheet',
|
||||
BOT_STATUS: 'wiethie3boGhoh3iegh3ohnezei2tauj',
|
||||
CURRENT_TASK: 'Reebo1eitahh2aotumai5jae1neetoh3',
|
||||
CURRENT_TASK_DATA: 'cheishailoh5keePoo6oe2Quie1gaxah',
|
||||
CURRENT_STEP: 'eDusaidu2hooweiMoonahng3fua7aoso',
|
||||
TIMER_START_TIME: 'einguh3eshuiqua7Ux7thaNgai5Axahy',
|
||||
TIMER_IS_RUNNING: 'iengoose3vie2aikePhooCaPheeceizu',
|
||||
TIMER_ACCUMULATED: 'aeMaiwae3PohB5Soshaech8eegh5quoo',
|
||||
}
|
||||
|
||||
if (!sessionStorage.getItem(SESSION_STORAGE_KEYS.SESSION_ID)) {
|
||||
@@ -50,13 +54,13 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
DASHBOARD_UPDATE_INTERVAL: 500, // Update dashboard overlay every 0.5 seconds
|
||||
TASK_INTERVAL: 10_000, // Check for new task every 10 seconds
|
||||
REQUEST_TIMEOUT: 10_000, // Request timeout in milliseconds (10 seconds)
|
||||
DEBUG_MILESTONE: true, // Show milestone debug logs
|
||||
SERVERS: {
|
||||
local: { label: '🏠 Local', url: 'http://localhost:3000' },
|
||||
prod: { label: '🌐 Prod', url: 'https://baf.thuanle.me' },
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
const AppSession = {
|
||||
SESSION_ID: sessionStorage.getItem(SESSION_STORAGE_KEYS.SESSION_ID),
|
||||
|
||||
@@ -66,11 +70,14 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
getSessionToken: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.SESSION_TOKEN),
|
||||
setSessionToken: token => sessionStorage.setItem(SESSION_STORAGE_KEYS.SESSION_TOKEN, token),
|
||||
|
||||
getSessionStatus: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.BOT_STATUS) || AppEnums.BOT_STATUS.STOP,
|
||||
getSessionStatus: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.BOT_STATUS),
|
||||
setSessionStatus: status => sessionStorage.setItem(SESSION_STORAGE_KEYS.BOT_STATUS, status),
|
||||
|
||||
getSessionInitialized: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.SESSION_INITIALIZED) === 'true',
|
||||
setSessionInitialized: initialized => sessionStorage.setItem(SESSION_STORAGE_KEYS.SESSION_INITIALIZED, initialized ? 'true' : 'false'),
|
||||
|
||||
// Task state - Trạng thái task hiện tại (lưu trong sessionStorage)
|
||||
getCurrentTask: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.CURRENT_TASK) || BAF_TASKS.NO_TASK,
|
||||
getCurrentTask: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.CURRENT_TASK),
|
||||
setCurrentTask: task => sessionStorage.setItem(SESSION_STORAGE_KEYS.CURRENT_TASK, task),
|
||||
|
||||
getCurrentTaskData: () => {
|
||||
@@ -79,15 +86,35 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
},
|
||||
setCurrentTaskData: data => sessionStorage.setItem(SESSION_STORAGE_KEYS.CURRENT_TASK_DATA, JSON.stringify(data)),
|
||||
|
||||
getCurrentStep: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.CURRENT_STEP) || BAF_TASKS.NO_STEP,
|
||||
getCurrentStep: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.CURRENT_STEP),
|
||||
setCurrentStep: step => sessionStorage.setItem(SESSION_STORAGE_KEYS.CURRENT_STEP, step),
|
||||
|
||||
initialize: async () => {
|
||||
try {
|
||||
const isInitialized = AppSession.getSessionInitialized();
|
||||
|
||||
if (!isInitialized) {
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.INITIALIZING);
|
||||
AppSession.setCurrentTask(BAF_TASKS.NO_TASK);
|
||||
AppSession.setCurrentStep(BAF_TASKS.NO_STEP);
|
||||
AppSession.setSessionInitialized(true);
|
||||
} else {
|
||||
}
|
||||
} catch (error) {
|
||||
TL.error('APP-SESSION', '1.2.4. Error during session initialization:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// ====== APP ENUMS ======
|
||||
const AppEnums = {
|
||||
BOT_STATUS: {
|
||||
INITIALIZING: 'initializing',
|
||||
STOP: 'stop',
|
||||
RUNNING: 'running',
|
||||
PAUSE: 'pause',
|
||||
WAITING_FOR_TASK: 'waiting_for_task',
|
||||
PERFORMING_TASK: 'performing_task',
|
||||
ERROR: 'error',
|
||||
},
|
||||
BOT_STARTUP_MODE: {
|
||||
@@ -115,7 +142,6 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
// Session flags - Flags cho session hiện tại (reset khi reload)
|
||||
menuCreated: false, // Menu đã được tạo
|
||||
popupInitialized: false, // Popup đã được khởi tạo
|
||||
appInitialized: false // App đã được khởi tạo hoàn toàn
|
||||
};
|
||||
|
||||
this.observers = new Map(); // Observer pattern cho state changes
|
||||
@@ -166,7 +192,6 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
getIsLoggedIn() { return this.data.is_logged_in; }
|
||||
getMenuCreated() { return this.data.menuCreated; }
|
||||
getPopupInitialized() { return this.data.popupInitialized; }
|
||||
getAppInitialized() { return this.data.appInitialized; }
|
||||
|
||||
/**
|
||||
* Cập nhật state với partial update
|
||||
@@ -284,6 +309,7 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
*/
|
||||
const TL = {
|
||||
debug: (tag, msg, ...args) => AppSettings.getDebug() && GM_log(`[TL] [DEBUG] [${new Date().toLocaleString()}] [${tag}] \n${msg}`, ...args),
|
||||
milestone: (tag, msg, ...args) => CONFIG.DEBUG_MILESTONE && GM_log(`[TL] [MILESTONE] [${new Date().toLocaleString()}] [${tag}] 🎯\n${msg}`, ...args),
|
||||
log: (tag, msg, ...args) => GM_log(`[TL] [LOG] [${new Date().toLocaleString()}] [${tag}] \n${msg}`, ...args),
|
||||
warn: (tag, msg, ...args) => GM_log(`[TL] [WARN] [${new Date().toLocaleString()}] [${tag}] ⚠️\n${msg}`, ...args),
|
||||
error: (tag, msg, ...args) => GM_log(`[TL] [ERROR] [${new Date().toLocaleString()}] [${tag}] ❌\n${msg}`, ...args),
|
||||
@@ -352,7 +378,7 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
* Navigate to URL với option forceReload
|
||||
* @param {string} url - URL cần navigate
|
||||
*/
|
||||
navigate: (url) => {
|
||||
navigateTo: (url) => {
|
||||
window.location.href = url;
|
||||
}
|
||||
},
|
||||
@@ -419,11 +445,16 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
|
||||
const BAF_TASKS = {
|
||||
NO_TASK: 'no_task',
|
||||
|
||||
LOGIN: 'login',
|
||||
WALLET_SPOT: 'wallet_spot',
|
||||
WALLET_FUNDING: 'wallet_funding',
|
||||
WALLET_EARN: 'wallet_earn',
|
||||
ALPHA_SWAP: 'alpha_swap',
|
||||
ALPHA_ORDER_HISTORY: 'alpha_order_history',
|
||||
NO_STEP: 'no_step',
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
const BAF = {
|
||||
_getHost: () => AppState.getServer()?.url,
|
||||
@@ -630,7 +661,10 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
|
||||
// Create dashboard overlay element
|
||||
create: () => {
|
||||
|
||||
|
||||
if (AppUi.dashboardOverlay.element) {
|
||||
|
||||
document.body.removeChild(AppUi.dashboardOverlay.element);
|
||||
}
|
||||
|
||||
@@ -655,6 +689,36 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
user-select: none;
|
||||
`;
|
||||
|
||||
// Add close button (X)
|
||||
const closeBtn = document.createElement('div');
|
||||
closeBtn.style.cssText = `
|
||||
position: absolute;
|
||||
top: -8px;
|
||||
left: -8px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: #dc3545;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
color: white;
|
||||
border: 2px solid rgba(255, 255, 255, 0.2);
|
||||
transition: all 0.2s ease;
|
||||
font-weight: bold;
|
||||
`;
|
||||
closeBtn.innerHTML = '×';
|
||||
closeBtn.title = 'Close popup';
|
||||
closeBtn.addEventListener('click', () => {
|
||||
AppUi.dashboardOverlay.hide();
|
||||
AppSettings.setPopupVisible(false);
|
||||
});
|
||||
TL.dom.setHover(closeBtn, 'mouseenter', { scale: 1.5, background: '#c82333' });
|
||||
TL.dom.setHover(closeBtn, 'mouseleave', { scale: 1, background: '#dc3545' });
|
||||
overlay.appendChild(closeBtn);
|
||||
|
||||
// Add position toggle button
|
||||
const positionBtn = document.createElement('div');
|
||||
positionBtn.style.cssText = `
|
||||
@@ -679,15 +743,18 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
positionBtn.addEventListener('click', () => {
|
||||
const newPosition = (AppSettings.getPopupPosition() % 4) + 1;
|
||||
AppSettings.setPopupPosition(newPosition);
|
||||
AppUi.statusOverlay.updatePosition();
|
||||
AppUi.dashboardOverlay.updatePosition();
|
||||
});
|
||||
TL.dom.setHover(positionBtn, 'mouseenter', { scale: 1.5, background: '#0056b3' });
|
||||
TL.dom.setHover(positionBtn, 'mouseleave', { scale: 1, background: '#007bff' });
|
||||
overlay.appendChild(positionBtn);
|
||||
|
||||
|
||||
AppUi.dashboardOverlay.element = overlay;
|
||||
|
||||
document.body.appendChild(overlay);
|
||||
|
||||
|
||||
return overlay;
|
||||
},
|
||||
|
||||
@@ -703,20 +770,37 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
// Update overlay content
|
||||
updateContent: () => {
|
||||
try {
|
||||
|
||||
|
||||
|
||||
if (!AppUi.dashboardOverlay.element) {
|
||||
AppUi.dashboardOverlay.create();
|
||||
}
|
||||
// Get status display
|
||||
let statusDisplay = '';
|
||||
switch (AppSession.getSessionStatus()) {
|
||||
case AppEnums.BOT_STATUS.RUNNING:
|
||||
statusDisplay = '▶️ Running';
|
||||
const currentStatus = AppSession.getSessionStatus();
|
||||
|
||||
switch (currentStatus) {
|
||||
case AppEnums.BOT_STATUS.INITIALIZING:
|
||||
statusDisplay = '🔄 Initializing';
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.STOP:
|
||||
statusDisplay = '⏹️ Stop';
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.PAUSE:
|
||||
statusDisplay = '⏸️ Pause';
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.WAITING_FOR_TASK:
|
||||
statusDisplay = '⏳ Waiting for Task';
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.PERFORMING_TASK:
|
||||
statusDisplay = '▶️ Performing Task';
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.ERROR:
|
||||
statusDisplay = '❌ Error';
|
||||
break;
|
||||
default:
|
||||
statusDisplay = '❌ Error';
|
||||
statusDisplay = '❓ Unknown';
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -741,16 +825,16 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
<div style="margin-bottom: 8px;"><strong>BAF Agent Dashboard</strong></div>
|
||||
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span id="safety-toggle-btn" style="color: ${safetyStatus.enabled ? '#28a745' : '#dc3545'}; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid ${safetyStatus.enabled ? '#28a745' : '#dc3545'}; background: ${safetyStatus.enabled ? 'rgba(40, 167, 69, 0.1)' : 'rgba(220, 53, 69, 0.1)'}; transition: all 0.2s ease;" title="Click to toggle safety status">🛟 Safety: ${safetyStatus.enabled ? '🛡️ Safe' : '🚨 Blocked'}</span>
|
||||
<span id="safety-toggle-btn-AithaiG2" style="color: ${safetyStatus.enabled ? '#28a745' : '#dc3545'}; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid ${safetyStatus.enabled ? '#28a745' : '#dc3545'}; background: ${safetyStatus.enabled ? 'rgba(40, 167, 69, 0.1)' : 'rgba(220, 53, 69, 0.1)'}; transition: all 0.2s ease;" title="Click to toggle safety status">🛟 Safety: ${safetyStatus.enabled ? '🛡️ Safe' : '🚨 Blocked'}</span>
|
||||
</div>
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span style="color: #6c757d; font-size: 11px;">🆔 Tab: ${AppSession.SESSION_ID.slice(-12)}</span>
|
||||
</div>
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span id="bot-status-toggle-btn" style="color: #007bff; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid #007bff; background: rgba(0, 123, 255, 0.1); transition: all 0.2s ease;" title="Click to toggle bot status">🤖 Bot Status: ${statusDisplay}</span>
|
||||
<span style="color: #007bff; padding: 2px 4px; background: rgba(0, 123, 255, 0.1);" title="Current bot status">🤖 Bot Status: ${statusDisplay}</span>
|
||||
</div>
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span id="startup-mode-toggle-btn" style="color: #ffc107; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid #ffc107; background: rgba(255, 193, 7, 0.1); transition: all 0.2s ease;" title="Click to toggle startup mode between auto and manual">🚀 Startup Mode: ${AppSettings.getBotStartupMode() === AppEnums.BOT_STARTUP_MODE.AUTO ? '🔄 Auto' : '✋ Manual'}</span>
|
||||
<span id="startup-mode-toggle-btn-tha9ieCa" style="color: #ffc107; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid #ffc107; background: rgba(255, 193, 7, 0.1); transition: all 0.2s ease;" title="Click to toggle startup mode between auto and manual">🚀 Startup Mode: ${AppSettings.getBotStartupMode() === AppEnums.BOT_STARTUP_MODE.AUTO ? '🔄 Auto' : '✋ Manual'}</span>
|
||||
</div>
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span style="color: #28a745;">📋 Task: ${AppSession.getCurrentTask() || 'None'}</span>
|
||||
@@ -765,14 +849,32 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
<span style="color: #6f42c1;">Page: ${pageDisplay}</span>
|
||||
</div>
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span id="server-toggle-btn" style="color: #e83e8c; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid #e83e8c; background: rgba(232, 62, 140, 0.1); transition: all 0.2s ease;" title="Click to switch between local and prod servers">🌐 Server: ${serverLabel} ${serverConnected}</span>
|
||||
<span id="server-toggle-btn-Youx4pho" style="color: #e83e8c; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid #e83e8c; background: rgba(232, 62, 140, 0.1); transition: all 0.2s ease;" title="Click to switch between local and prod servers">🌐 Server: ${serverLabel} ${serverConnected}</span>
|
||||
</div>
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span id="debug-toggle-btn" style="color: ${AppSettings.getDebug() ? '#17a2b8' : '#6c757d'}; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid ${AppSettings.getDebug() ? '#17a2b8' : '#6c757d'}; background: ${AppSettings.getDebug() ? 'rgba(23, 162, 184, 0.1)' : 'rgba(108, 117, 125, 0.1)'}; transition: all 0.2s ease;" title="Click to toggle debug mode">🐛 Debug: ${AppSettings.getDebug() ? '🔈 ON' : '🔇 OFF'}</span>
|
||||
<span id="debug-toggle-btn-Tai5guto" style="color: ${AppSettings.getDebug() ? '#17a2b8' : '#6c757d'}; cursor: pointer; padding: 2px 4px; border-radius: 3px; border: 1px solid ${AppSettings.getDebug() ? '#17a2b8' : '#6c757d'}; background: ${AppSettings.getDebug() ? 'rgba(23, 162, 184, 0.1)' : 'rgba(108, 117, 125, 0.1)'}; transition: all 0.2s ease;" title="Click to toggle debug mode">🐛 Debug: ${AppSettings.getDebug() ? '🔈 ON' : '🔇 OFF'}</span>
|
||||
</div>
|
||||
<div style="margin-bottom: 4px;">
|
||||
<span style="color: ${CONFIG.DEBUG_MILESTONE ? '#28a745' : '#6c757d'}; padding: 2px 4px; border-radius: 3px; border: 1px solid ${CONFIG.DEBUG_MILESTONE ? '#28a745' : '#6c757d'}; background: ${CONFIG.DEBUG_MILESTONE ? 'rgba(40, 167, 69, 0.1)' : 'rgba(108, 117, 125, 0.1)'};" title="Milestone debug mode (configured in CONFIG)">🎯 Milestone: ${CONFIG.DEBUG_MILESTONE ? '🔈 ON' : '🔇 OFF'}</span>
|
||||
</div>
|
||||
<div style="margin-top: 8px; border-top: 1px solid rgba(255, 255, 255, 0.2); padding-top: 8px;">
|
||||
<div style="text-align: center; margin-bottom: 8px;">
|
||||
<span id="timer-display-ohr1Youj" style="color: #20c997; font-family: 'Courier New', monospace; font-size: 16px; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 1px solid #20c997; background: rgba(32, 201, 151, 0.1);" title="Session timer">⏱️ ${AppServices.Timer.getDisplay()}</span>
|
||||
</div>
|
||||
<div style="display: flex; gap: 4px; justify-content: center;">
|
||||
<span id="play-btn-uPha3Mah" style="color: #28a745; cursor: pointer; padding: 4px 8px; border-radius: 4px; border: 1px solid #28a745; background: ${currentStatus === AppEnums.BOT_STATUS.WAITING_FOR_TASK || currentStatus === AppEnums.BOT_STATUS.PERFORMING_TASK ? 'rgba(40, 167, 69, 0.3)' : 'rgba(40, 167, 69, 0.1)'}; transition: all 0.2s ease; font-size: 14px;" title="Play - Start waiting for tasks">▶️</span>
|
||||
<span id="pause-btn-Gai2quie" style="color: #ffc107; cursor: pointer; padding: 4px 8px; border-radius: 4px; border: 1px solid #ffc107; background: ${currentStatus === AppEnums.BOT_STATUS.PAUSE ? 'rgba(255, 193, 7, 0.3)' : 'rgba(255, 193, 7, 0.1)'}; transition: all 0.2s ease; font-size: 14px;" title="Pause - Stop but keep current task">⏸️</span>
|
||||
<span id="stop-btn-jooK6che" style="color: #dc3545; cursor: pointer; padding: 4px 8px; border-radius: 4px; border: 1px solid #dc3545; background: ${currentStatus === AppEnums.BOT_STATUS.STOP || currentStatus === AppEnums.BOT_STATUS.ERROR ? 'rgba(220, 53, 69, 0.3)' : 'rgba(220, 53, 69, 0.1)'}; transition: all 0.2s ease; font-size: 14px;" title="Stop - Clear task and stop">⏹️</span>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
// Update content (excluding position button)
|
||||
if (!AppUi.dashboardOverlay.element) {
|
||||
TL.error('DASHBOARD-OVERLAY', '8.1. Element is null!');
|
||||
return;
|
||||
}
|
||||
|
||||
const contentDiv = AppUi.dashboardOverlay.element.querySelector('.baf-content') || document.createElement('div');
|
||||
contentDiv.className = 'baf-content';
|
||||
contentDiv.innerHTML = content;
|
||||
@@ -782,7 +884,7 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
}
|
||||
|
||||
// Add event listener for safety toggle button
|
||||
const safetyToggleBtn = contentDiv.querySelector('#safety-toggle-btn');
|
||||
const safetyToggleBtn = contentDiv.querySelector('#safety-toggle-btn-AithaiG2');
|
||||
if (safetyToggleBtn) {
|
||||
safetyToggleBtn.onclick = () => {
|
||||
const currentStatus = {
|
||||
@@ -800,7 +902,7 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
}
|
||||
|
||||
// Add event listener for debug toggle button
|
||||
const debugToggleBtn = contentDiv.querySelector('#debug-toggle-btn');
|
||||
const debugToggleBtn = contentDiv.querySelector('#debug-toggle-btn-Tai5guto');
|
||||
if (debugToggleBtn) {
|
||||
debugToggleBtn.onclick = () => {
|
||||
const newDebugState = !AppSettings.getDebug();
|
||||
@@ -810,29 +912,47 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
};
|
||||
}
|
||||
|
||||
// Add event listener for bot status toggle button
|
||||
const botStatusToggleBtn = contentDiv.querySelector('#bot-status-toggle-btn');
|
||||
if (botStatusToggleBtn) {
|
||||
botStatusToggleBtn.onclick = () => {
|
||||
const currentBotStatus = AppSession.getSessionStatus();
|
||||
let newBotStatus;
|
||||
|
||||
// Logic: stop/error -> start, start -> stop
|
||||
if (currentBotStatus === AppEnums.BOT_STATUS.RUNNING) {
|
||||
newBotStatus = AppEnums.BOT_STATUS.STOP;
|
||||
} else {
|
||||
// STOP or ERROR -> RUNNING
|
||||
newBotStatus = AppEnums.BOT_STATUS.RUNNING;
|
||||
}
|
||||
|
||||
AppSession.setSessionStatus(newBotStatus);
|
||||
// Update the content to reflect the change
|
||||
// Add event listeners for control buttons
|
||||
const playBtn = contentDiv.querySelector('#play-btn-uPha3Mah');
|
||||
if (playBtn) {
|
||||
playBtn.onclick = () => {
|
||||
AppServices.Status.play();
|
||||
AppUi.dashboardOverlay.updateContent();
|
||||
};
|
||||
}
|
||||
|
||||
const pauseBtn = contentDiv.querySelector('#pause-btn-Gai2quie');
|
||||
if (pauseBtn) {
|
||||
pauseBtn.onclick = () => {
|
||||
AppServices.Status.pause();
|
||||
AppUi.dashboardOverlay.updateContent();
|
||||
};
|
||||
}
|
||||
|
||||
const stopBtn = contentDiv.querySelector('#stop-btn-jooK6che');
|
||||
if (stopBtn) {
|
||||
stopBtn.onclick = () => {
|
||||
AppServices.Status.stop();
|
||||
AppUi.dashboardOverlay.updateContent();
|
||||
};
|
||||
}
|
||||
|
||||
// Add hover effects for control buttons
|
||||
if (playBtn) {
|
||||
TL.dom.setHover(playBtn, 'mouseenter', { scale: 1.2, background: 'rgba(40, 167, 69, 0.2)' });
|
||||
TL.dom.setHover(playBtn, 'mouseleave', { scale: 1, background: 'rgba(40, 167, 69, 0.1)' });
|
||||
}
|
||||
if (pauseBtn) {
|
||||
TL.dom.setHover(pauseBtn, 'mouseenter', { scale: 1.2, background: 'rgba(255, 193, 7, 0.2)' });
|
||||
TL.dom.setHover(pauseBtn, 'mouseleave', { scale: 1, background: 'rgba(255, 193, 7, 0.1)' });
|
||||
}
|
||||
if (stopBtn) {
|
||||
TL.dom.setHover(stopBtn, 'mouseenter', { scale: 1.2, background: 'rgba(220, 53, 69, 0.2)' });
|
||||
TL.dom.setHover(stopBtn, 'mouseleave', { scale: 1, background: 'rgba(220, 53, 69, 0.1)' });
|
||||
}
|
||||
|
||||
// Add event listener for startup mode toggle button
|
||||
const startupModeToggleBtn = contentDiv.querySelector('#startup-mode-toggle-btn');
|
||||
const startupModeToggleBtn = contentDiv.querySelector('#startup-mode-toggle-btn-tha9ieCa');
|
||||
if (startupModeToggleBtn) {
|
||||
startupModeToggleBtn.onclick = () => {
|
||||
const currentStartupMode = AppSettings.getBotStartupMode();
|
||||
@@ -844,7 +964,7 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
}
|
||||
|
||||
// Add event listener for server toggle button
|
||||
const serverToggleBtn = contentDiv.querySelector('#server-toggle-btn');
|
||||
const serverToggleBtn = contentDiv.querySelector('#server-toggle-btn-Youx4pho');
|
||||
if (serverToggleBtn) {
|
||||
serverToggleBtn.onclick = async () => {
|
||||
const currentServerType = AppSettings.getServerType();
|
||||
@@ -894,8 +1014,16 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
|
||||
// Initialize dashboard overlay
|
||||
init: () => {
|
||||
if (AppSettings.getPopupVisible()) {
|
||||
AppUi.dashboardOverlay.show();
|
||||
try {
|
||||
const popupVisible = AppSettings.getPopupVisible();
|
||||
|
||||
if (popupVisible) {
|
||||
AppUi.dashboardOverlay.show();
|
||||
} else {
|
||||
}
|
||||
} catch (error) {
|
||||
TL.error('DASHBOARD-OVERLAY', '1.4.4. Error initializing dashboard overlay:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -944,85 +1072,98 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
GM_registerMenuCommand("👁️ Toggle Popup", () => {
|
||||
AppUi.dashboardOverlay.toggle();
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
TL.error('MENU', 'Failed to create menu:', error);
|
||||
TL.error('MENU', '1.3.5. Failed to create menu:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
// ====== APP TASKS ======
|
||||
const AppTasks = {
|
||||
login: async (step, data) => {
|
||||
if (!AppServices.isReadyToRun()) {
|
||||
TL.debug('APP-TASKS', 'Bot is not ready to run');
|
||||
return;
|
||||
}
|
||||
|
||||
TL.debug('APP-TASKS', `Login task ${step}`);
|
||||
//set steps
|
||||
switch (step) {
|
||||
case "start":
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.PERFORMING_TASK);
|
||||
AppSession.setCurrentStep("navigating-to-login-page");
|
||||
TL.browser.navigateTo(BINANCE.page.getLoginUrl());
|
||||
break;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
// ====== APP SERVICE ======
|
||||
const AppServices = {
|
||||
initialize: async () => {
|
||||
await AppState.initialize();
|
||||
try {
|
||||
await AppState.initialize();
|
||||
await AppSession.initialize();
|
||||
|
||||
await AppUi.menu.create();
|
||||
// Khởi tạo timer
|
||||
AppServices.Timer.initialize();
|
||||
|
||||
AppUi.dashboardOverlay.init();
|
||||
await AppUi.menu.create();
|
||||
AppUi.dashboardOverlay.init();
|
||||
await AppServices.registerSession();
|
||||
|
||||
// Setup observers for dashboard overlay updates
|
||||
AppServices.initObservers();
|
||||
const status = AppSession.getSessionStatus();
|
||||
if (status === AppEnums.BOT_STATUS.INITIALIZING) {
|
||||
const startupMode = AppSettings.getBotStartupMode();
|
||||
if (startupMode === AppEnums.BOT_STARTUP_MODE.AUTO) {
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.WAITING_FOR_TASK);
|
||||
} else {
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.STOP);
|
||||
}
|
||||
}
|
||||
|
||||
await AppServices.registerSession();
|
||||
|
||||
// Set bot status based on startup mode
|
||||
const startupMode = AppSettings.getBotStartupMode();
|
||||
if (startupMode === AppEnums.BOT_STARTUP_MODE.AUTO) {
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.RUNNING);
|
||||
TL.debug('APP-SERVICES', 'Auto startup mode: Bot status set to RUNNING');
|
||||
} else {
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.STOP);
|
||||
TL.debug('APP-SERVICES', 'Manual startup mode: Bot status set to STOP');
|
||||
AppServices.initInterval();
|
||||
} catch (error) {
|
||||
TL.error('APP-SERVICES', 'Error during initialization:', error);
|
||||
throw error;
|
||||
}
|
||||
|
||||
// Setup interval services
|
||||
AppServices.initInterval();
|
||||
|
||||
AppState.update({ appInitialized: true });
|
||||
|
||||
TL.debug('APP-SERVICES', 'AppServices initialized');
|
||||
},
|
||||
|
||||
initObservers: () => {
|
||||
// AppState.subscribe('server_last_seen', () => {
|
||||
// if (AppSettings.getPopupVisible()) {
|
||||
// AppUi.dashboardOverlay.updateContent();
|
||||
// }
|
||||
// });
|
||||
|
||||
// AppState.subscribe('is_logged_in', () => {
|
||||
// if (AppSettings.getPopupVisible()) {
|
||||
// AppUi.dashboardOverlay.updateContent();
|
||||
// }
|
||||
// });
|
||||
|
||||
// AppState.subscribe('current_page', () => {
|
||||
// if (AppSettings.getPopupVisible()) {
|
||||
// AppUi.dashboardOverlay.updateContent();
|
||||
// }
|
||||
// });
|
||||
},
|
||||
registerSession: async () => {
|
||||
const msg = await BAF.register({ session_id: AppSession.SESSION_ID });
|
||||
//if ok, set session token
|
||||
if (msg.ok) {
|
||||
AppSession.setSessionToken(msg.data.token);
|
||||
AppSession.setSessionBinded(true);
|
||||
TL.debug('APP-SERVICES', `Session token: ${AppSession.getSessionToken()}`);
|
||||
} else {
|
||||
try {
|
||||
const msg = await BAF.register({ session_id: AppSession.SESSION_ID });
|
||||
|
||||
if (msg.ok) {
|
||||
AppSession.setSessionToken(msg.data.token);
|
||||
AppSession.setSessionBinded(true);
|
||||
} else {
|
||||
AppSession.setSessionBinded(false);
|
||||
TL.error('APP-SERVICES', `1.5.3. Failed to register session: ${msg.error}`);
|
||||
}
|
||||
} catch (error) {
|
||||
TL.error('APP-SERVICES', '1.5.3. Error during session registration:', error);
|
||||
AppSession.setSessionBinded(false);
|
||||
TL.error('APP-SERVICES', `Failed to register session: ${msg.error}`);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
// Setup interval services
|
||||
initInterval: () => {
|
||||
setInterval(() => AppServices.heartbeat(), CONFIG.HEARTBEAT_INTERVAL);
|
||||
setInterval(() => AppUi.dashboardOverlay.updateContent(), CONFIG.DASHBOARD_UPDATE_INTERVAL);
|
||||
try {
|
||||
setInterval(() => AppServices.heartbeat(), CONFIG.HEARTBEAT_INTERVAL);
|
||||
setInterval(() => AppUi.dashboardOverlay.updateContent(), CONFIG.DASHBOARD_UPDATE_INTERVAL);
|
||||
|
||||
TL.debug('APP-SERVICES', 'Interval services started');
|
||||
// Timer update interval - cập nhật timer mỗi giây
|
||||
setInterval(() => {
|
||||
const timerDisplay = document.querySelector('#timer-display-ohr1Youj');
|
||||
if (timerDisplay) {
|
||||
timerDisplay.textContent = `⏱️ ${AppServices.Timer.getDisplay()}`;
|
||||
}
|
||||
}, 1000);
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
isConnected: () => {
|
||||
@@ -1030,9 +1171,86 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
return serverLastSeen && new Date() - serverLastSeen < 60000;
|
||||
},
|
||||
|
||||
|
||||
isReadyToRun: () => {
|
||||
return AppSession.getSessionBinded() && AppSettings.getSafetyGuard() && AppSession.getSessionStatus() === AppEnums.BOT_STATUS.RUNNING;
|
||||
return AppSession.getSessionBinded() && AppSettings.getSafetyGuard() && AppSession.getSessionStatus() === AppEnums.BOT_STATUS.WAITING_FOR_TASK;
|
||||
},
|
||||
|
||||
// ====== TIMER SYSTEM ======
|
||||
Timer: {
|
||||
// Timer state management - Quản lý trạng thái timer
|
||||
getStartTime: () => {
|
||||
const time = sessionStorage.getItem(SESSION_STORAGE_KEYS.TIMER_START_TIME);
|
||||
return time ? parseInt(time) : null;
|
||||
},
|
||||
setStartTime: time => {
|
||||
if (time === null || time === undefined) {
|
||||
sessionStorage.removeItem(SESSION_STORAGE_KEYS.TIMER_START_TIME);
|
||||
} else {
|
||||
sessionStorage.setItem(SESSION_STORAGE_KEYS.TIMER_START_TIME, time.toString());
|
||||
}
|
||||
},
|
||||
|
||||
isRunning: () => sessionStorage.getItem(SESSION_STORAGE_KEYS.TIMER_IS_RUNNING) === 'true',
|
||||
setRunning: running => sessionStorage.setItem(SESSION_STORAGE_KEYS.TIMER_IS_RUNNING, running ? 'true' : 'false'),
|
||||
|
||||
getAccumulated: () => {
|
||||
const time = sessionStorage.getItem(SESSION_STORAGE_KEYS.TIMER_ACCUMULATED);
|
||||
return time ? parseInt(time) : 0;
|
||||
},
|
||||
setAccumulated: time => sessionStorage.setItem(SESSION_STORAGE_KEYS.TIMER_ACCUMULATED, time.toString()),
|
||||
|
||||
// Timer control methods
|
||||
start: () => {
|
||||
if (!AppServices.Timer.isRunning()) {
|
||||
AppServices.Timer.setStartTime(Date.now());
|
||||
AppServices.Timer.setRunning(true);
|
||||
TL.debug('TIMER', 'Timer started');
|
||||
}
|
||||
},
|
||||
|
||||
pause: () => {
|
||||
if (AppServices.Timer.isRunning()) {
|
||||
const startTime = AppServices.Timer.getStartTime();
|
||||
const currentTime = Date.now();
|
||||
const elapsed = currentTime - startTime;
|
||||
const accumulated = AppServices.Timer.getAccumulated();
|
||||
AppServices.Timer.setAccumulated(accumulated + elapsed);
|
||||
AppServices.Timer.setRunning(false);
|
||||
AppServices.Timer.setStartTime(null);
|
||||
}
|
||||
},
|
||||
|
||||
stop: () => {
|
||||
AppServices.Timer.pause();
|
||||
AppServices.Timer.setAccumulated(0);
|
||||
},
|
||||
|
||||
getDisplay: () => {
|
||||
let totalTime = AppServices.Timer.getAccumulated();
|
||||
|
||||
if (AppServices.Timer.isRunning()) {
|
||||
const startTime = AppServices.Timer.getStartTime();
|
||||
if (startTime) {
|
||||
const currentTime = Date.now();
|
||||
totalTime += (currentTime - startTime);
|
||||
}
|
||||
}
|
||||
|
||||
const hours = Math.floor(totalTime / 3600000);
|
||||
const minutes = Math.floor((totalTime % 3600000) / 60000);
|
||||
const seconds = Math.floor((totalTime % 60000) / 1000);
|
||||
|
||||
const display = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
|
||||
TL.debug('TIMER', `Display: ${display}, Running: ${AppServices.Timer.isRunning()}, Accumulated: ${totalTime}`);
|
||||
return display;
|
||||
},
|
||||
|
||||
initialize: () => {
|
||||
AppServices.Timer.setAccumulated(0);
|
||||
AppServices.Timer.setRunning(false);
|
||||
AppServices.Timer.setStartTime(null);
|
||||
TL.debug('TIMER', 'Timer initialized');
|
||||
}
|
||||
},
|
||||
|
||||
// ====== HEARTBEAT SYSTEM ======
|
||||
@@ -1066,7 +1284,7 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
}
|
||||
},
|
||||
|
||||
getTask: async () => {
|
||||
handleNewTask: async () => {
|
||||
const data = {
|
||||
logged_in: AppState.getIsLoggedIn(),
|
||||
current_page: AppState.getCurrentPage(),
|
||||
@@ -1075,38 +1293,89 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
current_task_data: AppSession.getCurrentTaskData(),
|
||||
current_step: AppSession.getCurrentStep(),
|
||||
};
|
||||
const task = await BAF.getTask(data);
|
||||
return task;
|
||||
|
||||
const taskResponse = await BAF.getTask(data);
|
||||
TL.debug('APP-SERVICES', `Task: ${JSON.stringify(taskResponse, null, 2)}`);
|
||||
|
||||
if (taskResponse.ok) {
|
||||
const task = taskResponse.data;
|
||||
AppSession.setCurrentTask(task.type);
|
||||
AppSession.setCurrentTaskData(task.data || null);
|
||||
|
||||
switch (task.type) {
|
||||
case BAF_TASKS.NO_TASK:
|
||||
TL.debug('APP-TASK', "No task. Sleep now");
|
||||
break;
|
||||
case BAF_TASKS.LOGIN:
|
||||
AppTasks.login("start", task.data);
|
||||
break;
|
||||
default:
|
||||
TL.debug('APP-TASK', `Unknown task 🛑`);
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.ERROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
handleTask: (task) => {
|
||||
TL.debug('APP-SERVICES', `Task: ${JSON.stringify(task, null, 2)}`);
|
||||
resumeTask: async () => {
|
||||
TL.debug('APP-SERVICES', 'Resume task');
|
||||
|
||||
AppSession.setCurrentTask(task.task);
|
||||
AppSession.setCurrentTaskData(task.data || null);
|
||||
AppSession.setCurrentStep(task.step || null);
|
||||
const task = AppSession.getCurrentTask();
|
||||
const data = AppSession.getCurrentTaskData();
|
||||
const step = AppSession.getCurrentStep();
|
||||
|
||||
switch (task.task) {
|
||||
case BAF_TASKS.NO_TASK:
|
||||
TL.debug('APP-TASK', "No task. Sleep now");
|
||||
break;
|
||||
default:
|
||||
TL.debug('APP-TASK', `Unknown task 🛑`);
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.ERROR);
|
||||
switch (task) {
|
||||
case BAF_TASKS.LOGIN:
|
||||
AppTasks.login(step, data);
|
||||
break;
|
||||
};
|
||||
},
|
||||
|
||||
// ====== BOT STATUS CONTROL ======
|
||||
Status: {
|
||||
play: () => {
|
||||
AppServices.Timer.start();
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.WAITING_FOR_TASK);
|
||||
},
|
||||
|
||||
pause: () => {
|
||||
AppServices.Timer.pause();
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.PAUSE);
|
||||
},
|
||||
|
||||
stop: () => {
|
||||
AppServices.Timer.stop();
|
||||
AppSession.setCurrentTask(BAF_TASKS.NO_TASK);
|
||||
AppSession.setCurrentTaskData(null);
|
||||
AppSession.setCurrentStep(BAF_TASKS.NO_STEP);
|
||||
AppSession.setSessionStatus(AppEnums.BOT_STATUS.STOP);
|
||||
}
|
||||
},
|
||||
|
||||
start: async () => {
|
||||
while (true) {
|
||||
//checking bot status: running?
|
||||
if (AppSession.getSessionStatus() === AppEnums.BOT_STATUS.RUNNING) {
|
||||
const task = await AppServices.getTask();
|
||||
if (task.ok) {
|
||||
AppServices.handleTask(task.data);
|
||||
}
|
||||
} else {
|
||||
TL.debug('APP-SERVICES', 'Bot is stopped, skipping task check');
|
||||
switch (AppSession.getSessionStatus()) {
|
||||
case AppEnums.BOT_STATUS.INITIALIZING:
|
||||
TL.debug('APP-SERVICES', 'Bot is initializing, waiting...');
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.STOP:
|
||||
TL.debug('APP-SERVICES', 'Bot is stopped, skipping task check');
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.PAUSE:
|
||||
TL.debug('APP-SERVICES', 'Bot is paused, skipping task check');
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.WAITING_FOR_TASK:
|
||||
await AppServices.handleNewTask();
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.PERFORMING_TASK:
|
||||
await AppServices.resumeTask();
|
||||
break;
|
||||
case AppEnums.BOT_STATUS.ERROR:
|
||||
TL.debug('APP-SERVICES', 'Bot is in error state, skipping task check');
|
||||
break;
|
||||
default:
|
||||
TL.debug('APP-SERVICES', 'Bot is in unknown state, skipping task check');
|
||||
break;
|
||||
}
|
||||
|
||||
await TL.delay(CONFIG.TASK_INTERVAL);
|
||||
@@ -1116,9 +1385,12 @@ GM_log('[TL] 🏁 Welcome to Binance Alpha Farm Agent.');
|
||||
|
||||
// Start the application
|
||||
try {
|
||||
|
||||
await AppServices.initialize();
|
||||
|
||||
} catch (error) {
|
||||
TL.error('MAIN', 'Failed to initialize app:', error);
|
||||
TL.error('MAIN', 'Error stack:', error.stack);
|
||||
}
|
||||
|
||||
TL.log('MAIN', 'App started');
|
||||
|
||||
Reference in New Issue
Block a user