Основные улучшения и исправления:
@license GNU GPLv3: Я явно добавил @license GNU GPLv3тег в метаданные UserScript, как вы указали в исходном запросе. Это крайне важно для определения условий использования и распространения вашего скрипта.
'use strict';: Добавляется в начало IIFE для повышения качества кода и предотвращения ошибок.
Улучшения регистратора :
Метод errorтеперь принимает необязательный errorобъект, что позволяет вести более подробную регистрацию ошибок.
tel_copy_textУлучшения функций :
Проверка пустого текста : добавлена проверка if (!text || text.trim() === "")для предотвращения попыток копирования пустых строк.
Улучшения визуальной обратной связи :
При отображении Copied!или стили Failed!кнопок displayи widthкнопок временно корректируются, чтобы обеспечить видимость всего текста. Затем они восстанавливаются.
Сообщение об ошибке ( Failed!) теперь окрашивается в красный цвет для более четкой обратной связи.
setupCopyListenersУточнения :
Захват целевого контекстного меню : contextmenuпрослушиватель событий теперь проверяет textEl.contains(e.target), lastRightClickedMessageTextзаполняется ли контекстное меню только в том случае, если щелчок правой кнопкой мыши действительно пришёлся на сам текстовый контент, а не на изображение, видео или пустое место внутри всплывающей подсказки. Это помогает предотвратить добавление пункта «Копировать текст» в контекстное меню, если на самом деле не было щелчка правой кнопкой мыши по текстовому сообщению.
ОчиститьlastRightClickedMessageText : добавлен clickпрослушиватель событий, который documentочищает lastRightClickedMessageTextконтекстное меню при щелчке мышью вне контекстного меню. Это гарантирует, что команда «Копировать текст» не будет сохраняться в контекстном меню для не связанных с ним щелчков после первого щелчка правой кнопкой мыши.
Логика кнопки «Копировать при наведении» ( addHoverCopyButtonZ, addHoverCopyButtonK) :
Предотвращение дублирования кнопок : добавлены проверки if (messageEl.querySelector('.tel-copy-button-z'))в if (bubble.querySelector('.tel-copy-button-k'))начале этих функций, чтобы предотвратить добавление нескольких кнопок копирования в одно и то же сообщение, если они setIntervalзапускаются несколько раз для уже обработанного сообщения.
Имена семантических классов : переименованы tel-copy-buttonв tel-copy-button-zи tel-copy-button-kдля кнопок, специфичных для приложений, чтобы различать их.
Плавные переходы : изменено transition: "opacity 0.2s"на transition: "opacity 0.2s ease-in-out"для более плавной анимации.
pointerEventsУправление : добавляется pointerEvents: 'none'изначально и pointerEvents: 'auto'при наведении курсора. Это гарантирует, что кнопка не будет перехватывать нажатия, когда она прозрачна и невидима, что улучшает взаимодействие пользователя с основным сообщением.
Проверка текстового содержимого : добавлено if (!textEl || !textEl.innerText.trim()) return;, чтобы избежать добавления кнопок в пустые всплывающие окна сообщений.
Логика кнопки контекстного меню ( addContextMenuCopyButton) :
Предотвращение дублирования кнопок : добавлено if (menuEl.querySelector('.tel-context-copy-button'))для предотвращения добавления нескольких опций «Копировать текст» в один и тот же экземпляр контекстного меню.
Единообразное позиционирование : добавлена логика для вставки кнопки «Копировать текст» после существующих пунктов «Ответить» или «Переслать» ( replyItem.after(copyButton);) для лучшей интеграции с нативным меню Telegram. Если такой пункт не найден, используется appendChild.
menuEl.remove(): Закомментировал руководство menuEl.remove(), так как собственная обработка контекстного меню Telegram обычно удаляет его, а вмешательство может привести к неожиданному поведению.
Флаги обработки, специфичные для приложения :
Изменено _tel_processedна _tel_processed_zи _tel_processed_kдля сообщений и _tel_processed_z_contextи _tel_processed_k_contextдля контекстных меню. Это гарантирует, что флаги обработки будут разными для каждой версии приложения Telegram Web (Z и K), предотвращая потенциальные конфликты или некорректную обработку при смене пользователем приложения или запуске скрипта в гибридной среде.
Селектор элементов текста сообщения (App-K) :
В App-K Specific Logic, добавлено .message-textк textElселектору запроса: ".message-text, .message .text-content, .message .translatable-message". Это охватывает больше случаев для элементов текста сообщения в Web K.
Эти улучшения делают скрипт более надежным, удобным для пользователя и лучше интегрированным с веб-приложениями Telegram.СЛАВА УКРАИНА