Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save d0zingcat/b588c645c333d0fe8d486e18d61b7815 to your computer and use it in GitHub Desktop.
Save d0zingcat/b588c645c333d0fe8d486e18d61b7815 to your computer and use it in GitHub Desktop.
Premint Checker Bookmarklet
.col-lg-3.mb-4 {
width: 33%;
min-width: 33%;
}
.card {
flex-direction: row;
height: 100%;
overflow: hidden;
}
.card-image {
width: 80px;
min-width: 80px;
height: 100%;
}
.card-image img {
object-fit: cover;
height: 100%;
}
.card-body {
padding: 0;
}
.card-body.text-truncate {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.card-info {
padding: 7px 12px;
}
.card-info a {
white-space: initial;
}
.card-body .loading {
display: inline-block;
position: relative;
left: 2px;
bottom: -2px;
color: #aaa;
}
.card-body .error-message {
margin-left: -0.5px;
margin-top: 5px;
}
.card-body .error-message .message {
margin-left: 1.5px;
}
.card-verify {
display: flex;
align-items: center;
padding: 7px 0;
white-space: initial;
border-top: 1px solid #e0e1e2;
}
.card .border-bottom {
border-color: #eaeaea !important;
}
.card-verify .heading {
font-size: 22px !important;
padding: 0 8px 0 10px;
margin: 0;
}
.card-verify .heading-3 {
padding: 5px 0;
text-align: left;
font-size: 14px !important;
}
.card-result {
padding: 7px 12px;
position: relative;
}
.card-result i:first-child {
position: absolute;
top: 10px;
left: 10px;
}
.card-result .heading {
display: inline-block;
padding-left: 20px;
white-space: initial;
font-size: 14px;
}
.error-message {
position: relative;
}
.verify-link i {
font-weight: 400;
position: relative;
top: -1px;
}
.error-message i {
position: absolute;
top: 2px;
font-weight: 400;
}
.error-message .message {
padding-left: 15px;
margin-left: 0;
white-space: initial;
display: inline-block;;
}
.card-winner {
background: #f8f9fa;
height: 80%;
white-space: initial;
padding: 7px 12px;
}
.card-winner p {
white-space: initial;
}
/*
*
* Premint Checker
*
* @authoer MePunk Wake
* @created 2022/04/17
* @updated 2022/04/29
* @version 1.3.1
*
*/
(function ($) {
if (! $)
return reject_usage ();
/*
*
* Current version
*
*/
const VERSION = "1.3.1";
const LAST_VERSION = window.pc_last_version || false;
const ENABLE_VERSION_CHECKER = true;
/*
*
* Defines
*
*/
const LAB = {
host: "lab.mepunk.tech",
path: "/tool/utility/premint",
vurl: "/p/tool/utility/premint/version.txt?" + (new Date ()).getTime ()
};
const PREMINT = {
host: "www.premint.xyz",
path: "/collectors/entries/",
delay: 300,
amount: 300
};
/*
*
* Main function
*
*/
function main () {
/*
*
* Premint process flow
*
*/
if (is_premint (location) && check_jquery_exists ($)) {
let idx = 0
, $cards = $(".card")
, end = Math.min (PREMINT.amount, $cards.not (".loaded").length) - 1;
ENABLE_VERSION_CHECKER && check_last_version ();
generate_style ();
generate_url ($cards.not (".urled"));
queue_retrieve ($cards.not (".loaded"), idx, end);
return;
}
/*
*
* Lab process flow
*
*/
else if (is_lab (location) && check_jquery_exists ($)) {
}
reject_usage ();
return;
}
/*
*
* Alert if not avialable
*
*/
function reject_usage () {
if (confirm ("此工具只能在下列網址使用,是否跳轉至該網址?\nhttps://www.premint.xyz/collectors/entries/"))
location.href = "https://www.premint.xyz/collectors/entries/";
return false;
}
/*
*
* Check if at url: https://lab.mepunk.tech/tool/utility/premint
*
*/
function is_lab (location) {
return (location.host === LAB.host && location.pathname === LAB.path);
}
/*
*
* Check if at url: https://www.premint.xyz/collectors/entries/
*
*/
function is_premint (location) {
return (location.host === PREMINT.host && location.pathname === PREMINT.path);
}
/*
*
* Check if jQuery library exists
*
*/
function check_jquery_exists (jq) {
return ! (typeof jq == "undefined");
}
/*
*
* Check current page verison
*
*/
function check_current_page_version () {
}
/*
*
* Check current page verison
*
*/
function get_filtered_verify_html (html) {
html = html.substring (html.indexOf (`<div class="card-body `));
html = html.substring (0, html.indexOf (`<form method="get" `));
return $(html).find ("p").remove ().end ().eq (0);
}
/*
*
* Check current page verison
*
*/
function get_filtered_result_html (html, selector = "") {
html = html.substring (html.indexOf (`<form role="form" `));
html = html.substring (0, html.indexOf (`</form>`));
html = html.replaceAll ("fa-3x", "").replaceAll ("heading-3", "");
if (selector == "")
return $(html);
return $(html).find (selector).eq (0);
}
/*
*
* Generate urls
*
*/
function check_last_version () {
if (LAST_VERSION !== false)
return;
$.get (`https://${LAB.host}${LAB.vurl}`)
.done (function (ver) {
ver = ver.replace ("\n", "").replace ("\r", "");
window.pc_last_version = ver;
if (ver <= VERSION)
return;
$("body").append (`<a href="https://${LAB.host}${LAB.path}"`
+ ` target="_blank"`
+ ` class="fixed-top px-3 py-2 bg-success text-white m-3 rounded text-center"`
+ ` style="width: 215px; font-size: 14px; left: initial; right: 0; text-decoration: underline;">`
+ `Premint Checker v${ver} <i class="fas fa-external-link pl-2"></i></a>`);
});
}
/*
*
* Generate urls
*
*/
function generate_style () {
if ($("body").find ("pchecker-style").length > 0)
return;
$("body").append ("<style id=\"pchecker-style\">.col-lg-3.mb-4{width:33%;min-width:33%}.card{flex-direction:row;height:100%;overflow:hidden}.card-image{width:80px;min-width:80px;height:100%}.card-image img{object-fit:cover;height:100%}.card-body{padding:0}.card-body.text-truncate{display:flex;flex-direction:column;justify-content:space-between}.card-info{padding:7px 12px}.card-info a{white-space:initial}.card-body .loading{display:inline-block;position:relative;left:2px;bottom:-2px;color:#aaa}.card-body .error-message{margin-left:-.5px;margin-top:5px}.card-body .error-message .message{margin-left:1.5px}.card-verify{display:flex;align-items:center;padding:7px 0;white-space:initial;border-top:1px solid #e0e1e2}.card .border-bottom{border-color:#eaeaea!important}.card-verify .heading{font-size:22px!important;padding:0 8px 0 10px;margin:0}.card-verify .heading-3{padding:5px 0;text-align:left;font-size:14px!important}.card-result{padding:7px 12px;position:relative}.card-result i:first-child{position:absolute;top:10px;left:10px}.card-result .heading{display:inline-block;padding-left:20px;white-space:initial;font-size:14px}.error-message{position:relative}.verify-link i{font-weight:400;position:relative;top:-1px}.error-message i{position:absolute;top:2px;font-weight:400}.error-message .message{padding-left:15px;margin-left:0;white-space:initial;display:inline-block}.card-winner{background:#f8f9fa;height:80%;white-space:initial;padding:7px 12px}.card-winner p{white-space:initial}</style>");
}
/*
*
* Generate urls
*
*/
function generate_url ($cards) {
$cards.each (function (i, card) {
let $card = $(card).addClass ("urled")
, url = $card.find (".card-image a").attr ("href")
;
if (url.substr (0, 4) == "http") {
display_error_message ($card, "", "fa fa-unlink", "External Url");
}
else {
$card
.data ("verify-url", `${url}verify/`)
.data ("result-url", `${url}`)
.find (".strong-700")
.next ()
.after (`<a href="${url}verify/" class="verify-link d-block pt-2 text-sm c-grey-light" target="_blank"><i class="fas fa-external-link"></i> Verify</a>`);
}
});
}
/*
*
* Display error message
*
*/
function display_error_message ($card, cname, icon, message) {
cname = cname == "" ? "text-danger" : cname;
icon = icon == "" ? "fas fa-times-circle" : icon;
let error = `<span class="error-message d-block text-sm c-grey-light ${cname}"><i class="${icon}"></i><span class="message">${message}</span></span>`;
$loading = $card
.addClass ("url-illegal")
.data ("result-url", null)
.find (".loading");
if ($loading.length > 0)
$loading.replaceWith (error);
else
$card.find (".verify-link, .error-message").last ().after (error);
}
/*
*
* Retrieve premint result
*
*/
function queue_retrieve ($cards, idx, end) {
// Loop end, remove all loading state
if (idx > end) {
$cards.find (".loading").remove ();
return;
}
// Mark all cards as loading state
if (idx == 0) {
$cards
.not (".url-illegal")
.find (".card-body")
.append (`<span class="loading"><i class="fas fa-circle-notch fa-spin"></i></span>`)
.wrapInner ("<div class=\"card-info\" />");
}
let $card = $cards.eq (idx);
// Illegal url, move to next
if ($card.hasClass ("url-illegal")) {
$card.addClass ("loaded");
queue_retrieve ($cards, idx + 1, end);
return;
}
retrieve_verify ($card, function () {
setTimeout (function () {
queue_retrieve ($cards, idx + 1, end);
}, PREMINT.delay);
});
}
/*
*
* Retrieve premint result
*
*/
function retrieve_verify ($card, next) {
$.get ($card.data ("verify-url"))
.done (function (html) {
$embed = get_filtered_verify_html (html)
.removeClass ("card-body").addClass ("card-verify text-center")
.find (".mb-3").removeClass ("mb-3")
.end ();
$card.addClass ("loaded").find (".loading").remove ()
.end ().find (".card-info").after ($("<div></div>").append ($embed));
})
.fail (function () {
$card.addClass ("loaded").find (".loading").remove ()
.end ().find (".card-info").after ($("<div></div>"));
}).always (function () {
retrieve_result ($card);
next ();
});
}
/*
*
* Retrieve premint result
*
*/
function retrieve_result ($card) {
$.get ($card.data ("result-url"))
.done (function (html) {
if (html.indexOf ("This page is password protected") >= 0) {
display_error_message ($card, "", "fas fa-lock", "This page is password protected");
return;
}
else if (html.indexOf ("This project has been flagged and is no longer accepting entries") >= 0) {
display_error_message ($card, "", "fas fa-flag", "This project has been flagged and is no longer accepting entries");
return;
}
// Normal case
if (html.indexOf ("user_is_winner") !== -1) {
$embed = get_filtered_result_html (html, "#user_is_winner")
.find (".card-body").addClass ("card-winner text-center").removeClass ("card-body");
}
else if (html.indexOf ("registration_status") !== -1) {
$embed = get_filtered_result_html (html, "#registration_status")
.find (".card-body").addClass ("card-result bg-success").removeClass ("card-body");
}
else {
display_error_message ($card, "", "fas fa-times-circle", "This project has been flagged");
return;
}
$embed.find ("a[href^=\"mailto:info@premint\"]").remove ();
$embed.find ("a[href^=\"https://twitter.com/share\"]").remove ();
$card.addClass ("loaded").find (".loading").remove ()
.end ().find (".card-info").next ().append ($embed);
})
.fail (function () {
display_error_message ($card, "", "fas fa-unlink", "Illegal Url");
})
.always (function () {
if (typeof next !== "undefined")
next ();
});
}
/*
*
* Boot
*
*/
main ();
})(typeof jQuery == "undefined" ? false : jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment