Check and notify on https://idleontoolbox.com/dashboard with Telegram support
当前为
// ==UserScript==
// @name Idleontoolbox Produce Check
// @namespace http://tampermonkey.net/
// @version 5.0
// @description Check and notify on https://idleontoolbox.com/dashboard with Telegram support
// @author Tiande
// @match https://idleontoolbox.com/*
// @grant GM_notification
// @grant GM_getValue
// @grant GM_setValue
// @license MIT
// ==/UserScript==
(function() {
'use strict';
var interval = 5 * 60 * 1000; // check status every 5m
var refreshInterval = 10.1 * 60 * 1000; // auto refresh to Dashboard every 10m
// Telegram Bot API Token
var tgbotToken = 'YOUR BOT TOKEN';
// Telegram user ID to send the message to
var tguserId = 'YOUR USER ID';
// lable text under player's name
var whichFull = /(is full)/; // (is full|being full|xxx) etc.
// skill to notify
var skill = /(SkillName|Refinery)/; // (Refinery|Cooking|Arena) etc.
// bookcount to check
var bookcount = 3;
var notificationPermission = GM_getValue('notificationPermission');
var isFunctionEnabled = true;
var intervalId; // Store interval ID for pausing and resuming
// tg send
function tgsendMessage(message) {
var tgurl = 'https://api.telegram.org/bot' + tgbotToken + '/sendMessage';
var tgparams = 'chat_id=' + tguserId + '&text=' + encodeURIComponent(message);
var tgxhr = new XMLHttpRequest();
tgxhr.open('POST', tgurl, true);
tgxhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
tgxhr.onreadystatechange = function() {
if (tgxhr.readyState == 4 && tgxhr.status == 200) {
console.log('Message sent successfully!');
}
};
tgxhr.onerror = function(error) {
console.error('Error sending message:', error);
};
tgxhr.send(tgparams);
}
// autorefresh time
var refreshId;
// refreshPage
function refreshPage() {
// 检查当前页面的URL是否为'https://idleontoolbox.com/dashboard'
if (isFunctionEnabled) {
location.href = 'https://idleontoolbox.com/dashboard'; // 如果是,则刷新页面
} else {
// 如果不是,则等待下一个刷新时间间隔
refreshId = setInterval(refreshPage, refreshInterval);
}
}
function toggleRefresh() {
if (isFunctionEnabled) {
intervalId = setInterval(startInterval, interval); // 启动定时器
refreshId = setInterval(refreshPage, refreshInterval);
} else {
clearInterval(intervalId); // 清除定时器
clearInterval(refreshId);
}
}
toggleRefresh(); // 在脚本启动时调用一次,以确保定时器已启动
// Preload audio
var audio = new Audio();
audio.src = 'https://github.com/Tiande/IdelonCheck/raw/main/iphonewake.wav';
// Add CSS styles
var style = document.createElement('style');
style.innerHTML = `
#toggleButtonContainer {
position: fixed;
top: 50%;
left: calc(50% + 100px);
transform: translate(-50%, -50%);
display: flex;
align-items: center;
padding: 5px;
background: green; /* Green color for default enabled state */
color: white;
border-radius: 5px;
font-family: Arial, sans-serif;
font-size: 14px;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
z-index: 99999;
user-select: none;
cursor: move;
}
#toggleButtonContainer.off {
background: red; /* Red color for disabled state */
}
#toggleButton {
padding: 5px 10px;
border: none;
border-radius: 5px;
background: transparent;
cursor: pointer;
outline: none;
}
.drag-handle {
cursor: move;
}
#produceCheck {
background-color: black;
color: white;
padding: 5px;
border-radius: 5px;
margin-right: 5px;
}
`;
document.head.appendChild(style);
createToggleButton(); // Create toggle button on script execution
startInterval(); // Start interval on script execution
function createToggleButton() {
var toggleButtonContainer = document.createElement('div');
toggleButtonContainer.id = 'toggleButtonContainer';
toggleButtonContainer.classList.add('drag-handle');
var produceCheck = document.createElement('span');
produceCheck.id = 'produceCheck';
produceCheck.textContent = 'Produce Check: ';
toggleButtonContainer.appendChild(produceCheck);
var toggleButton = document.createElement('button');
toggleButton.id = 'toggleButton';
toggleButton.addEventListener('click', toggleFunction);
toggleButtonContainer.appendChild(toggleButton);
document.body.appendChild(toggleButtonContainer);
updateButtonStyle();
makeDraggable(toggleButtonContainer);
}
function updateButtonStyle() {
var toggleButtonContainer = document.getElementById('toggleButtonContainer');
toggleButtonContainer.classList.toggle('off', !isFunctionEnabled);
var toggleButton = document.getElementById('toggleButton');
toggleButton.innerHTML = isFunctionEnabled ? 'ON' : 'OFF';
}
function toggleFunction() {
isFunctionEnabled = !isFunctionEnabled;
updateButtonStyle();
toggleRefresh(); // 根据isFunctionEnabled的值启用或暂停定时器
}
function startInterval() {
// sth is full
var prepareelements = document.querySelectorAll('img[aria-label]');
var elements = Array.from(prepareelements).filter(function(element) {
return whichFull.test(element.getAttribute('aria-label'));
});
if (elements.length > 0) {
var roleNames = [];
elements.forEach(function(element) {
var parentDiv = element.closest('.MuiCardContent-root');
if (parentDiv) {
var roleNameElement = parentDiv.querySelector('.MuiTypography-root.MuiTypography-body1.css-9l3uo3');
if (roleNameElement) {
var roleName = roleNameElement.textContent.trim();
roleNames.push(roleName);
}
}
});
if (roleNames.length > 0) {
var message = roleNames.join(' + ') + ' is full!';
showNotification(message);
audio.play();
if (tguserId !== 'your user ID') {
tgsendMessage(message);
}
}
}
// skill is ready
var prepareelements = document.querySelectorAll('img[aria-label]');
var elements = Array.from(prepareelements).filter(function(element) {
return skill.test(element.getAttribute('aria-label'));
});
if (elements.length > 0) {
var roleNames = [];
elements.forEach(function(element) {
var parentDiv = element.closest('.MuiCardContent-root');
if (parentDiv) {
var roleNameElement = parentDiv.querySelector('.MuiTypography-root.MuiTypography-body1.css-9l3uo3');
if (roleNameElement) {
var roleName = roleNameElement.textContent.trim();
roleNames.push(roleName);
}
}
});
if (roleNames.length > 0) {
var message = roleNames.join(' + ') + ' is Skillable!';
showNotification(message);
audio.play();
if (tguserId !== 'your user ID') {
tgsendMessage(message);
}
}
}
// 追踪另一组元素
var timeElements = document.querySelectorAll('.MuiTypography-root.MuiTypography-inherit');
timeElements.forEach(function(timeElement) {
var color = getComputedStyle(timeElement).color;
var match = color.match(/^rgb\((\d+), (\d+), (\d+)\)$/);
if (match && match[1] === '249' && match[2] === '29' && match[3] === '29') {
// color 属性值为 rgb(249, 29, 29),视为捕获
var message = 'Some work is done!';
showNotification(message);
audio.play();
if (tguserId !== 'your user ID') {
tgsendMessage(message);
}
}
});
// Book count
var bookCountElements = document.querySelectorAll('.MuiCardContent-root h4');
// 遍历每个 <h4> 元素
bookCountElements.forEach(function(element) {
// 获取文本内容
var text = element.textContent.trim();
// 提取数字部分
var count = parseInt(text.match(/\d+/)[0]);
// 如果数字大于等于2,则发送通知
if (count >= bookcount) {
// 发送通知
var message = 'The book count has exceeded the limit!';
showNotification(message);
audio.play();
if (tguserId !== 'your user ID') {
tgsendMessage(message);
}
}
});
}
function showNotification(message) {
if (notificationPermission === 'granted') {
GM_notification({
text: message,
title: 'Idleontoolbox Notification',
timeout: 5000,
onclick: function() {
window.focus();
}
});
} else {
window.Notification.requestPermission().then(function(permission) {
if (permission === 'granted') {
GM_notification({
text: message,
title: 'Idleontoolbox Notification',
timeout: 5000,
onclick: function() {
window.focus();
}
});
}
});
}
}
function makeDraggable(element) {
let pos1 = 0,
pos2 = 0,
pos3 = 0,
pos4 = 0;
element.onmousedown = dragMouseDown;
function dragMouseDown(e) {
e = e || window.event;
e.preventDefault();
// get the mouse cursor position at startup:
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
// call a function whenever the cursor moves:
document.onmousemove = elementDrag;
}
function elementDrag(e) {
e = e || window.event;
e.preventDefault();
// calculate the new cursor position:
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
// set the element's new position:
element.style.top = (element.offsetTop - pos2) + "px";
element.style.left = (element.offsetLeft - pos1) + "px";
}
function closeDragElement() {
/* stop moving when mouse button is released:*/
document.onmouseup = null;
document.onmousemove = null;
}
}
})();