Discord customizer

Discord style

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Discord customizer
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  Discord style
// @author       _PeDeCoca
// @match        *://*.discord.com/*
// @license      @Mit
// ==/UserScript==

(function() {
    'use strict';

    // Estilos atualizados
    const customStyle = document.createElement('style');
    customStyle.innerHTML = `
        /* Cores personalizadas */
        :root {
            --background-primary: #350048;
            --background-secondary: #1a0024;
            --background-tertiary: #0d0012;
            --text-normal: #ffffff;
        }

        /* Background simples */
        .app-2rEoOp {
            background: linear-gradient(45deg, #12c2e9, #c471ed, #f64f59);
            background-size: 400% 400%;
            animation: gradientBG 15s ease infinite;
        }

        @keyframes gradientBG {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }

        /* Efeito avatar novo e otimizado */
        .avatar_f9f2ca, .avatar-f9f2ca {
            position: relative !important;
            z-index: 2 !important;
            border-radius: 50% !important;
            overflow: visible !important;
            box-shadow:
                0 0 10px #00ffff,
                0 0 20px #00ffff,
                0 0 30px #00ffff,
                inset 0 0 15px rgba(0, 255, 255, 0.5) !important;
            animation: avatarGlow 3s infinite !important;
        }

        /* Wrapper do avatar */
        .clickable_f9f2ca {
            position: relative !important;
            z-index: 2 !important;
            transform-style: preserve-3d !important;
            transition: transform 0.3s !important;
        }

        /* Efeito de borda gradiente */
        .clickable_f9f2ca::before {
            content: '';
            position: absolute;
            top: -3px;
            left: -3px;
            right: -3px;
            bottom: -3px;
            background: linear-gradient(45deg, #ff00ff, #00ffff);
            border-radius: 50%;
            z-index: -1;
            animation: borderRotate 3s linear infinite;
            opacity: 0.8;
        }

        /* Efeito de brilho */
        .clickable_f9f2ca::after {
            content: '';
            position: absolute;
            inset: -5px;
            background: radial-gradient(circle at center,
                rgba(255,255,255,0.8) 0%,
                rgba(255,255,255,0) 70%);
            border-radius: 50%;
            z-index: -1;
            opacity: 0;
            transition: opacity 0.3s;
        }

        /* Efeitos hover */
        .clickable_f9f2ca:hover {
            transform: scale(1.1) rotate(5deg);
        }

        .clickable_f9f2ca:hover::before {
            animation: borderRotate 1s linear infinite;
        }

        .clickable_f9f2ca:hover::after {
            opacity: 0.5;
        }

        /* Animações */
        @keyframes borderRotate {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }

        @keyframes pulseGlow {
            0% { filter: drop-shadow(0 0 5px #ff00ff); }
            50% { filter: drop-shadow(0 0 15px #00ffff); }
            100% { filter: drop-shadow(0 0 5px #ff00ff); }
        }

        /* Ajustes do chat */
        .chat-3bRxxu {
            background: rgba(0, 0, 0, 0.5);
            backdrop-filter: blur(10px);
        }

        /* Container de partículas ajustado */
        #particles-js {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: 0;
            pointer-events: none;
            opacity: 0.5;
        }

        /* Efeitos épicos para o avatar */
        .avatar_f9f2ca, .avatar-f9f2ca {
            position: relative !important;
            z-index: 2 !important;
            border-radius: 50% !important;
            overflow: visible !important;
            box-shadow:
                0 0 10px #00ffff,
                0 0 20px #00ffff,
                0 0 30px #00ffff,
                inset 0 0 15px rgba(0, 255, 255, 0.5) !important;
            animation: avatarGlow 3s infinite !important;
        }

        /* Container do avatar com matrix effect */
        .clickable_f9f2ca {
            position: relative !important;
            z-index: 2 !important;
            transform-style: preserve-3d !important;
            transition: all 0.3s !important;
        }

        /* Efeito matrix no hover */
        .clickable_f9f2ca::before {
            content: '';
            position: absolute;
            inset: -5px;
            background:
                linear-gradient(90deg,
                    rgba(0, 255, 0, 0.5),
                    rgba(0, 255, 255, 0.5)
                ),
                repeating-linear-gradient(
                    0deg,
                    transparent,
                    transparent 2px,
                    rgba(0, 255, 0, 0.2) 2px,
                    rgba(0, 255, 0, 0.2) 4px
                );
            border-radius: 50%;
            z-index: -1;
            opacity: 0;
            transition: all 0.3s;
            animation: matrixFlow 20s linear infinite;
        }

        /* Anel de energia */
        .clickable_f9f2ca::after {
            content: '';
            position: absolute;
            inset: -8px;
            border: 2px solid transparent;
            border-radius: 50%;
            background: linear-gradient(45deg, #ff00ff, #00ffff, #00ff00, #ff00ff) border-box;
            -webkit-mask:
                linear-gradient(#fff 0 0) padding-box,
                linear-gradient(#fff 0 0);
            -webkit-mask-composite: xor;
            mask-composite: exclude;
            opacity: 0.8;
            animation: spinRing 3s linear infinite;
        }

        /* Efeitos hover aprimorados */
        .clickable_f9f2ca:hover {
            transform: scale(1.2) rotate(5deg);
        }

        .clickable_f9f2ca:hover::before {
            opacity: 1;
        }

        .clickable_f9f2ca:hover::after {
            inset: -12px;
            opacity: 1;
        }

        /* Nomes com efeito neon */
        .username-2b1r56,
        .username-3_PJ5r,
        .title-338goq {
            color: #00ffff !important;
            text-shadow:
                0 0 5px #00ffff,
                0 0 10px #00ffff,
                0 0 20px #00ffff !important;
            animation: textPulse 2s infinite;
        }

        /* Animações novas */
        @keyframes avatarGlow {
            0%, 100% { filter: brightness(1) hue-rotate(0deg); }
            50% { filter: brightness(1.5) hue-rotate(180deg); }
        }

        @keyframes matrixFlow {
            0% { background-position: 0 0; }
            100% { background-position: 0 1000px; }
        }

        @keyframes spinRing {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }

        @keyframes textPulse {
            0%, 100% { opacity: 1; text-shadow: 0 0 10px #00ffff; }
            50% { opacity: 0.8; text-shadow: 0 0 20px #00ffff; }
        }

        /* Efeito de energia ao clicar */
        .clickable_f9f2ca:active::after {
            animation: energyBurst 0.5s ease-out;
        }

        @keyframes energyBurst {
            0% { transform: scale(1); opacity: 1; }
            50% { transform: scale(1.5); opacity: 0.5; }
            100% { transform: scale(1); opacity: 0.8; }
        }
    `;

    // Adiciona canvas para Matrix
    function createMatrixBackground() {
        const canvas = document.createElement('canvas');
        canvas.id = 'matrix-bg';
        document.body.appendChild(canvas);

        const ctx = canvas.getContext('2d');
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;

        const matrix = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789@#$%^&*()*&^%";
        const fontSize = 10;
        const columns = canvas.width/fontSize;
        const drops = [];

        for(let x = 0; x < columns; x++)
            drops[x] = 1;

        function drawMatrix() {
            ctx.fillStyle = 'rgba(0, 0, 0, 0.04)';
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            ctx.fillStyle = '#0F0';
            ctx.font = fontSize + 'px monospace';

            for(let i = 0; i < drops.length; i++) {
                const text = matrix[Math.floor(Math.random()*matrix.length)];
                ctx.fillText(text, i*fontSize, drops[i]*fontSize);
                if(drops[i]*fontSize > canvas.height && Math.random() > 0.975)
                    drops[i] = 0;
                drops[i]++;
            }
        }

        setInterval(drawMatrix, 33);
    }

    // Sistema de partículas
    function createParticleSystem() {
        const particlesContainer = document.createElement('div');
        particlesContainer.id = 'particles-js';
        document.body.appendChild(particlesContainer);

        const particles = [];
        const mouse = { x: null, y: null };

        class Particle {
            constructor(x, y) {
                this.x = x;
                this.y = y;
                this.size = Math.random() * 3 + 1; // Partículas menores
                this.baseX = x;
                this.baseY = y;
                this.density = Math.random() * 30 + 1;
                // Adiciona velocidade própria para movimento autônomo
                this.speedX = (Math.random() * 1 - 0.5) * 0.5; // Velocidade reduzida
                this.speedY = (Math.random() * 1 - 0.5) * 0.5; // Velocidade reduzida
                // Adiciona cor aleatória em tons de azul/roxo
                this.color = `rgba(${114 + Math.random() * 30}, ${137 + Math.random() * 30}, ${218 + Math.random() * 37}, ${0.6 + Math.random() * 0.4})`;
            }

            draw(ctx) {
                ctx.fillStyle = this.color;
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
                ctx.closePath();
                ctx.fill();
            }

            update() {
                // Movimento autônomo
                this.x += this.speedX;
                this.y += this.speedY;

                // Verificar limites da tela
                if (this.x < 0 || this.x > window.innerWidth) this.speedX *= -1;
                if (this.y < 0 || this.y > window.innerHeight) this.speedY *= -1;

                // Interação com o mouse
                let dx = mouse.x - this.x;
                let dy = mouse.y - this.y;
                let distance = Math.sqrt(dx * dx + dy * dy);

                if (distance < 100) {
                    let forceDirectionX = dx / distance;
                    let forceDirectionY = dy / distance;
                    let force = (100 - distance) / 100;
                    let directionX = forceDirectionX * force * this.density;
                    let directionY = forceDirectionY * force * this.density;
                    this.x -= directionX * 0.5; // Reduzido o efeito do mouse
                    this.y -= directionY * 0.5;
                }

                // Efeito de ondulação suave
                this.x += Math.sin(this.y/50) * 0.3;
                this.y += Math.cos(this.x/50) * 0.3;
            }
        }

        const canvas = document.createElement('canvas');
        canvas.style = 'position: fixed; top: 0; left: 0; pointer-events: none;';
        document.body.appendChild(canvas);
        const ctx = canvas.getContext('2d');

        function initParticles() {
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
            particles.length = 0;

            // Reduzido o número de partículas
            for (let i = 0; i < 50; i++) { // Mudado de 150 para 50 partículas
                const x = Math.random() * canvas.width;
                const y = Math.random() * canvas.height;
                particles.push(new Particle(x, y));
            }
        }

        function animate() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);

            for (const particle of particles) {
                particle.update();
                particle.draw(ctx);
            }

            // Desenha linhas entre partículas próximas com gradiente
            for (let i = 0; i < particles.length; i++) {
                for (let j = i; j < particles.length; j++) {
                    const dx = particles[i].x - particles[j].x;
                    const dy = particles[i].y - particles[j].y;
                    const distance = Math.sqrt(dx * dx + dy * dy);

                    if (distance < 100) {
                        const gradient = ctx.createLinearGradient(
                            particles[i].x, particles[i].y,
                            particles[j].x, particles[j].y
                        );
                        gradient.addColorStop(0, particles[i].color);
                        gradient.addColorStop(1, particles[j].color);

                        ctx.beginPath();
                        ctx.strokeStyle = gradient;
                        ctx.lineWidth = 0.5;
                        ctx.moveTo(particles[i].x, particles[i].y);
                        ctx.lineTo(particles[j].x, particles[j].y);
                        ctx.stroke();
                    }
                }
            }

            requestAnimationFrame(animate);
        }

        window.addEventListener('mousemove', (e) => {
            mouse.x = e.x;
            mouse.y = e.y;
        });

        window.addEventListener('resize', initParticles);
        initParticles();
        animate();
    }

    // Função para garantir que os efeitos do avatar sejam aplicados
    function ensureAvatarEffects() {
        const avatarSelectors = [
            '.avatar_f9f2ca',
            '.clickable_f9f2ca',
            '.avatar-f9f2ca'
        ];

        const avatars = document.querySelectorAll(avatarSelectors.join(','));
        avatars.forEach(avatar => {
            if (!avatar.dataset.enhanced) {
                avatar.dataset.enhanced = 'true';

                // Força o reflow do CSS
                requestAnimationFrame(() => {
                    avatar.style.position = 'relative';
                    avatar.style.zIndex = '2';
                    avatar.style.display = 'none';
                    avatar.offsetHeight;
                    avatar.style.display = '';
                });
            }
        });
    }

    // Adiciona observer específico para avatares
    function setupAvatarObserver() {
        const avatarObserver = new MutationObserver((mutations) => {
            mutations.forEach(mutation => {
                if (mutation.addedNodes.length) {
                    ensureAvatarEffects();
                }
            });
        });

        avatarObserver.observe(document.body, {
            childList: true,
            subtree: true
        });
    }

    // Função de inicialização atualizada
    function applyCustomizations() {
        document.head.appendChild(customStyle);
        createParticleSystem();
        ensureAvatarEffects();
        setupAvatarObserver();

        // Aplicação mais frequente dos efeitos
        setInterval(ensureAvatarEffects, 1000);

        console.log('Discord customizado com efeitos visuais aplicados!');
    }

    // Inicia quando o DOM estiver pronto
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', applyCustomizations);
    } else {
        applyCustomizations();
    }
})();