Twitter Retweet Temizleyici

Twitter'da retweet'leri otomatik olarak siler, hızı ayarlar ve istatistikleri gösterir.

// ==UserScript==
// @name         Twitter Retweet Temizleyici
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Twitter'da retweet'leri otomatik olarak siler, hızı ayarlar ve istatistikleri gösterir.
// @author       odk-0160
// @match        https://twitter.com/*
// @match        https://x.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // Panel HTML'i
    const panelHTML = `
    <div id="retweetCleanerPanel" style="position: fixed; top: 10px; right: 10px; background: var(--background-color, #ffffff); padding: 15px; border: 1px solid var(--border-color, #e1e8ed); border-radius: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); z-index: 1000; font-family: 'TwitterChirp', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; color: var(--text-color, #000000); width: 320px;">
        <h3 style="margin: 0 0 15px; font-size: 16px; font-weight: 700; color: var(--text-color, #000000);">Retweet Temizleyici</h3>
        <div style="display: flex; gap: 10px; margin-bottom: 15px;">
            <button id="startButton" style="flex: 1; padding: 8px 12px; background: #1DA1F2; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 500; transition: background 0.2s;">Başlat</button>
            <button id="stopButton" style="flex: 1; padding: 8px 12px; background: #ff4b4b; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 500; transition: background 0.2s;">Durdur</button>
        </div>
        <div style="margin-bottom: 15px;">
            <label for="limitInput" style="font-size: 14px; color: var(--text-secondary, #657786);">Kaç RT silinsin? (Boş bırakılırsa sınır yok):</label>
            <input id="limitInput" type="number" min="1" placeholder="Boş bırakın" style="width: 100%; padding: 5px; border-radius: 8px; border: 1px solid var(--border-color, #e1e8ed); background: var(--background-color, #ffffff); color: var(--text-color, #000000);">
        </div>
        <div style="margin-bottom: 15px;">
            <label for="speedInput" style="font-size: 14px; color: var(--text-secondary, #657786);">Hız (ms cinsinden):</label>
            <input id="speedInput" type="number" min="500" value="1000" style="width: 100%; padding: 5px; border-radius: 8px; border: 1px solid var(--border-color, #e1e8ed); background: var(--background-color, #ffffff); color: var(--text-color, #000000);">
        </div>
        <div style="margin-bottom: 15px;">
            <label style="font-size: 14px; color: var(--text-secondary, #657786);">İstatistikler:</label>
            <div style="font-size: 14px; color: var(--text-color, #000000);">
                <span>Kaldırılan: <span id="removedCount">0</span></span><br>
                <span>Atlanan: <span id="skippedCount">0</span></span><br>
                <span>Hatalar: <span id="errorCount">0</span></span>
            </div>
        </div>
        <div style="margin-bottom: 15px;">
            <label style="font-size: 14px; color: var(--text-secondary, #657786);">İşlem Logu:</label>
            <div id="logBox" style="height: 100px; overflow-y: auto; background: var(--log-background, #f5f8fa); border: 1px solid var(--border-color, #e1e8ed); border-radius: 8px; padding: 5px; font-size: 12px; color: var(--text-color, #000000);">
                <!-- Log mesajları buraya eklenecek -->
            </div>
        </div>
    </div>
    `;

    // Paneli sayfaya ekle
    document.body.insertAdjacentHTML('afterbegin', panelHTML);

    // Değişkenler
    let isRunning = false;
    let totalUnretweets = 0;
    let skippedCount = 0;
    let errorCount = 0;

    // Log mesajı ekleme fonksiyonu
    function addLog(message) {
        const logBox = document.getElementById('logBox');
        const logEntry = document.createElement('div');
        logEntry.textContent = message;
        logBox.appendChild(logEntry);
        logBox.scrollTop = logBox.scrollHeight; // Otomatik kaydırma
    }

    // Retweet'leri geri alma fonksiyonu
    async function unretweetAll() {
        const limitInput = document.getElementById('limitInput');
        const speedInput = document.getElementById('speedInput');
        const limit = limitInput.value ? parseInt(limitInput.value, 10) : Infinity;
        const speed = parseInt(speedInput.value, 10);

        while (isRunning && totalUnretweets < limit) {
            let unretweetButtons = document.querySelectorAll('[data-testid="unretweet"]');

            if (unretweetButtons.length === 0) {
                addLog("⏭️ Kaldırılacak retweet bulunamadı. Sayfa kaydırılıyor...");
                window.scrollTo(0, document.body.scrollHeight);
                await new Promise(resolve => setTimeout(resolve, speed));
                continue;
            }

            for (const button of unretweetButtons) {
                if (!isRunning || totalUnretweets >= limit) break;

                button.click();
                await new Promise(resolve => setTimeout(resolve, 500));

                const confirmButton = document.querySelector('[data-testid="unretweetConfirm"]');
                if (confirmButton) {
                    confirmButton.click();
                    totalUnretweets++;
                    document.getElementById('removedCount').textContent = totalUnretweets;
                    addLog(`✅ Retweet kaldırıldı. Toplam kaldırılan retweet sayısı: ${totalUnretweets}`);
                } else {
                    skippedCount++;
                    document.getElementById('skippedCount').textContent = skippedCount;
                    addLog("⏭️ Retweet atlandı (onay butonu bulunamadı).");
                }

                await new Promise(resolve => setTimeout(resolve, speed));
            }
        }

        if (isRunning) {
            addLog("🏁 İşlem tamamlandı.");
            isRunning = false;
        }
    }

    // Başlat butonu
    document.getElementById('startButton').addEventListener('click', () => {
        if (!isRunning) {
            isRunning = true;
            addLog("▶️ İşlem başlatıldı.");
            unretweetAll();
        }
    });

    // Durdur butonu
    document.getElementById('stopButton').addEventListener('click', () => {
        if (isRunning) {
            isRunning = false;
            addLog("🛑 İşlem durduruldu.");
        }
    });
})();