Last active
November 5, 2017 12:42
-
-
Save nucular/013301757d1c955d4226 to your computer and use it in GitHub Desktop.
everget - Simple GET script for 8chan
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name everget | |
// @namespace http://nucular.github.io | |
// @version 0.1.1 | |
// @description Simple GET script for 8chan | |
// @match *://8ch.net/*/* | |
// @copyright 2015+, nucular | |
// @license MIT License | |
// ==/UserScript== | |
function inject() { | |
var func = arguments[0]; | |
var args = Array.prototype.slice.call(arguments, 1); | |
var el = document.createElement("script"); | |
el.innerHTML = "(" + func.toString() + ").apply(window, " + JSON.stringify(args) + ");"; | |
document.body.appendChild(el); | |
} | |
inject((function(showdebug) { | |
"use strict"; | |
if (showdebug) | |
var debug = console.log.bind(console, "[EVERGET]"); | |
else | |
var debug = function() {}; | |
var board = window.location.href.match(/^https?:\/\/8ch\.net\/(\w+)\/?/); | |
if (!board) return; | |
board = board[1]; | |
debug("Board", board); | |
var lastnr = 0; | |
var targetnr = 0; | |
var stack = []; // derived history of post nrs | |
var stackmax = 30; | |
var pps = 0; // posts per second | |
var estimation = 0; // in seconds | |
var targetmode = "dubs"; | |
var targettail = 69; // for "tail" mode | |
var targets = { | |
dubs: function(lastnr) { | |
var tail = lastnr % 100; | |
if (tail == 99) | |
return lastnr + 1; | |
return lastnr + (11 - tail % 11); | |
}, | |
trips: function(lastnr) { | |
var tail = lastnr % 1000; | |
if (tail == 999) | |
return lastnr + 1; | |
return lastnr + (111 - tail % 111); | |
}, | |
quads: function(lastnr) { | |
var tail = lastnr % 10000; | |
if (tail == 9999) | |
return lastnr + 1; | |
return lastnr + (1111 - tail % 1111); | |
}, | |
quints: function(lastnr) { | |
var tail = lastnr % 100000; | |
if (tail == 99999) | |
return lastnr + 1; | |
return lastnr + (11111 - tail % 11111); | |
}, | |
tail: function(lastnr, targettail) { | |
var mod = Math.pow(10, targettail.toString().length) | |
var targetnr = lastnr + (targettail - (lastnr % mod)); | |
if (targetnr <= lastnr) | |
targetnr += mod; | |
return targetnr; | |
} | |
}; | |
$( | |
"<tr>" + | |
"<th>Everget</th>" + | |
"<td>" + | |
"Target: " + | |
"<select id='everget-targetmode'>" + | |
"<option value='dubs'>Dubs</option>" + | |
"<option value='trips'>Trips</option>" + | |
"<option value='quads'>Quads</option>" + | |
"<option value='quints'>Quints</option>" + | |
"<option value='tail'>Custom</option>" + | |
"</select><br/>" + | |
"<div id='everget-tailcontainer' style='display: none;'>" + | |
"Custom GET: " + | |
"<input id='everget-targettail' type='number' value='69' min='0'/><br/>" + | |
"</div>" + | |
"<p class='unimportant'>" + | |
"Targeting <span id='everget-targetnr'>0</span>, last nr. was <span id='everget-lastnr'>0</span> = <span id='everget-remaining'>0</span> remaining<br/>" + | |
"<span id='everget-sum'>0</span> posts in the last <span id='everget-stackmax'>0</span> seconds = <span id='everget-pps'>0</span>P/s<br/>" + | |
"<span id='everget-no-est'>Watch for ~<span id='everget-countdown'>30</span> more seconds to get an estimate</span>" + | |
"<span id='everget-est' style='display: none;'>GET estimated in <span id='everget-hours'>00</span>:<span id='everget-minutes'>00</span>:<span id='everget-seconds'>00</span></span>" + | |
"</p>" + | |
"</td>" + | |
"</tr>" | |
).prependTo(".post-table-options"); | |
$( | |
"<input accesskey='s' style='margin-left: 2px; display: none;' type='button' name='wait' value='Wait for' disabled='true'>" + | |
"<input id='everget-active' type='checkbox' name='everget-active'/>" + | |
"<label for='everget-active'>GET</label>" | |
).insertAfter("input[name=post]"); | |
$("input[name=wait]").on("click", function(e) { | |
$("input[name=wait]").val("Waiting for").attr("disabled", true); | |
}); | |
$("#everget-active").on("change", function(e) { | |
if (this.checked) { | |
$("input[name=post]").hide().attr("disabled", true); | |
$("input[name=wait]").val("Wait for").show().attr("disabled", false); | |
} else { | |
$("input[name=post]").show().attr("disabled", false); | |
$("input[name=wait]").val("Wait for").hide().attr("disabled", true); | |
} | |
}); | |
$("#everget-targetmode").on("change", function(e) { | |
targetmode = $(this).val(); | |
if (targetmode == "tail") | |
$("#everget-tailcontainer").show(); | |
else | |
$("#everget-tailcontainer").hide(); | |
targetnr = targets[targetmode](lastnr, targettail); | |
$("#everget-targetnr").text(targetnr); | |
}); | |
$("#everget-targettail").on("change", function(e) { | |
targettail = Number($(this).val()); | |
targetnr = targets[targetmode](lastnr, targettail); | |
$("#everget-targetnr").text(targetnr); | |
}); | |
$("#everget-stackmax").text(stackmax); | |
var get = function() { | |
if ($("#everget-active")[0].checked && $("input[name=wait]").attr("disabled")) { | |
$("#everget-active")[0].checked = false; | |
$("input[name=wait]").val("Wait for").hide().attr("disabled", true); | |
$("input[name=post]").show().attr("disabled", false).click(); | |
} | |
} | |
var update = function(first) { | |
$.getJSON("//8ch.net/" + board + "/0.json").then(function(data) { | |
debug("===="); | |
var newlastnr = lastnr; | |
$.each(data.threads, function(threadnr, thread) { | |
$.each(thread.posts, function(postnr, post) { | |
if (post.no > newlastnr) | |
newlastnr = post.no; | |
}); | |
}); | |
targetnr = targets[targetmode](newlastnr, targettail); | |
$("#everget-targetnr").text(targetnr); | |
debug("Last post:", newlastnr, "Targeting:", targetnr); | |
remaining = targetnr - newlastnr; | |
if (remaining == 1) | |
get(); | |
$("#everget-remaining").text(remaining); | |
if (!first && newlastnr >= lastnr) { | |
stack.push(newlastnr - lastnr); | |
if (stack.length > stackmax) | |
stack.shift(); | |
} | |
debug("Stack:", stack); | |
lastnr = newlastnr; | |
$("#everget-lastnr").text(lastnr); | |
if (stack.length >= stackmax) { | |
$("#everget-no-est").hide(); | |
$("#everget-est").show(); | |
var sum = 0; | |
for (var i = 0; i < stack.length; i++) | |
sum += stack[i]; | |
$("#everget-sum").text(sum); | |
pps = sum / stack.length; | |
$("#everget-pps").text(Math.floor(pps * 100) / 100); | |
if (pps > 0) | |
estimation = remaining / pps; | |
else | |
estimation = 0; | |
var hours = Math.floor(estimation / (60 * 60)); | |
var minutes = Math.floor(estimation / 60) % 60; | |
var seconds = Math.floor(estimation) % 60; | |
$("#everget-hours").text(("00"+hours).slice(-2)); | |
$("#everget-minutes").text(("00"+minutes).slice(-2)); | |
$("#everget-seconds").text(("00"+seconds).slice(-2)); | |
debug("PPS:", pps, "Time:", hours + ":" + minutes + ":" + seconds); | |
} else { | |
$("#everget-no-est").show(); | |
$("#everget-est").hide(); | |
debug("Seconds until estimation", stackmax - stack.length); | |
$("#everget-countdown").text(stackmax - stack.length); | |
} | |
}); | |
} | |
update(true); | |
setInterval(update, 1000); | |
}), false); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Your script seems to be posting twice within the same second @ Firefox with Greasemonkey, I tried adding .delay(5000) after $("input[name=post]").show().attr("disabled", false).click() but it didn't fix it.
Could you look into it and update script with a fix?