// ==UserScript==
// @name Per Thread Status
// @namespace https://greasyfork.org/users/2562
// @version 0.75
// @description This adds a custom status field to the list of threads in the forum view. This should work on both SB/SV and probably other XenForo based forums with a bit of tweaking.
// @author arctica
// @match https://forums.spacebattles.com/forums/*
// @match https://forums.sufficientvelocity.com/forums/*
// @match https://forums.spacebattles.com/watched/threads*
// @match https://forums.sufficientvelocity.com/watched/threads*
// @grant none
// @downloadURL https://update.greasyfork.icu/scripts/405823/Per%20Thread%20Status.user.js
// @updateURL https://update.greasyfork.icu/scripts/405823/Per%20Thread%20Status.meta.js
// ==/UserScript==
function append_info() {
// set the threads to an array var for use
var threads_array = document.getElementsByClassName("js-inlineModContainer");
// set the total number of threads
var threads_total = threads_array.length;
// loop through all the threads
// and add an the thread id as an ID
for (var i = 0; i < threads_total; i++) {
// create an array based on the class list
var temp_array = Array.from(threads_array[i].classList);
// find the className and then read only the thread id
var temp_number = temp_array[temp_array.findIndex(element => element.includes("js-threadListItem-"))].substring(18);
// set the thread id to the ID of the thread html element
threads_array[i].id = temp_number;
// set the status from the localstorage
var temp_status = check_status(temp_number);
// set the opacatiy, if status not set set to 0.25 otherwise set to 0.75
var temp_opacity = (temp_status == "Not Set") ? 0.25 : 0.75;
// add the custom status to the page
threads_array[i].getElementsByClassName("structItem-minor")[0].innerHTML += "
" + temp_status + "
";
// set click event to run allowing change of status
document.getElementById(temp_number).getElementsByClassName("PTS-Status")[0].addEventListener("click", change_status(temp_number));
}
}
function change_status(temp_id) {
return function() {
//grab the current custom status
var temp_current = document.getElementById(temp_id).getElementsByClassName("PTS-Status")[0].innerText;
//create user input box
var temp_prompt = prompt("Please input a custom status.\nIf set to \"Not Set\" then the custom status will be removed.", temp_current);
// if the user kept the Not Set setting
if (temp_prompt == "Not Set") {
// update value on document keeping it in italics
document.getElementById(temp_id).getElementsByClassName("PTS-Status")[0].innerHTML = "Not Set";
// update the opacity
document.getElementById(temp_id).getElementsByClassName("PTS-Status")[0].style.opacity = 0.25;
// remove the updated value
remove_status(temp_id);
// if the prompt isn't null and not just spaces or blank
} else if (temp_prompt != null & temp_prompt.trim().length) {
// update the status
document.getElementById(temp_id).getElementsByClassName("PTS-Status")[0].innerHTML = temp_prompt;
// update the opacity
document.getElementById(temp_id).getElementsByClassName("PTS-Status")[0].style.opacity = 0.75;
// store the id/status in the localstorage
store_status(temp_id, temp_prompt);
}
};
}
function store_status(temp_id, temp_status) {
// create array based on thread id and status value
var temp_thread = [temp_id, temp_status];
// create array of threads for use, if already exsiting will be overwritten
var temp_array = [temp_thread];
// check to see if something was stored, if yes edit.
if (localStorage["pts-threads"] != null) {
// update temp array based on local storage
temp_array = JSON.parse(localStorage["pts-threads"]);
// check to see if thread id exists in array. If it does, update the existing data; otherwise add the thread info into the array
(temp_array.find(element => element[0] == temp_id) != null) ? temp_array.find(element => element[0] == temp_id)[1] = temp_status : temp_array.push(temp_thread);
}
// update the localstorage
localStorage["pts-threads"] = JSON.stringify(temp_array);
}
function remove_status(temp_id) {
// check to see if something was stored
if (localStorage["pts-threads"] != null) {
var temp_array = JSON.parse(localStorage["pts-threads"]);
// if the temp_id can be found in the stored array
if (temp_array.find(element => element[0] == temp_id) != null) {
// remove the id/status from the array
temp_array.splice(temp_array.findIndex(element => element[0] == temp_id), 1);
// update the local storage
localStorage["pts-threads"] = JSON.stringify(temp_array);
}
}
}
function check_status(temp_id) {
// Set the status to not set
var temp_status;
// check to see if the localstorage has been used yet. if yes search for thread ID
if (localStorage["pts-threads"] != null) {
var temp_array = JSON.parse(localStorage["pts-threads"]);
// if that thread id is already in use, if it is use the exsiting data; otherwise the status is not set.
(temp_array.find(element => element[0] == temp_id) != null) ? temp_status = temp_array.find(element => element[0] == temp_id)[1] : temp_status = "Not Set";
// if local storage is not in use
} else {
// set the status to not set
temp_status = "Not Set";
}
return temp_status;
}
//Give threads an ID of the thread id number on load //window.onload = append_id()
append_info();