Thêm nút Sao chép vào tin nhắn trò chuyện trên bot.n.cn của 360

Thêm nút "Sao chép" vào các phần tử tin nhắn trò chuyện để dễ dàng sao chép nội dung của chúng.

// ==UserScript==
// @name         Add Copy Button to Chat Messages on 360's bot.n.cn
// @description  Adds a "Copy" button to chat message elements to easily copy their content.
// @name:zh-CN   为360纳米AI聊天消息添加复制按钮
// @description:zh-CN  为聊天消息元素添加“复制”按钮,以便轻松复制其内容。
// @name:ar      إضافة زر نسخ لرسائل الدردشة على bot.n.cn الخاص بـ 360
// @description:ar  يضيف زر "نسخ" إلى عناصر رسائل الدردشة لنسخ محتواها بسهولة.
// @name:bg      Добавяне на бутон за копиране към съобщенията в чата на bot.n.cn на 360
// @description:bg  Добавя бутон "Копиране" към елементите на съобщенията в чата за лесно копиране на тяхното съдържание.
// @name:cs      Přidat tlačítko Kopírovat do chatovacích zpráv na bot.n.cn od 360
// @description:cs  Přidává tlačítko "Kopírovat" k prvkům chatovacích zpráv pro snadné kopírování jejich obsahu.
// @name:da      Tilføj en kopiknap til chatbeskeder på 360's bot.n.cn
// @description:da  Tilføjer en "Kopiér"-knap til chatbeskedelementer for nemt at kopiere deres indhold.
// @name:de      Kopierknopf zu Chatnachrichten auf 360's bot.n.cn hinzufügen
// @description:de  Fügt einen "Kopieren"-Knopf zu Chatnachrichtenelementen hinzu, um deren Inhalt einfach zu kopieren.
// @name:el      Προσθήκη κουμπιού αντιγραφής στα μηνύματα συνομιλίας στο bot.n.cn της 360
// @description:el  Προσθέτει ένα κουμπί "Αντιγραφή" στα στοιχεία μηνυμάτων συνομιλίας για εύκολη αντιγραφή του περιεχομένου τους.
// @name:en      Add Copy Button to Chat Messages on 360's bot.n.cn
// @description:en  Adds a "Copy" button to chat message elements to easily copy their content.
// @name:eo      Aldoni Kopi-Butonon al Babilaj Mesaĝoj en bot.n.cn de 360
// @description:eo  Aldonas "Kopii"-butonon al babilaj mesaĝelementoj por facile kopii ilian enhavon.
// @name:es      Añadir botón de copiar a mensajes de chat en bot.n.cn de 360
// @description:es  Añade un botón "Copiar" a los elementos de mensajes de chat para copiar fácilmente su contenido.
// @name:fi      Lisää kopiointipainike chattiviesteihin 360:n bot.n.cn-sivustolla
// @description:fi  Lisää "Kopioi"-painikkeen chattiviestielementteihin niiden sisällön helppoa kopiointia varten.
// @name:fr      Ajouter un bouton Copier aux messages de chat sur bot.n.cn de 360
// @description:fr  Ajoute un bouton "Copier" aux éléments des messages de chat pour copier facilement leur contenu.
// @name:fr-CA   Ajouter un bouton Copier aux messages de clavardage sur bot.n.cn de 360
// @description:fr-CA  Ajoute un bouton "Copier" aux éléments des messages de clavardage pour en copier facilement le contenu.
// @name:he      הוסף כפתור העתקה להודעות צ'אט ב-bot.n.cn של 360
// @description:he  מוסיף כפתור "העתק" לרכיבי הודעות הצ'אט כדי להעתיק בקלות את תוכנם.
// @name:hr      Dodaj gumb za kopiranje porukama chata na bot.n.cn od 360
// @description:hr  Dodaje gumb "Kopiraj" elementima poruka chata za jednostavno kopiranje njihovog sadržaja.
// @name:hu      Másolás gomb hozzáadása a csevegőüzenetekhez a 360 bot.n.cn oldalán
// @description:hu  Hozzáad egy "Másolás" gombot a csevegőüzenet-elemekhez a tartalom egyszerű másolásához.
// @name:id      Tambah Tombol Salin ke Pesan Obrolan di bot.n.cn milik 360
// @description:id  Menambahkan tombol "Salin" ke elemen pesan obrolan untuk menyalin kontennya dengan mudah.
// @name:it      Aggiungi pulsante Copia ai messaggi di chat su bot.n.cn di 360
// @description:it  Aggiunge un pulsante "Copia" agli elementi dei messaggi di chat per copiarne facilmente il contenuto.
// @name:ja      360のbot.n.cnのチャットメッセージにコピーボタンを追加
// @description:ja  チャットメッセージ要素に「コピー」ボタンを追加して、内容を簡単にコピーできるようにします。
// @name:ka      დაამატეთ ასლი ღილაკი ჩატის შეტყობინებებში 360-ის bot.n.cn-ზე
// @description:ka  ჩატის შეტყობინებების ელემენტებში "ასლი" ღილაკის დამატება მათი შინაარსის მარტივად კოპირებისთვის.
// @name:ko      360의 bot.n.cn 채팅 메시지에 복사 버튼 추가
// @description:ko  채팅 메시지 요소에 "복사" 버튼을 추가하여 내용을 쉽게 복사할 수 있도록 합니다.
// @name:nb      Legg til en kopieringsknapp i chattemeldinger på 360s bot.n.cn
// @description:nb  Legger til en "Kopier"-knapp i chattemeldingselementer for å enkelt kopiere innholdet deres.
// @name:nl      Voeg een kopieerknop toe aan chatberichten op 360's bot.n.cn
// @description:nl  Voegt een "Kopiëren"-knop toe aan chatberichtelementen om de inhoud gemakkelijk te kopiëren.
// @name:pl      Dodaj przycisk Kopiuj do wiadomości czatu na bot.n.cn od 360
// @description:pl  Dodaje przycisk "Kopiuj" do elementów wiadomości czatu, aby łatwo skopiować ich zawartość.
// @name:pt-BR   Adicionar botão Copiar às mensagens de chat no bot.n.cn da 360
// @description:pt-BR  Adiciona um botão "Copiar" aos elementos de mensagens de chat para copiar facilmente seu conteúdo.
// @name:ro      Adaugă un buton de copiere la mesajele de chat pe bot.n.cn al 360
// @description:ro  Adaugă un buton "Copiază" la elementele mesajelor de chat pentru a le copia ușor conținutul.
// @name:ru      Добавить кнопку копирования в сообщения чата на bot.n.cn от 360
// @description:ru  Добавляет кнопку "Копировать" к элементам сообщений чата для легкого копирования их содержимого.
// @name:sk      Pridať tlačidlo Kopírovať do správ četu na bot.n.cn od 360
// @description:sk  Pridáva tlačidlo "Kopírovať" k prvkom správ četu na jednoduché kopírovanie ich obsahu.
// @name:sr      Додај дугме за копирање порукама у чету на bot.n.cn од 360
// @description:sr  Додаје дугме "Копирај" елементима порука у чету за лако копирање њиховог садржаја.
// @name:sv      Lägg till en kopieringsknapp i chattmeddelanden på 360:s bot.n.cn
// @description:sv  Lägger till en "Kopiera"-knapp i chattmeddelandeelement för att enkelt kopiera deras innehåll.
// @name:th      เพิ่มปุ่มคัดลอกให้กับข้อความแชทบน bot.n.cn ของ 360
// @description:th  เพิ่มปุ่ม "คัดลอก" ให้กับองค์ประกอบข้อความแชทเพื่อคัดลอกเนื้อหาได้อย่างง่ายดาย
// @name:tr      360'ın bot.n.cn üzerindeki sohbet mesajlarına Kopyala düğmesi ekle
// @description:tr  Sohbet mesajı öğelerine içeriğini kolayca kopyalamak için bir "Kopyala" düğmesi ekler.
// @name:ug      360 نىڭ bot.n.cn دىكى پاراڭلىشىش ئۇچۇرلىرىغا كۆچۈرۈش كۇنۇپكىسى قوشۇش
// @description:ug  پاراڭلىشىش ئۇچۇرلىرى ئېلېمېنتلىرىغا ئۇلارنىڭ مەزمۇنىنى ئاسان كۆچۈرۈش ئۈچۈن "كۆچۈرۈش" كۇنۇپكىسى قوشىدۇ.
// @name:uk      Додати кнопку копіювання до повідомлень чату на bot.n.cn від 360
// @description:uk  Додає кнопку "Копіювати" до елементів повідомлень чату для легкого копіювання їх вмісту.
// @name:vi      Thêm nút Sao chép vào tin nhắn trò chuyện trên bot.n.cn của 360
// @description:vi  Thêm nút "Sao chép" vào các phần tử tin nhắn trò chuyện để dễ dàng sao chép nội dung của chúng.
// @name:zh      为360的bot.n.cn上的聊天消息添加复制按钮
// @description:zh  为聊天消息元素添加“复制”按钮,以便轻松复制其内容。
// @name:zh-HK   為360嘅bot.n.cn上嘅聊天訊息添加複製按鈕
// @description:zh-HK  為聊天訊息元素添加「複製」按鈕,以便輕鬆複製其內容。
// @name:zh-SG   为360的bot.n.cn上的聊天消息添加复制按钮
// @description:zh-SG  为聊天消息元素添加“复制”按钮,以便轻松复制其内容。
// @name:zh-TW   為360的bot.n.cn上的聊天訊息添加複製按鈕
// @description:zh-TW  為聊天訊息元素添加「複製」按鈕,以便輕鬆複製其內容。
// @namespace    http://tampermonkey.net/
// @version      0.1.0
// @author       aspen138
// @match        *://bot.n.cn/*
// @grant        none
// @run-at       document-end
// @icon         https://p1.ssl.qhimg.com//t11098f6bcd26caa77d8aa4d2fb.png
// @license      MIT
// ==/UserScript==


