// ==UserScript==
// @name Browsing Reminder Client
// @namespace JustSong
// @version 0.2
// @description Remind you when you waste too much time on specified websites.
// @author JustSong
// @require https://cdn.jsdelivr.net/npm/toastify-js
// @require https://cdn.jsdelivr.net/npm/sweetalert2@10
// @match https://www.zhihu.com/*
// @match https://*.youtube.com/*
// @match https://*.bilibili.com/*
// @match https://*.reddit.com/*
// @match https://zh.wikipedia.org/*
// ==/UserScript==
(function () {
'use strict';
const serverUrl = "https://ping.iamazing.cn";
const pingInterval = 60; // Unit is second.
const maxMinutes = 10;
const needConfirm = true;
window.pingServer = function () {
console.log("ping~");
fetch(serverUrl, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
Host: window.location.hostname
})
}).then(function (response) {
return response.text().then(function (minutes) {
let counter = parseInt(minutes);
window.processRequest(counter);
})
}).catch(function (reason) {
console.log(reason)
})
};
window.processRequest = function (minutes) {
window.toast(`You have wasted ${minutes} minutes.`);
if (minutes >= maxMinutes) {
if (needConfirm) {
// choose = confirm(`You have wasted ${minutes} minutes in this site, would you like to close it?`);
Swal.fire({
title: 'Notice',
text: `You have wasted ${minutes} minutes in this site, would you like to close it?`,
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Nope'
}).then((result) => {
if (result.dismiss === Swal.DismissReason.cancel) {
Swal.fire(
'Notice',
'The timer has been reset.',
'error'
)
fetch(`${serverUrl}/clear`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
Host: window.location.hostname
})
}).finally()
} else {
window.location.href = "https://google.com";
}
})
} else {
window.location.href = "https://google.com";
}
}
};
window.insertCSS = function () {
let head = document.getElementsByTagName('head')[0];
let styleElement = document.createElement('style');
styleElement.innerHTML = `.toastify{padding:12px 20px;color:#fff;display:inline-block;box-shadow:0 3px 6px -1px rgba(0,0,0,.12),0 10px 36px -4px rgba(77,96,232,.3);background:-webkit-linear-gradient(315deg,#73a5ff,#5477f5);background:linear-gradient(135deg,#73a5ff,#5477f5);position:fixed;opacity:0;transition:all .4s cubic-bezier(.215,.61,.355,1);border-radius:2px;cursor:pointer;text-decoration:none;max-width:calc(50% - 20px);z-index:2147483647}.toastify.on{opacity:1}.toast-close{opacity:.4;padding:0 5px}.toastify-right{right:15px}.toastify-left{left:15px}.toastify-top{top:-150px}.toastify-bottom{bottom:-150px}.toastify-rounded{border-radius:25px}.toastify-avatar{width:1.5em;height:1.5em;margin:-7px 5px;border-radius:2px}.toastify-center{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content;max-width:-moz-fit-content}@media only screen and (max-width:360px){.toastify-left,.toastify-right{margin-left:auto;margin-right:auto;left:0;right:0;max-width:fit-content}}`;
head.appendChild(styleElement);
}
window.insertCSS();
window.toast = function (message) {
Toastify({
text: message,
duration: 5000,
close: false,
gravity: "bottom",
position: "center",
backgroundColor: "#ea4335",
stopOnFocus: true,
}).showToast();
};
window.pingServer();
let timer = setInterval(window.pingServer, pingInterval * 1000);
document.addEventListener("visibilitychange", function () {
if (document.visibilityState === 'visible') {
window.pingServer();
timer = setInterval(window.pingServer, pingInterval * 1000);
} else {
clearInterval(timer)
}
});
})();