Master troll panel. Controls victims who have the victim script installed.
// ==UserScript==
// @name π Troll Panel β Master Control
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Master troll panel. Controls victims who have the victim script installed.
// @author You
// @match *://*/*
// @grant none
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
/* βββββββββββββββββββββββββββββββββββββββββββββ
CHANNEL (must match victim script exactly)
βββββββββββββββββββββββββββββββββββββββββββββ */
const CHANNEL_KEY = '__troll_cmd__';
const CHANNEL = new BroadcastChannel(CHANNEL_KEY);
function broadcast(cmd, payload = {}) {
const msg = { cmd, ...payload, ts: Date.now() };
CHANNEL.postMessage(msg);
// Also write to localStorage so victims on other pages pick it up
localStorage.setItem(CHANNEL_KEY, JSON.stringify(msg));
setTimeout(() => localStorage.removeItem(CHANNEL_KEY), 3000);
}
/* βββββββββββββββββββββββββββββββββββββββββββββ
BUILD UI
βββββββββββββββββββββββββββββββββββββββββββββ */
const FONT = 'https://fonts.googleapis.com/css2?family=Share+Tech+Mono&family=Orbitron:wght@700&display=swap';
const link = document.createElement('link');
link.rel = 'stylesheet'; link.href = FONT;
document.head.appendChild(link);
const panel = document.createElement('div');
panel.id = '__troll_panel__';
panel.innerHTML = `
<div class="tp-drag-handle" id="tp-handle">
<span class="tp-logo">β TROLL PANEL</span>
<button class="tp-close" id="tp-close">β</button>
</div>
<div class="tp-body">
<div class="tp-section-label">π₯ SCREEN</div>
<button class="tp-btn danger wide" data-cmd="blackscreen">β¬ Black Screen</button>
<button class="tp-btn warn wide" data-cmd="whitescreen">β¬ White Flash</button>
<button class="tp-btn wide" data-cmd="invertscreen">π Invert Colors</button>
<button class="tp-btn wide" data-cmd="blurscreen">π« Blur Screen</button>
<button class="tp-btn success wide" data-cmd="restore">β
Restore Screen</button>
<div class="tp-divider"></div>
<div class="tp-section-label">π³ SHAKE & SPIN</div>
<button class="tp-btn wide" data-cmd="shake">π³ Shake Page</button>
<button class="tp-btn wide" data-cmd="spin">π Spin Page</button>
<button class="tp-btn wide" data-cmd="flip">π Flip Upside Down</button>
<button class="tp-btn wide" data-cmd="unflip">β© Un-Flip</button>
<div class="tp-divider"></div>
<div class="tp-section-label">π AUDIO</div>
<button class="tp-btn wide" data-cmd="beep">π Annoying Beep</button>
<button class="tp-btn wide" data-cmd="airhorn">π― Air Horn</button>
<div class="tp-divider"></div>
<div class="tp-section-label">π± CURSOR</div>
<button class="tp-btn wide" data-cmd="hidecursor">π» Hide Cursor</button>
<button class="tp-btn wide" data-cmd="randomcursor">π² Random Cursor</button>
<button class="tp-btn wide" data-cmd="restorecursor">π± Restore Cursor</button>
<div class="tp-divider"></div>
<div class="tp-section-label">π¬ POPUP</div>
<div class="tp-row">
<input id="tp-msg-input" class="tp-input" placeholder="Type a messageβ¦" />
<button class="tp-btn" data-cmd="popup">Send</button>
</div>
<div class="tp-divider"></div>
<div class="tp-section-label">π REDIRECT</div>
<div class="tp-row">
<input id="tp-url-input" class="tp-input" placeholder="https://example.com" />
<button class="tp-btn danger" data-cmd="redirect">Go</button>
</div>
<div class="tp-divider"></div>
<div class="tp-section-label">π CHAOS MODE</div>
<button class="tp-btn danger wide" data-cmd="chaos">π ACTIVATE CHAOS</button>
<button class="tp-btn success wide" data-cmd="chaosoff">π STOP CHAOS</button>
</div>
`;
/* βββ Styles βββ */
const style = document.createElement('style');
style.textContent = `
#__troll_panel__ {
position: fixed;
top: 60px;
right: 20px;
z-index: 2147483647;
width: 270px;
background: #0d0d0d;
border: 1px solid #ff2222;
border-radius: 10px;
box-shadow: 0 0 30px rgba(255,30,30,0.4), 0 0 60px rgba(255,0,0,0.15);
font-family: 'Share Tech Mono', monospace;
font-size: 12px;
color: #eee;
user-select: none;
}
.tp-drag-handle {
display: flex;
align-items: center;
justify-content: space-between;
background: linear-gradient(90deg, #1a0000, #330000);
border-radius: 10px 10px 0 0;
padding: 8px 12px;
cursor: grab;
border-bottom: 1px solid #ff2222;
}
.tp-logo {
font-family: 'Orbitron', sans-serif;
font-size: 11px;
color: #ff4444;
letter-spacing: 2px;
text-shadow: 0 0 8px #ff2222;
}
.tp-close {
background: none;
border: 1px solid #ff4444;
color: #ff4444;
border-radius: 4px;
width: 22px; height: 22px;
cursor: pointer;
font-size: 11px;
line-height: 1;
transition: background .2s;
}
.tp-close:hover { background: #ff222244; }
.tp-body {
padding: 10px 12px 14px;
display: flex;
flex-direction: column;
gap: 5px;
max-height: 70vh;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: #ff2222 #1a0000;
}
.tp-section-label {
font-size: 10px;
color: #ff6666;
letter-spacing: 1px;
margin-top: 4px;
text-transform: uppercase;
}
.tp-divider {
border-top: 1px solid #2a0000;
margin: 4px 0;
}
.tp-btn {
background: #1c1c1c;
border: 1px solid #444;
color: #ccc;
border-radius: 5px;
padding: 5px 10px;
cursor: pointer;
font-family: 'Share Tech Mono', monospace;
font-size: 11px;
transition: all .15s;
}
.tp-btn:hover { background: #2a2a2a; border-color: #ff4444; color: #fff; }
.tp-btn.wide { width: 100%; text-align: left; }
.tp-btn.danger { border-color: #ff2222; color: #ff6666; }
.tp-btn.danger:hover { background: #330000; }
.tp-btn.warn { border-color: #ffaa00; color: #ffcc44; }
.tp-btn.warn:hover { background: #221800; }
.tp-btn.success { border-color: #00cc44; color: #44ff88; }
.tp-btn.success:hover { background: #002211; }
.tp-row {
display: flex;
gap: 6px;
}
.tp-input {
flex: 1;
background: #111;
border: 1px solid #444;
color: #eee;
border-radius: 5px;
padding: 4px 8px;
font-family: 'Share Tech Mono', monospace;
font-size: 11px;
outline: none;
}
.tp-input:focus { border-color: #ff4444; }
/* Minimized toggle button */
#__troll_toggle__ {
position: fixed;
top: 20px;
right: 20px;
z-index: 2147483647;
background: #1a0000;
border: 1px solid #ff2222;
color: #ff4444;
border-radius: 6px;
padding: 6px 10px;
cursor: pointer;
font-family: 'Orbitron', sans-serif;
font-size: 10px;
letter-spacing: 1px;
box-shadow: 0 0 12px rgba(255,30,30,0.4);
display: none;
}
#__troll_toggle__:hover { background: #330000; }
`;
document.head.appendChild(style);
document.body.appendChild(panel);
/* Toggle button (shown when panel is closed) */
const toggle = document.createElement('button');
toggle.id = '__troll_toggle__';
toggle.textContent = 'β PANEL';
document.body.appendChild(toggle);
/* βββ Drag βββ */
let dragging = false, ox = 0, oy = 0;
const handle = document.getElementById('tp-handle');
handle.addEventListener('mousedown', e => {
dragging = true;
ox = e.clientX - panel.offsetLeft;
oy = e.clientY - panel.offsetTop;
handle.style.cursor = 'grabbing';
});
document.addEventListener('mousemove', e => {
if (!dragging) return;
panel.style.left = (e.clientX - ox) + 'px';
panel.style.top = (e.clientY - oy) + 'px';
panel.style.right = 'unset';
});
document.addEventListener('mouseup', () => { dragging = false; handle.style.cursor = 'grab'; });
/* βββ Close / Toggle βββ */
document.getElementById('tp-close').addEventListener('click', () => {
panel.style.display = 'none';
toggle.style.display = 'block';
});
toggle.addEventListener('click', () => {
panel.style.display = '';
toggle.style.display = 'none';
});
/* βββ Button Dispatch βββ */
panel.addEventListener('click', e => {
const btn = e.target.closest('[data-cmd]');
if (!btn) return;
const cmd = btn.dataset.cmd;
if (cmd === 'popup') {
const msg = document.getElementById('tp-msg-input').value.trim();
if (msg) broadcast('popup', { message: msg });
} else if (cmd === 'redirect') {
const url = document.getElementById('tp-url-input').value.trim();
if (url) broadcast('redirect', { url });
} else {
broadcast(cmd);
}
// Flash feedback
btn.style.background = '#ff222233';
setTimeout(() => btn.style.background = '', 300);
});
})();