(function() {
    'use strict';

    // Update these if class names change
    const MESSAGE_CONTENT_CLASS = 'UserMessage-module__container--cAvvK';
    const CHAT_MESSAGE_CONTENT_CLASS = 'ChatMessage-module__content--MYneF';
    const NEW_MESSAGE_SELECTOR = '.max-w-\\[80\\%\\].rounded-\\[16px\\].px-\\[16px\\].py-\\[10px\\].text-white.text-\\[15px\\].leading-\\[22px\\].whitespace-pre-line.break-all.overflow-x-hidden';

    function createCopyButton() {
        const button = document.createElement('button');
        button.innerText = 'Copy';
        button.classList.add('copy-button');
        button.style.position = 'sticky';
        button.style.top = '10px';
        button.style.right = '10px';
        button.style.backgroundColor = '#4CAF50';
        button.style.color = '#fff';
        button.style.border = 'none';
        button.style.borderRadius = '4px';
        button.style.padding = '5px 10px';
        button.style.cursor = 'pointer';
        button.style.fontSize = '0.9em';
        button.style.zIndex = '1000';
        button.style.boxShadow = '0 2px 6px rgba(0,0,0,0.2)';
        button.style.marginLeft = 'auto';
        button.style.float = 'right';
        button.style.display = 'inline-block';

        button.addEventListener('mouseenter', () => {
            button.style.backgroundColor = '#45a049';
        });
        button.addEventListener('mouseleave', () => {
            button.style.backgroundColor = '#4CAF50';
        });

        return button;
    }

    function addCopyButton(element) {
        if (element.querySelector('.copy-button')) return;

        const isNewMessage = element.matches(NEW_MESSAGE_SELECTOR);
        const contentElement = isNewMessage ? element : element.querySelector(`.${MESSAGE_CONTENT_CLASS}`);

        if (!contentElement) return;

        element.style.position = 'relative';
        element.style.display = 'block';

        const copyButton = createCopyButton();

        copyButton.addEventListener('click', () => {
            const textToCopy = contentElement.innerText.trim().replace(/Copy(?=[^Copy]*$)/, "");
            navigator.clipboard.writeText(textToCopy).then(() => {
                copyButton.innerText = 'Copied!';
                copyButton.style.backgroundColor = '#388E3C';
                setTimeout(() => {
                    copyButton.innerText = 'Copy';
                    copyButton.style.backgroundColor = '#4CAF50';
                }, 2000);
            }).catch(err => {
                console.error('Failed to copy text: ', err);
            });
        });

        element.appendChild(copyButton);
    }

    function processExistingMessages() {
        // Process original chat messages
        document.querySelectorAll(`.${CHAT_MESSAGE_CONTENT_CLASS}`).forEach(addCopyButton);
        // Process new gradient messages
        document.querySelectorAll(NEW_MESSAGE_SELECTOR).forEach(addCopyButton);
    }

    function observeNewMessages() {
        const observer = new MutationObserver((mutations) => {
            for (const mutation of mutations) {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(node => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            // Check for both message types
                            if (node.matches(`.${CHAT_MESSAGE_CONTENT_CLASS}, ${NEW_MESSAGE_SELECTOR}`)) {
                                addCopyButton(node);
                            }
                            // Check nested elements
                            node.querySelectorAll(`.${CHAT_MESSAGE_CONTENT_CLASS}, ${NEW_MESSAGE_SELECTOR}`).forEach(addCopyButton);
                        }
                    });
                }
            }
        });

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

    function init() {
        processExistingMessages();
        observeNewMessages();
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();