Auto Leave Conversations

Автоматически покидает выбранные переписки.

当前为 2024-10-31 提交的版本,查看 最新版本

// ==UserScript==
// @name         Auto Leave Conversations
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Автоматически покидает выбранные переписки.
// @author       eretly
// @match        https://zelenka.guru/conversations/*
// @match        https://lolz.guru/conversations/*
// @match        https://lolz.live/conversations/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const selectedConversations = JSON.parse(localStorage.getItem('selectedConversations')) || [];
    const leavingInProgress = localStorage.getItem('leavingInProgress') === 'true';
    let isLeaving = false;

    document.addEventListener('click', (e) => {
        if (e.ctrlKey && e.target.closest('.conversationItem')) {
            e.preventDefault();
            toggleConversationSelection(e.target.closest('.conversationItem'));
        }
    });

    document.addEventListener('keydown', (e) => {
        if (e.ctrlKey && e.key === 'Enter') {
            e.preventDefault();
            leaveSelectedConversations();
        }
    });

    if (leavingInProgress) {
        setTimeout(() => {
            leaveSelectedConversations();
        }, 2000);
    }

    function toggleConversationSelection(conversationItem) {
        const conversationId = conversationItem.dataset.cid;

        if (selectedConversations.includes(conversationId)) {
            selectedConversations.splice(selectedConversations.indexOf(conversationId), 1);
            conversationItem.style.backgroundColor = ''; // Убираем выделение
        } else {
            selectedConversations.push(conversationId);
            conversationItem.style.backgroundColor = '#48b04cb2'; // Подсветка выделения
        }

        localStorage.setItem('selectedConversations', JSON.stringify(selectedConversations));
    }

    async function leaveSelectedConversations() {
        if (isLeaving) return;
        if (selectedConversations.length === 0) {
            console.log("Нет выбранных переписок.");
            return;
        }

        isLeaving = true;
        localStorage.setItem('leavingInProgress', 'true');

        const remainingConversations = [...selectedConversations];

        for (const cid of remainingConversations) {
                // Кликаем по кнопке меню внутри блока membersAndActions
                const menuButton = document.querySelector('.membersAndActions .PopupControl');
                if (menuButton) {
                    simulateClick(menuButton); // Открываем меню
                    await delay(200); // Задержка для отображения меню

                    // Находим и кликаем на ссылку "Покинуть переписку"
                    const leaveLink = document.querySelector(`a[href="conversations/${cid}/leave"]`);
                    if (leaveLink) {
                        simulateClick(leaveLink); // Кликаем "Покинуть переписку"
                        await delay(400); // Ждем, пока откроется форма

                        const form = document.querySelector('form.xenForm');
                        if (form) {
                            const submitButton = form.querySelector('input[type="submit"]');
                            if (submitButton) {
                                simulateClick(submitButton); // Отправляем форму
                                console.log(`Покинута переписка с ID: ${cid}`);
                                selectedConversations.splice(selectedConversations.indexOf(cid), 1); // Удаляем только покинутую переписку
                                localStorage.setItem('selectedConversations', JSON.stringify(selectedConversations)); // Обновляем хранилище
                                await delay(200); // Ждем завершения

                                // Открываем следующую переписку
                                if (selectedConversations.length > 0) {
                                    window.location.href = `https://lolz.live/conversations/${selectedConversations[0]}/`; // Открываем следующую переписку
                                    await delay(700); // Ждем 700 мс перед следующим удалением
                                    location.reload();
                                }
                            }
                        }
                    }
                }
            }
        

        localStorage.removeItem('leavingInProgress');
        isLeaving = false;
    }

    function simulateClick(element) {
        const mouseEvent = new MouseEvent('click', {
            view: window,
            bubbles: true,
            cancelable: true
        });
        element.dispatchEvent(mouseEvent);
    }

    function delay(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
})();