const autoClaimOption = 1; let state; let autoClaimTimeout; let claiming; let lastClaimOption = 0; let lastClaimTime = Date.now(); let injectionPort; chrome.runtime.onConnectExternal.addListener(function(port) { injectionPort = port; injectionPort.onMessage.addListener(function(message) { if(message.action == 'endClaimAll') { onEndClaimAll(); } }); }); function getClaimOptionLength(option) { return [0, 10, 40, 3 * 60, 8 * 60][option] * 60 * 1000; } function updateBrowserActionStatus() { chrome.tabs.query({ url: '*://*.grepolis.com/game/index*' }, function(tabs) { if(tabs.length == 0) { chrome.browserAction.disable(); updateState('manual'); } else { chrome.browserAction.enable(); } }); } chrome.tabs.onCreated.addListener(updateBrowserActionStatus); chrome.tabs.onUpdated.addListener(updateBrowserActionStatus); chrome.tabs.onRemoved.addListener(updateBrowserActionStatus); chrome.browserAction.onClicked.addListener(function() { chrome.tabs.query({ url: '*://*.grepolis.com/game/index*' }, function(tabs) { if(tabs.length == 0) { return; } chrome.tabs.update(tabs[0].id, { active: true }); }); }); function claimAll(option) { if(claiming) { console.log('Error: already claiming!'); return; } lastClaimOption = option; claiming = true; updateBadgeText(); injectionPort.postMessage({ action: 'claimAll', args: [option] }); } function onEndClaimAll() { claiming = false; lastClaimTime = Date.now(); if(state == 'automatic') { autoClaimTimeout = setTimeout(function() { claimAll(autoClaimOption); }, getClaimOptionLength(autoClaimOption)); } updateBadgeText(); } function updateBadgeText() { let timeSinceClaim = Date.now() - lastClaimTime; let lastClaimLength = getClaimOptionLength(lastClaimOption); if(state == 'automatic' && claiming) { chrome.browserAction.setBadgeText({ text: '…' }); } else if(state == 'manual' && timeSinceClaim >= lastClaimLength) { chrome.browserAction.setBadgeText({ text: '(∞)' }); } else { let timeLeft = lastClaimLength - timeSinceClaim; let timeText; if(timeLeft <= 0) { timeText = '0s'; } else if(timeLeft < 60 * 1000) { timeText = Math.trunc(timeLeft / 1000) + 's'; } else if(timeLeft < 60 * 60 * 1000) { timeText = Math.trunc(timeLeft / 60 / 1000) + 'm'; } else { timeText = Math.trunc(timeLeft / 60 / 60 / 1000) + 'h' + Math.trunc((timeLeft % (60 * 60 * 1000)) / 60 / 1000) + 'm'; } chrome.browserAction.setBadgeText({ text: state == 'manual' ? '(' + timeText + ')' : timeText }); } } function claimAllWhenReady(option) { let timeSinceClaim = Date.now() - lastClaimTime; let lastClaimLength = getClaimOptionLength(lastClaimOption); let timeLeft = lastClaimLength - timeSinceClaim; setTimeout(function() { claimAll(option); }, timeLeft); } function updateState(newState) { state = newState; if(newState == 'automatic') { let timeSinceClaim = Date.now() - lastClaimTime; let lastClaimLength = getClaimOptionLength(lastClaimOption); let timeLeft = lastClaimLength - timeSinceClaim; setTimeout(function() { claimAll(autoClaimOption); }, timeLeft); chrome.browserAction.setBadgeBackgroundColor({ color: 'green' }); } else if(newState == 'manual') { clearTimeout(autoClaimTimeout); chrome.browserAction.setBadgeBackgroundColor({ color: 'red' }); } updateBadgeText(); chrome.contextMenus.update(state, { checked: true }); } chrome.contextMenus.create({ id: 'automatic', type: 'radio', title: 'Automatic', contexts: ['browser_action'], onclick: function() { updateState('automatic'); } }); chrome.contextMenus.create({ id: 'manual', type: 'radio', title: 'Manual', contexts: ['browser_action'], onclick: function() { updateState('manual'); } }); chrome.contextMenus.create({ type: 'normal', title: 'Claim for 10m', contexts: ['browser_action'], onclick: function() { updateState('manual'); claimAllWhenReady(1); } }); chrome.contextMenus.create({ type: 'normal', title: 'Claim for 40m', contexts: ['browser_action'], onclick: function() { updateState('manual'); claimAllWhenReady(2); } }); chrome.contextMenus.create({ type: 'normal', title: 'Claim for 3h', contexts: ['browser_action'], onclick: function() { updateState('manual'); claimAllWhenReady(3); } }); chrome.contextMenus.create({ type: 'normal', title: 'Claim for 8h', contexts: ['browser_action'], onclick: function() { updateState('manual'); claimAllWhenReady(4); } }); updateBrowserActionStatus(); updateState('manual'); setInterval(updateBadgeText, 500);