All pastes #5DUMKmdLhG Raw Edit

text paste

public text v1 · immutable
·published 2026-11-02 20:31 UTC
rendered paste body
javascript:(() => { 'use strict'; const w = window; const FLAG = '__BC_BOTH_ADDONS_BOOKMARK_V1__'; const hosts = ['bondageprojects.elementfx.com', 'bondageprojects.com', 'bondage-europe.com', 'bondageeurope.com', 'bondage-asia.com']; if (!hosts.some(h => location.hostname === h || location.hostname.endsWith('.' + h))) { alert('Open Bondage Club first, then click the addon bookmark.'); return; } if (w[FLAG]?.busy) { alert('The addon bookmark is already loading.'); return; } w[FLAG] = {busy: true, results: []}; const defs = [ { name: 'Subby Essentials', already: () => !!(w.SubbysPlushies?.version || w.__SUBBYS_PLUSHIES_ACTIVE__ || document.documentElement.getAttribute('data-subbys-plushies-runtime') === 'main-world-active'), urls: [ 'https://raw.githack.com/marvelous-bc/subby-plushies/main/SubbysPlushies.user.js', 'https://cdn.jsdelivr.net/gh/marvelous-bc/subby-plushies@main/SubbysPlushies.user.js' ] }, { name: 'PawLounge', already: () => !!(w.KittyChat?.version || w.PawLounge?.version || document.documentElement.getAttribute('data-kittychat-injected')), urls: [ 'https://raw.githack.com/marvelous-bc/pawlounge/main/KittyChat.user.js', 'https://cdn.jsdelivr.net/gh/marvelous-bc/pawlounge@main/KittyChat.user.js' ] } ]; let toastNode; const toast = message => { if (!toastNode) { toastNode = document.createElement('div'); toastNode.id = 'bc-both-addons-bookmark-status'; toastNode.setAttribute('role', 'status'); toastNode.style.cssText = 'position:fixed;top:14px;right:14px;max-width:330px;z-index:2147483647;background:#27172f;color:#fff0fa;border:1px solid #db8ac7;box-shadow:0 5px 16px #0009;border-radius:10px;padding:11px 15px;font:13px/1.4 system-ui,sans-serif;white-space:pre-wrap;pointer-events:none'; (document.body || document.documentElement).appendChild(toastNode); } toastNode.textContent = message; }; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); const insertScript = (url, label) => new Promise((resolve, reject) => { const script = document.createElement('script'); script.src = url; script.async = false; script.dataset.bcAddonsBookmarklet = label; if (label === 'Subby Essentials') script.dataset.subbysPlushiesLoader = '1'; let finished = false; const done = error => { if (finished) return; finished = true; clearTimeout(timer); script.onload = null; script.onerror = null; script.remove(); error ? reject(error) : resolve(); }; const timer = setTimeout(() => done(new Error('script load timed out')), 15000); script.onload = () => done(null); script.onerror = () => done(new Error('external script blocked or unavailable')); (document.head || document.documentElement).appendChild(script); }); (async () => { try { toast('Waiting for Bondage Club...'); for (let i = 0; i < 60; i++) { if (document.body && (w.DrawImageEx || w.AssetGet || w.ChatRoomRun || w.Player)) break; await sleep(250); } for (const def of defs) { if (def.already()) { w[FLAG].results.push(def.name + ': already running'); continue; } toast('Loading ' + def.name + '...'); let loaded = false; for (const url of def.urls) { try { await insertScript(url, def.name); loaded = true; break; } catch (err) { console.warn('[BC Addon Bookmark] ' + def.name + ': ' + err.message + ' (' + new URL(url).hostname + ')'); } } if (!loaded) { w[FLAG].results.push(def.name + ': FAILED (see console/CSP)'); continue; } for (let i = 0; i < 20 && !def.already(); i++) await sleep(250); w[FLAG].results.push(def.name + (def.already() ? ': started' : ': script loaded; initializing')); } const results = w[FLAG].results; toast(results.join('\n')); if (results.some(x => x.includes('FAILED'))) { alert('At least one addon could not load. Open F12 > Console for details. A userscript manager is more reliable when the page blocks bookmarklets.'); } console.info('[BC Addon Bookmark]', results); } catch (err) { console.error('[BC Addon Bookmark] Unexpected error:', err); toast('Addon launcher error — check F12 Console.'); } finally { w[FLAG].busy = false; } })(); })();