☰

🎭 Troll Panel β€” Master Control

Master troll panel. Controls victims who have the victim script installed.

이 슀크립트λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ Tampermonkey, Greasemonkey λ˜λŠ” Violentmonkey와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 슀크립트λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ Tampermonkey와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ„ μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 슀크립트λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ Tampermonkey λ˜λŠ” Violentmonkey와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 슀크립트λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ Tampermonkey λ˜λŠ” Userscripts와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 슀크립트λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ Tampermonkey와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 슀크립트λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ μœ μ € 슀크립트 κ΄€λ¦¬μž ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

(이미 μœ μ € 슀크립트 κ΄€λ¦¬μžκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ„€μΉ˜λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€!)

이 μŠ€νƒ€μΌμ„ μ„€μΉ˜ν•˜λ €λ©΄ Stylus와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 μŠ€νƒ€μΌμ„ μ„€μΉ˜ν•˜λ €λ©΄ Stylus와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 μŠ€νƒ€μΌμ„ μ„€μΉ˜ν•˜λ €λ©΄ Stylus와 같은 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 μŠ€νƒ€μΌμ„ μ„€μΉ˜ν•˜λ €λ©΄ μœ μ € μŠ€νƒ€μΌ κ΄€λ¦¬μž ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 μŠ€νƒ€μΌμ„ μ„€μΉ˜ν•˜λ €λ©΄ μœ μ € μŠ€νƒ€μΌ κ΄€λ¦¬μž ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이 μŠ€νƒ€μΌμ„ μ„€μΉ˜ν•˜λ €λ©΄ μœ μ € μŠ€νƒ€μΌ κ΄€λ¦¬μž ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

(이미 μœ μ € μŠ€νƒ€μΌ κ΄€λ¦¬μžκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ„€μΉ˜λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€!)

// ==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);
  });

})();