// ==UserScript==
// @name mGET
// @description Fancy GET script, !kittensORw's fork c: Requires 4chan-X.
// @author mizzl
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @include http://boards.4chan.org/*
// @include https://boards.4chan.org/*
// @grant GM_xmlhttpRequest
// @version 0.0.1.20140723004400
// @namespace https://greasyfork.org/users/3797
// @downloadURL https://update.greasyfork.icu/scripts/3527/mGET.user.js
// @updateURL https://update.greasyfork.icu/scripts/3527/mGET.meta.js
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true); // bug fix
var board = location.pathname.match(/\/[^\/]+\//)[0];
if (board != '/b/') {
$(document).on('QRDialogCreation', bindMGET);
}
$(document).ready(findLatestPostNumber);
var latestPostNumber = -1;
var targetPostNumber = -1;
var mGetSelect = $('');
var targets = {
dubs: function (postNumber) {
var digits = postNumber % 100;
if (digits == 99) {
return postNumber + 1; // next dubs are 00
} else {
return postNumber + (11 - digits % 11);
}
},
trips: function (postNumber) {
var digits = postNumber % 1000;
if (digits == 999) {
return postNumber + 1; // next trips are 000
} else {
return postNumber + (111 - digits % 111);
}
},
quads: function (postNumber) {
var digits = postNumber % 10000;
if (digits == 9999) {
return postNumber + 1; // next quads are 0000
} else {
return postNumber + (1111 - digits % 1111);
}
},
quints: function (postNumber) {
var digits = postNumber % 100000;
if (digits == 99999) {
return postNumber + 1; // next quints are 00000
} else {
return postNumber + (11111 - digits % 11111);
}
},
sixtynine: function (postNumber) {
return postNumber + (69 - (postNumber % 100));
},
seven: function (postNumber) {
return postNumber + (7 - (postNumber % 10));
}
};
populateMGETSelect(targets);
function bindMGET() {
var qr = $('#qr');
var submitButton = qr.find('form #file-n-submit-container #file-n-submit input:submit');
var postNumberDisplay = $('#~');
$(document).on('MTargetPostNumberReached', function () {
submitButton.trigger('click');
});
$(document).on('MTargetPostNumberMissed', function () {
document.dispatchEvent(new CustomEvent('CreateNotification', {
type: 'warning',
content: 'Missed target post number '+targetPostNumber
}));
targetPostNumber = -1;
});
qr.find('div select')
.after(postNumberDisplay)
.after(mGetSelect)
.after('mGET');
document.dispatchEvent(new CustomEvent('QRAddPreSubmitHook', {detail: mGETSubmit}));
console.log('mGET bound');
}
function mGETSubmit() {
if (latestPostNumber + 1 == targetPostNumber) {
targetPostNumber = -1;
return null;
}
var selectedTarget = mGetSelect.find('option:selected').val();
if (selectedTarget == 'none') {
return null;
}
console.log('Target is ' + selectedTarget);
targetPostNumber = targets[selectedTarget](latestPostNumber);
return "Waiting for post number " + targetPostNumber;
}
function urlForPostNumber(postNumber) {
return "http://sys.4chan.org" + board + "imgboard.php?res=" + postNumber;
}
function checkLatestPostNumber() {
var url = urlForPostNumber(latestPostNumber + 1);
GM_xmlhttpRequest({
url: url,
method: "HEAD",
onload: function (res) {
if (res.status == 200) {
latestPostNumber++;
checkLatestPostNumber();
} else {
var displayText = (targetPostNumber == -1) ?
latestPostNumber + '' :
latestPostNumber + ' +' + (targetPostNumber - latestPostNumber);
$('#mGETPostNumberDisplay').text(displayText);
if (latestPostNumber + 1 == targetPostNumber) {
$(document).trigger('MTargetPostNumberReached');
} else if (targetPostNumber <= latestPostNumber) {
$(document).trigger('MTargetPostNumberMissed');
}
checkLatestPostNumber();
}
}
});
}
function findLatestPostNumber() {
function guessLatestPostNumber() {
console.log('Guessing latest post number');
var postNumLinks = $('span.postNum a:nth-child(2)');
postNumLinks.each(function (index, postNumLink) {
var postNumber = parseInt(postNumLink.text.match(/(\d+)/)[0]);
latestPostNumber = postNumber > latestPostNumber ? postNumber : latestPostNumber;
});
console.log('Guessed post number: ' + latestPostNumber);
}
if (latestPostNumber == -1) { // we haven't taken a guess yet
guessLatestPostNumber();
}
checkLatestPostNumber();
}
function populateMGETSelect(targets) {
if (board == '/b/') {
mGetSelect.prop('disabled', true);
mGetSelect.append('');
} else {
mGetSelect.append('');
for (var targetKey in targets) {
mGetSelect.append('');
}
}
}
console.log('mGET loaded');