Auto-Saves your post drafts on BitcoinTalk.org
目前為
// ==UserScript==
// @name Auto-Save Draft for BitcoinTalk.org
// @description Auto-Saves your post drafts on BitcoinTalk.org
// @match https://bitcointalk.org/index.php?action=post*
// @grant none
// @version 1.0
// @author TryNinja
// @namespace https://greasyfork.org/users/1070272
// ==/UserScript==
const INTERVAL_SECONDS = 5;
let initialMessage = getCurrentMessage();
let lastModifiedMessage;
let draftIndicatorElement;
function textToEntities(text) {
let entities = "";
for (let i = 0; i < text.length; i++) {
if (text.charCodeAt(i) > 127) entities += "&#" + text.charCodeAt(i) + ";";
else entities += text.charAt(i);
}
return entities;
}
function insertDraftStatusIndicator() {
const messageArea = document.querySelector("#postmodify textarea[name=message]");
const indicatorElement = document.createElement("p");
indicatorElement.id = "draftIndicator";
indicatorElement.textContent = "Auto-Save draft is activated!";
messageArea.after(indicatorElement);
draftIndicatorElement = document.querySelector('p[id=draftIndicator]');
}
function addEventListenerToPreviewButton() {
const previewButton = document.querySelector('input[name=preview]');
previewButton.addEventListener('click', function() {
const currentMessage = getCurrentMessage();
lastModifiedMessage = currentMessage;
draftIndicatorElement.style = "color: green;";
draftIndicatorElement.textContent = `Draft saved manually @ ${new Date().toUTCString()}`;
});
}
function getCurrentMessage() {
const message = document.querySelector("#postmodify textarea[name=message]").value;
return textToEntities(message.replace(/&#/g, "&#")).replace(/\+/g, "%2B");
}
async function draft(message) {
const formData = new FormData();
formData.append("message", message);
const res = await fetch("https://bitcointalk.org/index.php?action=post2;preview;xml", {
"body": formData,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
if (res.status === 200) {
lastModifiedMessage = message;
draftIndicatorElement.style = "color: green;";
draftIndicatorElement.textContent = `Draft saved @ ${new Date().toUTCString()}`;
} else {
draftIndicatorElement.style = "color: red;";
draftIndicatorElement.textContent = `Draft failed @ ${new Date().toUTCString()}`;
}
}
(() => {
insertDraftStatusIndicator();
addEventListenerToPreviewButton();
setInterval(() => {
const currentMessage = getCurrentMessage();
if (initialMessage !== currentMessage && lastModifiedMessage !== currentMessage) {
draft(currentMessage);
}
}, INTERVAL_SECONDS * 1000)
})()