// ==UserScript==
// @name Zibzab's GameDox/Rom Upload Helper
// @namespace http://tampermonkey.net/
// @version 1.2
// @description try to take over the world :)
// @author BestGrapeLeaves
// @match https://gazellegames.net/upload.php?groupid=*
// @icon https://i.imgur.com/UFOk0Iu.png
// @grant GM_xmlhttpRequest
// @connect datomatic.no-intro.org
// @license MIT
// @downloadURL none
// ==/UserScript==
const GAME_DOX_INSERT = `[align=center] pdf pages
[/align]
`;
const genRomInsert = (
url = "xxx",
filename = "xxx"
) => `[align=center]${filename} matches [url=${url}]No-Intro checksum[/url]
Compressed with [url=https://sourceforge.net/projects/trrntzip/]torrentzip.[/url][/align]
`;
function noIntroUI() {
// elements
const noIntroContainer = $(
`
No-Intro Link |
`
);
const noIntroInput = $(
''
);
const noIntroError = $(
''
).hide();
const noIntroLoading = $(
'Loading...
'
).hide();
// structure
const td = $(" | ");
td.append(noIntroInput);
td.append(noIntroError);
td.append(noIntroLoading);
noIntroContainer.append(td);
// utils
const error = (msg) => {
noIntroError.text(msg);
noIntroError.show();
};
const loading = (isLoading) => {
if (isLoading) {
noIntroLoading.show();
} else {
noIntroLoading.hide();
}
};
return { loading, error, noIntroContainer, noIntroInput, noIntroError };
}
(function () {
"use strict";
const { noIntroContainer, noIntroInput, noIntroError, error, loading } =
noIntroUI();
// handle url
let justChecked = "";
const submitNoInput = () => {
noIntroError.hide();
const url = noIntroInput.val();
if (justChecked === url) {
return;
}
if (!url.startsWith("https://datomatic.no-intro.org/")) {
error("Invalid URL");
return;
}
justChecked = url;
loading(true);
GM_xmlhttpRequest({
method: "GET",
url,
timeout: 5000,
onload: ({ responseText }) => {
try {
const parser = new DOMParser();
const scraped = parser.parseFromString(responseText, "text/html");
// HTML is great
const filename = scraped
.querySelector("td.TableTitle")
.parentElement.parentElement.parentElement.nextElementSibling.querySelector(
"table > tbody > tr:nth-child(2) > td:last-child"
)
.innerText.trim();
const title = scraped.querySelector('tr.romname_section > td').innerText.trim();
const region = title.match(/\(([^\)]+)\)/)[1];
const toSelect = php_torrent_form_regions.find((r) => r === region) || "Other";
$("textarea#release_desc").val(genRomInsert(url, filename));
$("select#region").val(toSelect);
loading(false);
} catch (err) {
loading(false);
error(
"Failed to parse no-intro :/\nPlease report to BestGrapeLeaves,\nthe error was logged to the browser console"
);
console.error("zibzab helper failed to parse no-intro:", err);
}
},
ontimeout: () => {
loading(false);
error("Request to no-intro timed out after 5 seconds");
},
});
};
// bind events
noIntroInput.on("paste", (e) => {
e.preventDefault();
const text = e.originalEvent.clipboardData.getData("text/plain");
noIntroInput.val(text);
submitNoInput();
});
noIntroInput.blur(submitNoInput);
$("select#miscellaneous").change(function () {
const selected = $("select#miscellaneous option:selected").text();
if (selected === "GameDOX") {
noIntroContainer.detach();
$("input#release_title").val(
$("input#release_title").val() + " - Manual"
);
$("select#gamedox").val("Guide").change();
$("select#format").val("PDF").change();
$("input#scan").click();
Scan();
$("textarea#release_desc").val(
$("textarea#release_desc").val() + GAME_DOX_INSERT
);
} else if (selected === "ROM") {
// const url = prompt("Please enter the ROM's No-Intro link:");
noIntroContainer.insertBefore("#regionrow");
$("textarea#release_desc").val(genRomInsert());
} else {
noIntroContainer.detach();
}
});
})();