// ==UserScript==
// @name AutoHideLZT + Enter
// @namespace http://tampermonkey.net/
// @version 5.88
// @description Автоматически добавляет хайд при создании тем и отправке сообщений на сайтах zelenka и lolz, так же отправляет хайд по Enter.
// @author eretly & Timka241 & Toil & llimonix
// @match https://zelenka.guru/*
// @match https://lolz.guru/*
// @match https://lolz.live/*
// @match https://lzt.market/*
// @icon https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ6P-us9TBOHABul4NCBuCWU6_W-b1DA_8YmA&s
// @grant none
// @license BSD-3-Clause
// ==/UserScript==
/* eslint-env browser */
/* eslint-disable no-undef */
/*
* Copyright 2025 eretly
* Licensed under the BSD 3-Clause License.
*/
;(() => {
// Объявляем глобальные переменные
const XenForo = window.XenForo || {}
const $ = window.$ || window.jQuery || (() => ({ chosen: () => {}, trigger: () => {}, val: () => {} }))
const GM_getValue = window.GM_getValue || ((key, defaultValue) => localStorage.getItem(key) || defaultValue)
const GM_setValue =
window.GM_setValue ||
((key, value) => {
localStorage.setItem(key, value)
})
// Флаги и переменные
let isSending = false
let isCreatingTheme = false
let exceptIds = ""
let userIds = ""
let likesCount = ""
let likes2Count = ""
let daysCount = ""
let hideType = "except"
let yourWords = ""
let wordsPosition = "none"
let addWordsOnCreate = false
const storageKey = "eretlyHIDEnew" // Ключ для localStorage
const availableWordsPositions = ["none", "left", "right", "both"]
const wordsPositionPhrases = {
none: "Отключено",
left: "Слева",
right: "Справа",
both: "С обеих сторон",
}
const usableWordsPositions = availableWordsPositions.filter((pos) => pos !== "none")
let hideOnButton = true
let hideOnEnter = true
let hideOnCreate = true
let ignoreHideList = false
let capitalizeFirstLetter = false
// Переменные для сохранения исходных значений при открытии настроек
let originalCapitalizeFirstLetter = false
let originalHideType = "except"
let originalUserIdValue = ""
// Переменные для управления обработчиками капитализации
let capitalizationHandlersAttached = false
let capitalizationObserver = null
const availableHideTypes = ["except", "users", "likes", "likes2", "days"]
const hideTypePhrases = {
except: "Хайд от юзеров",
users: "Хайд для юзеров",
likes: "Хайд по симпатиям",
likes2: "Хайд по лайкам",
days: "Хайд по дням регистрации",
}
const hideTypePlaceholders = {
except: "Введите юзернеймы через запятую",
users: "Введите юзернеймы через запятую",
likes: "Введите необходимое количество симпатий",
likes2: "Введите необходимое количество лайков",
days: "Введите необходимое количество дней",
}
const hideTypeDataPhrases = {
except: "Пользователи, которые не смогут увидеть",
users: "Пользователи, которые смогут увидеть",
likes: "Необходимое количество симпатий для просмотра",
likes2: "Необходимое количество лайков для просмотра",
days: "Необходимое количество дней с момента регистрации для просмотра",
}
function loadSettings() {
const settings = JSON.parse(localStorage.getItem(storageKey) || "{}")
exceptIds = settings.exceptIds || ""
userIds = settings.userIds || ""
likesCount = settings.likesCount || ""
likes2Count = settings.likes2Count || ""
daysCount = settings.daysCount || ""
hideType = settings.hideType || "except"
hideOnEnter = settings.hideOnEnter !== undefined ? settings.hideOnEnter : true
hideOnButton = settings.hideOnButton !== undefined ? settings.hideOnButton : true
hideOnCreate = settings.hideOnCreate !== undefined ? settings.hideOnCreate : true
ignoreHideList = settings.ignoreHideList !== undefined ? settings.ignoreHideList : false
addWordsOnCreate = settings.addWordsOnCreate !== undefined ? settings.addWordsOnCreate : false
capitalizeFirstLetter = settings.capitalizeFirstLetter !== undefined ? settings.capitalizeFirstLetter : false
wordsPosition = settings.wordsPosition || "none"
yourWords = settings.yourWords || ""
}
loadSettings()
// Функция для отображения предупреждений
function xfAlert(text) {
if (typeof window.XenForo !== "undefined" && window.XenForo.alert) {
window.XenForo.alert(text, "", 3000)
return
}
alert(text)
}
function magicChosen($select) {
if (typeof $select.chosen === "function") {
$select.chosen({
width: "auto",
search_contains: false,
inherit_select_classes: true,
disable_search: 1,
})
$select.trigger("chosen:updated")
}
}
function hasWordsPosition(initiator = "") {
if (initiator === "theme" && !addWordsOnCreate) {
return false
}
return yourWords && usableWordsPositions.includes(wordsPosition)
}
function hasExceptIds(initiator = "") {
if (ignoreHideList) return false
if (initiator === "theme" && !hideOnCreate) return false
if (hideType === "users" && userIds.trim()) {
return true
} else if (hideType === "except" && exceptIds.trim()) {
return true
} else if (hideType === "likes" && likesCount.trim()) {
return true
} else if (hideType === "likes2" && likes2Count.trim()) {
return true
} else if (hideType === "days" && daysCount.trim()) {
return true
}
return false
}
const canModify = (el, initiator = "") => el && (hasExceptIds(initiator) || hasWordsPosition(initiator))
const isInvalidAction = (el) =>
el.classList.contains("chat2-input") ||
window.location.href.match(/conversations\//) ||
window.location.href.match(/create-thread/)
function checkContainsByInsertRegex(regex, words, message) {
// Добавляем текст "test" перед последним "/"
const regexStr = regex.toString()
const clearWords = words.replace("$&", "").replace(/[-[\]{}()*+?.,\\^$|]/g, "\\$&")
const newRegexStr = words.startsWith("$&")
? regexStr.replace(/\/$/, `${clearWords}/`)
: regexStr.replace(/^\//, `/${clearWords}`)
// Преобразуем обратно в объект RegExp
const newRegex = new RegExp(newRegexStr.slice(1, -1))
return newRegex.exec(message)
}
function messageContainsYourWords(message) {
if (!yourWords.trim()) return false
const tempDiv = document.createElement("div")
tempDiv.innerHTML = message
const textContent = tempDiv.textContent || tempDiv.innerText || ""
// Проверяем, содержится ли yourWords в тексте
const escapedWords = yourWords.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
const regex = new RegExp(escapedWords, "i")
return regex.test(textContent)
}
function insertWordToMessage(message) {
if (!yourWords.trim()) return message
if (messageContainsYourWords(message)) {
return message
}
const tempDiv = document.createElement("div")
tempDiv.innerHTML = message
const nodes = Array.from(tempDiv.childNodes)
const isIgnorableBlockquote = (node) =>
node.nodeType === Node.ELEMENT_NODE && node.tagName === "BLOCKQUOTE" && !node.classList.length
if (wordsPosition === "both") {
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i]
if (!isIgnorableBlockquote(node)) {
if (node.nodeType === Node.TEXT_NODE) {
node.textContent = yourWords + " " + node.textContent
} else if (node.nodeType === Node.ELEMENT_NODE) {
const firstTextNode = node.firstChild
if (firstTextNode && firstTextNode.nodeType === Node.TEXT_NODE) {
firstTextNode.textContent = yourWords + " " + firstTextNode.textContent
} else {
const textNode = document.createTextNode(yourWords + " ")
node.insertBefore(textNode, node.firstChild)
}
}
break
}
}
for (let i = nodes.length - 1; i >= 0; i--) {
const node = nodes[i]
if (!isIgnorableBlockquote(node)) {
if (node.nodeType === Node.TEXT_NODE) {
node.textContent = node.textContent + " " + yourWords
} else if (node.nodeType === Node.ELEMENT_NODE) {
const lastTextNode = node.lastChild
if (lastTextNode && lastTextNode.nodeType === Node.TEXT_NODE) {
lastTextNode.textContent = lastTextNode.textContent + " " + yourWords
} else {
const textNode = document.createTextNode(" " + yourWords)
node.appendChild(textNode)
}
}
break
}
}
return tempDiv.innerHTML
}
if (wordsPosition === "left") {
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i]
if (!isIgnorableBlockquote(node)) {
if (node.nodeType === Node.TEXT_NODE) {
node.textContent = yourWords + " " + node.textContent
} else if (node.nodeType === Node.ELEMENT_NODE) {
const firstTextNode = node.firstChild
if (firstTextNode && firstTextNode.nodeType === Node.TEXT_NODE) {
firstTextNode.textContent = yourWords + " " + firstTextNode.textContent
} else {
const textNode = document.createTextNode(yourWords + " ")
node.insertBefore(textNode, node.firstChild)
}
}
return tempDiv.innerHTML
}
}
tempDiv.insertAdjacentHTML("afterbegin", yourWords + " ")
}
if (wordsPosition === "right") {
for (let i = nodes.length - 1; i >= 0; i--) {
const node = nodes[i]
if (!isIgnorableBlockquote(node)) {
if (node.nodeType === Node.TEXT_NODE) {
node.textContent = node.textContent + " " + yourWords
} else if (node.nodeType === Node.ELEMENT_NODE) {
const lastTextNode = node.lastChild
if (lastTextNode && lastTextNode.nodeType === Node.TEXT_NODE) {
lastTextNode.textContent = lastTextNode.textContent + " " + yourWords
} else {
const textNode = document.createTextNode(" " + yourWords)
node.appendChild(textNode)
}
}
return tempDiv.innerHTML
}
}
tempDiv.insertAdjacentHTML("beforeend", " " + yourWords)
}
return tempDiv.innerHTML
}
// Капитализация
function getTextBeforeCaret(element) {
const selection = window.getSelection()
if (!selection.rangeCount) return ""
const range = selection.getRangeAt(0)
const preCaretRange = range.cloneRange()
preCaretRange.selectNodeContents(element)
preCaretRange.setEnd(range.startContainer, range.startOffset)
return preCaretRange.toString()
}
function shouldCapitalize(textBefore) {
if (!textBefore) return true
if (/^\s*@[a-zA-Z0-9_.-]+[,\s]\s*$/.test(textBefore)) return true
if (/[.!?]\s+$/.test(textBefore)) return true
if (/^\s*$/.test(textBefore)) return true
return false
}
function insertCapitalizedChar(char) {
const selection = window.getSelection()
if (!selection.rangeCount) return false
const range = selection.getRangeAt(0)
const upperChar = char.toUpperCase()
const blockquote =
range.startContainer.closest?.("blockquote") || range.startContainer.parentNode?.closest?.("blockquote")
if (blockquote) {
const textNode = range.startContainer
if (textNode.nodeType === Node.TEXT_NODE) {
const offset = range.startOffset
const textContent = textNode.textContent
const newContent = textContent.substring(0, offset) + upperChar + textContent.substring(offset)
textNode.textContent = newContent
range.setStart(textNode, offset + 1)
range.collapse(true)
selection.removeAllRanges()
selection.addRange(range)
return true
}
}
range.deleteContents()
const textNode = document.createTextNode(upperChar)
range.insertNode(textNode)
range.setStartAfter(textNode)
range.collapse(true)
selection.removeAllRanges()
selection.addRange(range)
return true
}
function handleContentEditableInput(event) {
if (!capitalizeFirstLetter) return
const element = event.target
if (!element.isContentEditable) return
if (event.inputType === "insertFromPaste" || event.inputType === "insertCompositionText") {
return
}
if (event.inputType === "insertText" && event.data) {
const char = event.data
if (!/[a-zA-Zа-яёА-ЯЁ]/.test(char)) return
if (char.length > 1) {
return
}
const textBefore = getTextBeforeCaret(element)
if (shouldCapitalize(textBefore)) {
const selection = window.getSelection()
const range = selection.getRangeAt(0)
const blockquote =
range.startContainer.closest?.("blockquote") ||
range.startContainer.parentNode?.closest?.("blockquote") ||
element.closest("blockquote")
if (blockquote) {
setTimeout(() => {
const newSelection = window.getSelection()
if (newSelection.rangeCount) {
const newRange = newSelection.getRangeAt(0)
const textNode = newRange.startContainer
if (textNode.nodeType === Node.TEXT_NODE && newRange.startOffset > 0) {
const offset = newRange.startOffset - 1
const textContent = textNode.textContent
if (textContent[offset] && /[a-zA-Zа-яёА-ЯЁ]/.test(textContent[offset])) {
const newContent =
textContent.substring(0, offset) +
textContent[offset].toUpperCase() +
textContent.substring(offset + 1)
textNode.textContent = newContent
newRange.setStart(textNode, offset + 1)
newRange.collapse(true)
newSelection.removeAllRanges()
newSelection.addRange(newRange)
}
}
}
}, 0)
return
}
event.preventDefault()
insertCapitalizedChar(char)
}
}
}
function handleTextAreaInput(event) {
if (!capitalizeFirstLetter) return
const element = event.target
if (
!(
element.tagName === "TEXTAREA" ||
(element.tagName === "INPUT" && (element.type === "text" || element.type === "search"))
)
)
return
const value = element.value
const selectionStart = element.selectionStart
const selectionEnd = element.selectionEnd
if (selectionStart === selectionEnd && selectionStart > 0) {
const lastChar = value[selectionStart - 1]
if (/[a-zA-Zа-яёА-ЯЁ]/.test(lastChar)) {
const textBefore = value.substring(0, selectionStart - 1)
if (shouldCapitalize(textBefore)) {
const newValue =
value.substring(0, selectionStart - 1) + lastChar.toUpperCase() + value.substring(selectionStart)
element.value = newValue
element.setSelectionRange(selectionStart, selectionStart)
}
}
}
}
function placeCursorAtEnd(el) {
const range = document.createRange()
const sel = window.getSelection()
range.selectNodeContents(el)
range.collapse(false)
sel.removeAllRanges()
sel.addRange(range)
}
function enableCapitalization() {
if (capitalizationHandlersAttached) return
document.addEventListener("beforeinput", handleContentEditableInput, true)
document.addEventListener("input", handleTextAreaInput, false)
capitalizationObserver = new MutationObserver((mutations) => {
for (const mutation of mutations) {
if (mutation.type === "childList" || mutation.type === "characterData") {
const target = mutation.target
let container = target.closest?.('[contenteditable="true"]') || target.parentNode
if (!container || !container.isContentEditable) {
let current = target.parentNode
while (current && current !== document.body) {
if (current.isContentEditable) {
container = current
break
}
const editableInside = current.querySelector?.('[contenteditable="true"]')
if (editableInside) {
container = editableInside
break
}
current = current.parentNode
}
}
if (!container || !capitalizeFirstLetter) continue
if (container.querySelector("blockquote") || container.closest("blockquote")) {
continue
}
const text = container.innerText || container.textContent
const lastChar = text.trim().slice(-1)
if (/[a-zа-яё]/.test(lastChar)) {
const before = text.trim().slice(0, -1)
if (shouldCapitalize(before)) {
const capitalized = before + lastChar.toUpperCase()
container.innerText = capitalized
placeCursorAtEnd(container)
}
}
}
}
})
const observeElement = (element) => {
if (capitalizationObserver) {
capitalizationObserver.observe(element, {
characterData: true,
childList: true,
subtree: true,
})
}
}
document.querySelectorAll('[contenteditable="true"]').forEach(observeElement)
document.querySelectorAll('blockquote [contenteditable="true"]').forEach(observeElement)
if (capitalizationObserver) {
capitalizationObserver.observe(document.body, {
characterData: true,
childList: true,
subtree: true,
})
}
document
.querySelectorAll('[contenteditable="true"], textarea, input[type="text"], input[type="search"]')
.forEach((el) => {
attachAutoCapitalize(el)
})
document
.querySelectorAll(
'blockquote [contenteditable="true"], blockquote textarea, blockquote input[type="text"], blockquote input[type="search"]',
)
.forEach((el) => {
attachAutoCapitalize(el)
})
capitalizationHandlersAttached = true
}
function disableCapitalization() {
if (!capitalizationHandlersAttached) return
document.removeEventListener("beforeinput", handleContentEditableInput, true)
document.removeEventListener("input", handleTextAreaInput, false)
if (capitalizationObserver) {
capitalizationObserver.disconnect()
capitalizationObserver = null
}
document
.querySelectorAll('[contenteditable="true"], textarea, input[type="text"], input[type="search"]')
.forEach((el) => {
if (el._autoCapAttached) {
el._autoCapAttached = false
}
})
capitalizationHandlersAttached = false
}
function toggleCapitalization(enabled) {
if (enabled) {
enableCapitalization()
} else {
disableCapitalization()
}
}
function smartCapitalize(text) {
if (!capitalizeFirstLetter) return text
return text.replace(/(^|[.!?]\s+|^\s*@[\w.-]+[,\s]\s*)([a-zа-яё])/giu, (match, prefix, char) => {
return prefix + char.toUpperCase()
})
}
function traverseAndSmartCapitalize(root) {
if (!root || !capitalizeFirstLetter) return
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false)
let node
while ((node = walker.nextNode())) {
if (node.nodeValue && /[a-zа-яё]/i.test(node.nodeValue)) {
const newText = smartCapitalize(node.nodeValue)
if (newText !== node.nodeValue) {
node.nodeValue = newText
}
}
}
}
function attachAutoCapitalize(el, type = "auto") {
if (!el || el._autoCapAttached) return
el._autoCapAttached = true
if (el.isContentEditable) {
el.addEventListener("beforeinput", (e) => {
if (!capitalizeFirstLetter) return
if (e.inputType === "insertFromPaste" || e.inputType === "insertCompositionText") {
return
}
if (e.inputType === "insertText" && e.data) {
if (e.data.length > 1) {
return
}
const selection = window.getSelection()
if (!selection.rangeCount) return
const range = selection.getRangeAt(0)
const preCaretRange = range.cloneRange()
preCaretRange.selectNodeContents(el)
preCaretRange.setEnd(range.startContainer, range.startOffset)
const textBefore = preCaretRange.toString()
if (shouldCapitalize(textBefore)) {
const blockquote =
range.startContainer.closest?.("blockquote") ||
range.startContainer.parentNode?.closest?.("blockquote") ||
el.closest("blockquote")
if (blockquote) {
setTimeout(() => {
const newSelection = window.getSelection()
if (newSelection.rangeCount) {
const newRange = newSelection.getRangeAt(0)
const textNode = newRange.startContainer
if (textNode.nodeType === Node.TEXT_NODE && newRange.startOffset > 0) {
const offset = newRange.startOffset - 1
const textContent = textNode.textContent
if (textContent[offset] && /[a-zA-Zа-яёА-ЯЁ]/.test(textContent[offset])) {
const newContent =
textContent.substring(0, offset) +
textContent[offset].toUpperCase() +
textContent.substring(offset + 1)
textNode.textContent = newContent
newRange.setStart(textNode, offset + 1)
newRange.collapse(true)
newSelection.removeAllRanges()
newSelection.addRange(newRange)
}
}
}
}, 0)
return
}
e.preventDefault()
const upperChar = e.data.toUpperCase()
const textNode = document.createTextNode(upperChar)
range.deleteContents()
range.insertNode(textNode)
range.setStartAfter(textNode)
range.collapse(true)
selection.removeAllRanges()
selection.addRange(range)
}
}
})
} else if (el.tagName === "TEXTAREA" || (el.tagName === "INPUT" && (el.type === "text" || el.type === "search"))) {
el.addEventListener("input", () => {
if (!capitalizeFirstLetter) return
const value = el.value
const selectionStart = el.selectionStart
const selectionEnd = el.selectionEnd
if (selectionStart === selectionEnd && selectionStart > 0) {
const lastChar = value[selectionStart - 1]
if (/[a-zA-Zа-яёА-ЯЁ]/.test(lastChar)) {
const textBefore = value.substring(0, selectionStart - 1)
if (shouldCapitalize(textBefore)) {
const newValue =
value.substring(0, selectionStart - 1) + lastChar.toUpperCase() + value.substring(selectionStart)
el.value = newValue
el.setSelectionRange(selectionStart, selectionStart)
}
}
}
})
}
}
function observeFields() {
const observer = new MutationObserver((mutations) => {
for (const mutation of mutations) {
for (const node of mutation.addedNodes) {
if (!(node instanceof HTMLElement)) continue
if (node.matches('[contenteditable="true"], textarea, input[type="text"], input[type="search"]')) {
if (capitalizeFirstLetter) {
attachAutoCapitalize(node)
if (capitalizationObserver && node.matches('[contenteditable="true"]')) {
capitalizationObserver.observe(node, {
characterData: true,
childList: true,
subtree: true,
})
}
}
}
const nestedElements = node.querySelectorAll?.(
'[contenteditable="true"], textarea, input[type="text"], input[type="search"]',
)
nestedElements?.forEach((el) => {
if (capitalizeFirstLetter) {
attachAutoCapitalize(el)
if (capitalizationObserver && el.matches('[contenteditable="true"]')) {
capitalizationObserver.observe(el, {
characterData: true,
childList: true,
subtree: true,
})
}
}
})
if (node.tagName === "BLOCKQUOTE" || node.querySelector("blockquote")) {
const blockquoteElements = node.querySelectorAll?.(
'blockquote [contenteditable="true"], blockquote textarea, blockquote input[type="text"], blockquote input[type="search"]',
)
blockquoteElements?.forEach((el) => {
if (capitalizeFirstLetter) {
attachAutoCapitalize(el)
if (capitalizationObserver && el.matches('[contenteditable="true"]')) {
capitalizationObserver.observe(el, {
characterData: true,
childList: true,
subtree: true,
})
}
}
})
}
}
}
})
observer.observe(document.body, {
childList: true,
subtree: true,
})
}
function updateHtmlContent(el, initiator = "") {
if (!canModify(el, initiator)) {
return
}
// Сохраняем оригинальный HTML
let currentHTML = el.innerHTML.trim()
const tempDiv = document.createElement("div")
tempDiv.innerHTML = currentHTML
currentHTML = tempDiv.innerHTML
// Вставка своих слов (если нужно)
if (hasWordsPosition(initiator)) {
currentHTML = insertWordToMessage(currentHTML)
}
const existingHideBlock = el.querySelector(
'blockquote.wysiwygHide[data-tag="users"], blockquote.wysiwygHide[data-tag="except"], blockquote.wysiwygHide[data-tag="likes"], blockquote.wysiwygHide[data-tag="likes2"], blockquote.wysiwygHide[data-tag="days"]',
)
if (hasExceptIds(initiator) && !existingHideBlock) {
let hideOpenTag, hideCloseTag
const dataTag = hideType
const dataPhrase = hideTypeDataPhrases[hideType]
let hideOptionValue = ""
switch (hideType) {
case "except":
hideOptionValue = exceptIds
break
case "users":
hideOptionValue = userIds
break
case "likes":
hideOptionValue = likesCount
break
case "likes2":
hideOptionValue = likes2Count
break
case "days":
hideOptionValue = daysCount
break
}
hideOpenTag = `<blockquote class="wysiwygHide needOption" data-tag="${dataTag}" data-phrase="${dataPhrase}" data-align="left" data-option="${hideOptionValue}">`
hideCloseTag = `</blockquote>`
currentHTML = `${hideOpenTag} ${currentHTML} ${hideCloseTag}`
}
el.innerHTML = currentHTML
}
function handleSendMessage(inputElement) {
if (isSending) {
return // Если уже отправляется сообщение, выходим
}
isSending = true // Устанавливаем флаг отправки
const editorBoxElement = inputElement.closest(".defEditor")
if (!editorBoxElement) {
isSending = false
return
}
const sendButton = editorBoxElement.querySelector(
".lzt-fe-se-sendMessageButton, .button.primary.mbottom, .submitUnit .button.primary",
)
if (!sendButton) {
isSending = false
return
}
console.log("Отправка сообщения...")
sendButton.click()
sendButton.disabled = true // Отключаем кнопку отправки
// Задержка перед отправкой
setTimeout(() => {
// sendButton.click(); // Симулируем клик по кнопке отправки
inputElement.innerHTML = "" // Очищаем поле ввода после отправки
isSending = false // Сбрасываем флаг после задержки
sendButton.disabled = false // Включаем кнопку отправки снова
}, 100)
}
// Функция для обработки нажатия на кнопку отправки сообщения
async function handleSendMessageButtonClick(event) {
// Проверяем состояние чекбокса Хайд по кнопке
if (!hideOnButton) {
console.log("Галочка не включена. Отправка сообщения отменена.") // Лог для отладки
return
}
// Попытка найти родительский элемент с классом '.defEditor' или '#ProfilePoster'
const defEditorElement = event.target.closest(".defEditor")
const profilePosterElement = event.target.closest("#ProfilePoster")
const parentEl = defEditorElement ?? profilePosterElement
const inputElement = parentEl?.querySelector('.fr-element.fr-view[contenteditable="true"]')
if (!inputElement) {
return
}
if (isInvalidAction(inputElement)) {
return
}
updateHtmlContent(inputElement)
handleSendMessage(inputElement)
}
// Функция для обработки нажатия клавиши Enter
function handleEnterKey(event) {
// Проверяем состояние hideOnEnter
if (!hideOnEnter) {
// Если галочка не включена, просто предотвращаем действие Enter
return
}
const inputSearchElement = document.querySelector('input[name="keywords"]')
if (event.target === inputSearchElement && event.key === "Enter") {
console.log("Поиск выполнен: ", inputSearchElement.value)
return
}
// Проверка, находимся ли мы в одной из форм, где нужно заблокировать Enter
const formElement = event.target.closest(
'form[action="conversations/insert"], ' +
'form[action^="posts/"][action$="/save-inline"], ' +
'form[action^="profile-posts/comments/"][action$="/edit"]',
)
if (formElement) {
return // Если фокус на одной из форм, просто выходим
}
// Проверяем, это клавиша Enter без зажатого Shift
if (!(event.key === "Enter" || event.keyCode === 13) || event.shiftKey) {
return // Если это не Enter или зажат Shift, выходим
}
// Определяем, это ли редактор или чат
const inputElement = document.querySelector('.fr-element.fr-view[contenteditable="true"]:focus')
if (!inputElement) {
return
}
if (isInvalidAction(inputElement)) {
return
}
event.preventDefault() // Предотвращаем стандартное поведение
event.stopPropagation() // Останавливаем дальнейшую обработку события
updateHtmlContent(inputElement)
handleSendMessage(inputElement)
}
// Добавляем обработчик события клика на кнопку отправки сообщения
document.addEventListener("mousedown", (event) => {
const sendButton = event.target.closest(
".lzt-fe-se-sendMessageButton, .button.primary.mbottom, .submitUnit .button.primary",
)
if (!sendButton) {
return
}
handleSendMessageButtonClick(event)
})
// Добавляем обработчик нажатия клавиши Enter только в редакторе и чате
document.addEventListener("keydown", handleEnterKey, true)
// Обработчик для кнопки "Создать тему"
document.addEventListener("click", (event) => {
const button = event.target
// Проверяем, если это кнопка "Создать тему"
if (!(button.type === "submit" && button.value === "Создать тему")) {
return
}
if (isCreatingTheme) {
return
}
isCreatingTheme = true
setTimeout(() => {
isCreatingTheme = false
}, 300)
const inputElement = document.querySelector('.fr-element.fr-view[contenteditable="true"]')
if (!inputElement) {
return
}
updateHtmlContent(inputElement, "theme")
})
// Создаем кнопки для обеих версий (ПК и мобильная)
function createFooterButtons() {
createDesktopFooterButton()
createMobileFooterButton()
}
// Кнопка для ПК версии
function createDesktopFooterButton() {
const footerBlock = document.querySelector(".footerBlock")
if (!footerBlock) return
if (document.getElementById("AutoHideSettingsButtonDesktop")) return
const settingsButton = footerBlock.querySelector('a[href="account/personal-details"]')
if (!settingsButton) return
const autoHideButton = document.createElement("a")
autoHideButton.id = "AutoHideSettingsButtonDesktop"
autoHideButton.className = "footerItem button"
autoHideButton.href = "#"
autoHideButton.innerHTML = `
<div class="SvgIcon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 0 0-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 0 0-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 0 0-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 0 0-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 0 0 1.066-2.573c-.94-1.543.826-3.31 2.37-2.37c1 .608 2.296.07 2.572-1.065" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0-6 0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</div>
<span>AutoHide</span>
`
autoHideButton.style.cssText = `
display: flex !important;
align-items: center !important;
justify-content: flex-start !important;
padding-left: 12px !important;
argin-left: -10px !important;
`
settingsButton.insertAdjacentElement("afterend", autoHideButton)
addClickHandler(autoHideButton)
}
// Кнопка для мобильной версии
function createMobileFooterButton() {
const footerBlock = document.querySelector(".footer-block")
if (!footerBlock) return
if (document.getElementById("AutoHideSettingsButtonMobile")) return
const settingsButton = footerBlock.querySelector('a[href="account/personal-details"]')
if (!settingsButton) return
const autoHideButton = document.createElement("a")
autoHideButton.id = "AutoHideSettingsButtonMobile"
autoHideButton.className = "footer-item button"
autoHideButton.href = "#"
autoHideButton.innerHTML = `
<div class="SvgIcon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 0 0-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 0 0-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 0 0-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 0 0-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 0 0 1.066-2.573c-.94-1.543.826-3.31 2.37-2.37" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0-6 0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</div>
<span>AutoHide</span>
`
autoHideButton.style.cssText = `
display: flex !important;
align-items: center !important;
justify-content: flex-start !important;
padding-left: 12px !important;
margin-left: -40px !important;
`
settingsButton.insertAdjacentElement("afterend", autoHideButton)
addClickHandler(autoHideButton)
}
// Общий обработчик клика для обеих кнопок
function addClickHandler(button) {
button.addEventListener("click", (event) => {
event.preventDefault()
event.stopPropagation()
originalCapitalizeFirstLetter = capitalizeFirstLetter
originalHideType = hideType
originalUserIdValue = userIdInput.value
toggleSettingsMenu()
setTimeout(() => {
const menu = document.getElementById("settingsMenu")
if (menu) {
menu.style.visibility = "visible"
menu.style.opacity = 1
menu.style.transform = "translateY(0)"
}
}, 50)
})
}
function observeFooterChanges() {
const observer = new MutationObserver(() => {
if (
!document.getElementById("AutoHideSettingsButtonDesktop") ||
!document.getElementById("AutoHideSettingsButtonMobile")
) {
setTimeout(createFooterButtons, 100)
}
})
observer.observe(document.body, {
childList: true,
subtree: true,
})
}
const settingsMenu = document.createElement("div")
settingsMenu.id = "settingsMenu"
settingsMenu.style.position = "fixed"
settingsMenu.style.backgroundColor = "#272727"
settingsMenu.style.color = "white"
settingsMenu.style.padding = "10px"
settingsMenu.style.borderRadius = "6px"
settingsMenu.style.visibility = "hidden"
settingsMenu.style.opacity = 0
settingsMenu.style.transform = "translateY(-10px)"
settingsMenu.style.zIndex = "9999"
settingsMenu.style.right = "0px"
settingsMenu.style.top = "0px"
settingsMenu.style.height = "326px"
settingsMenu.style.width = "350px"
settingsMenu.style.transition = "opacity 100ms linear, transform 100ms linear, visibility 100ms linear"
settingsMenu.style.outline = "1px solid #363636"
function createSettingsMenu() {
if (document.getElementById("settingsMenu")) {
return
}
document.body.appendChild(settingsMenu)
}
function toggleSettingsMenu() {
const settingsMenu = document.getElementById("settingsMenu")
if (!settingsMenu) {
createSettingsMenu()
return
}
if (settingsMenu.style.visibility === "visible") {
settingsMenu.style.visibility = "hidden"
settingsMenu.style.opacity = 0
settingsMenu.style.transform = "translateY(-100%)"
} else {
settingsMenu.style.visibility = "visible"
settingsMenu.style.opacity = 1
settingsMenu.style.transform = "translateY(0)"
}
}
function saveSettings() {
const settings = {
exceptIds,
userIds,
likesCount,
likes2Count,
daysCount,
hideType,
hideOnEnter,
hideOnButton,
hideOnCreate,
ignoreHideList,
capitalizeFirstLetter,
addWordsOnCreate,
wordsPosition,
yourWords,
}
localStorage.setItem(storageKey, JSON.stringify(settings))
}
function initialize() {
createSettingsMenu()
createFooterButtons()
observeFooterChanges()
observeFields()
if (capitalizeFirstLetter) {
toggleCapitalization(true)
}
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initialize)
} else {
initialize()
}
// Заголовок меню
const settingsTitle = document.createElement("h3")
settingsTitle.textContent = "Настройки AutoHideLZT"
settingsTitle.style.margin = "0"
settingsTitle.style.color = "white"
settingsTitle.style.position = "relative"
settingsTitle.style.top = "-5px"
settingsTitle.style.display = "inline-block"
settingsTitle.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
settingsTitle.style.fontWeight = "bold"
settingsMenu.appendChild(settingsTitle)
// Кнопка закрытия меню
const closeButton = document.createElement("button")
closeButton.innerHTML = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'>
<line x1='6' y1='6' x2='18' y2='18' stroke='currentColor' stroke-width='2'/>
<line x1='18' y1='6' x2='6' y2='18' stroke='currentColor' stroke-width='2'/></svg>`
closeButton.style.color = "white"
closeButton.style.backgroundColor = "transparent"
closeButton.style.border = "none"
closeButton.style.cursor = "pointer"
closeButton.style.width = "30px"
closeButton.style.height = "30px"
closeButton.style.position = "absolute"
closeButton.style.top = "0px"
closeButton.style.right = "0px"
closeButton.onclick = () => {
loadSettings()
hideType = originalHideType
hideTypeSelect.value = originalHideType
userIdInput.value = originalUserIdValue
userIdInput.placeholder = hideTypePlaceholders[originalHideType]
hideOnEnterCheckbox.checked = hideOnEnter
hideOnButtonCheckbox.checked = hideOnButton
hideOnCreateCheckbox.checked = hideOnCreate
addWordsOnCreateCheckbox.checked = addWordsOnCreate
ignoreHideListCheckbox.checked = ignoreHideList
capitalizeFirstLetterCheckbox.checked = originalCapitalizeFirstLetter
wordsPositionSelect.value = wordsPosition
yourWordsInput.value = yourWords
magicChosen($(wordsPositionSelect))
magicChosen($(hideTypeSelect))
closeSettingsMenu()
}
settingsMenu.appendChild(closeButton)
// Поле для ввода User ID
const userIdInput = document.createElement("input")
userIdInput.classList.add("textCtrl")
userIdInput.placeholder = hideTypePlaceholders[hideType]
userIdInput.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
userIdInput.style.width = "100%"
userIdInput.style.marginBottom = "5px"
switch (hideType) {
case "except":
userIdInput.value = exceptIds
break
case "users":
userIdInput.value = userIds
break
case "likes":
userIdInput.value = likesCount
break
case "likes2":
userIdInput.value = likes2Count
break
case "days":
userIdInput.value = daysCount
break
}
// Создаем контейнер для кнопок
const buttonsContainer = document.createElement("div")
buttonsContainer.style.display = "flex"
buttonsContainer.style.justifyContent = "flex-start"
buttonsContainer.style.marginTop = "0px"
// Создаем контейнер для your words
const wordsPositionContainer = document.createElement("div")
wordsPositionContainer.style.display = "flex"
wordsPositionContainer.style.flexDirection = "column"
wordsPositionContainer.style.margin = "10px 0 2px"
// Кнопка сохранения
const saveButton = document.createElement("button")
saveButton.classList.add("button", "primary")
saveButton.textContent = "Сохранить"
saveButton.style.marginRight = "5px"
saveButton.style.marginTop = "3px"
saveButton.style.padding = "0px 5px"
saveButton.style.fontSize = "12px"
saveButton.style.height = "26px"
saveButton.style.lineHeight = "26px"
saveButton.addEventListener("click", () => {
const currentHideType = hideTypeSelect.value
const currentValue = userIdInput.value.trim()
switch (currentHideType) {
case "except":
exceptIds = currentValue
break
case "users":
userIds = currentValue
break
case "likes":
likesCount = currentValue
break
case "likes2":
likes2Count = currentValue
break
case "days":
daysCount = currentValue
break
}
hideType = currentHideType
hideOnEnter = hideOnEnterCheckbox.checked
hideOnButton = hideOnButtonCheckbox.checked
hideOnCreate = hideOnCreateCheckbox.checked
ignoreHideList = ignoreHideListCheckbox.checked
capitalizeFirstLetter = capitalizeFirstLetterCheckbox.checked
addWordsOnCreate = addWordsOnCreateCheckbox.checked
wordsPosition = wordsPositionSelect.value
yourWords = yourWordsInput.value.trim()
saveSettings()
xfAlert("Настройки сохранены")
closeSettingsMenu()
})
// Кнопка отмены
const cancelButton = document.createElement("button")
cancelButton.classList.add("button", "primary", "small-button")
cancelButton.textContent = "Отмена"
cancelButton.style.marginTop = "3px"
cancelButton.style.padding = "0px 5px"
cancelButton.style.fontSize = "12px"
cancelButton.style.height = "26px"
cancelButton.style.lineHeight = "26px"
cancelButton.addEventListener("click", () => {
loadSettings()
hideType = originalHideType
hideTypeSelect.value = originalHideType
userIdInput.value = originalUserIdValue
userIdInput.placeholder = hideTypePlaceholders[originalHideType]
hideOnEnterCheckbox.checked = hideOnEnter
hideOnButtonCheckbox.checked = hideOnButton
hideOnCreateCheckbox.checked = hideOnCreate
addWordsOnCreateCheckbox.checked = addWordsOnCreate
ignoreHideListCheckbox.checked = ignoreHideList
capitalizeFirstLetterCheckbox.checked = capitalizeFirstLetter
wordsPositionSelect.value = wordsPosition
yourWordsInput.value = yourWords
magicChosen($(wordsPositionSelect))
magicChosen($(hideTypeSelect))
closeSettingsMenu()
})
// Чекбокс для включения/выключения хайда по Enter
const hideOnEnterCheckbox = document.createElement("input")
hideOnEnterCheckbox.type = "checkbox"
hideOnEnterCheckbox.checked = hideOnEnter
hideOnEnterCheckbox.id = "hideOnEnterCheckbox"
const hideOnEnterLabel = document.createElement("label")
hideOnEnterLabel.textContent = "Добавлять хайд / yourWords по Enter"
hideOnEnterLabel.setAttribute("for", "hideOnEnterCheckbox")
hideOnEnterLabel.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
hideOnEnterLabel.style.fontSize = "12px"
hideOnEnterLabel.style.marginLeft = "-2px"
// Чекбокс для включения/выключения хайда по кнопке отправки
const hideOnButtonCheckbox = document.createElement("input")
hideOnButtonCheckbox.type = "checkbox"
hideOnButtonCheckbox.checked = hideOnButton
hideOnButtonCheckbox.id = "hideOnButtonCheckbox"
hideOnButtonCheckbox.style.marginTop = "2px"
const hideOnButtonLabel = document.createElement("label")
hideOnButtonLabel.textContent = "Добавлять хайд / yourWords по кнопке отправки"
hideOnButtonLabel.setAttribute("for", "hideOnButtonCheckbox")
hideOnButtonLabel.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
hideOnButtonLabel.style.fontSize = "12px"
hideOnButtonLabel.style.marginLeft = "-2px"
// Чекбокс для включения/выключения хайда при создании темы
const hideOnCreateCheckbox = document.createElement("input")
hideOnCreateCheckbox.type = "checkbox"
hideOnCreateCheckbox.checked = hideOnCreate
hideOnCreateCheckbox.id = "hideOnCreateCheckbox"
hideOnCreateCheckbox.style.marginTop = "2px"
const hideOnCreateLabel = document.createElement("label")
hideOnCreateLabel.textContent = "Добавлять хайд при создании темы"
hideOnCreateLabel.setAttribute("for", "hideOnCreateCheckbox")
hideOnCreateLabel.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
hideOnCreateLabel.style.fontSize = "12px"
hideOnCreateLabel.style.marginLeft = "-2px"
// Чекбокс для добавления yourWords при создании темы
const addWordsOnCreateCheckbox = document.createElement("input")
addWordsOnCreateCheckbox.type = "checkbox"
addWordsOnCreateCheckbox.checked = addWordsOnCreate
addWordsOnCreateCheckbox.id = "addWordsOnCreateCheckbox"
addWordsOnCreateCheckbox.style.marginTop = "2px"
const addWordsOnCreateLabel = document.createElement("label")
addWordsOnCreateLabel.textContent = "Добавлять yourWords при создании темы"
addWordsOnCreateLabel.setAttribute("for", "addWordsOnCreateCheckbox")
addWordsOnCreateLabel.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
addWordsOnCreateLabel.style.fontSize = "12px"
addWordsOnCreateLabel.style.marginLeft = "-2px"
const yourWordsHeader = document.createElement("h3")
yourWordsHeader.textContent = "Настройки yourWords"
yourWordsHeader.style.margin = "0"
yourWordsHeader.style.color = "white"
yourWordsHeader.style.position = "relative"
yourWordsHeader.style.top = "-5px"
yourWordsHeader.style.display = "inline-block"
yourWordsHeader.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
yourWordsHeader.style.fontWeight = "bold"
// Чекбокс "Игнорировать список хайда"
const ignoreHideListCheckbox = document.createElement("input")
ignoreHideListCheckbox.type = "checkbox"
ignoreHideListCheckbox.checked = ignoreHideList
ignoreHideListCheckbox.id = "ignoreHideListCheckbox"
ignoreHideListCheckbox.style.marginTop = "2px"
const ignoreHideListLabel = document.createElement("label")
ignoreHideListLabel.textContent = "Игнорировать список хайда (вставлять только yourWords без хайда)"
ignoreHideListLabel.setAttribute("for", "ignoreHideListCheckbox")
ignoreHideListLabel.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
ignoreHideListLabel.style.fontSize = "12px"
ignoreHideListLabel.style.marginLeft = "-2px"
ignoreHideListLabel.style.position = "relative"
ignoreHideListLabel.style.top = "0px"
// Поле для ввода "yourwords"
const yourWordsInput = document.createElement("input")
yourWordsInput.classList.add("textCtrl")
yourWordsInput.placeholder = "Ваши слова, перенос через <br>"
yourWordsInput.style.fontFamily = "-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
yourWordsInput.style.width = "100%"
yourWordsInput.style.marginBottom = "5px"
yourWordsInput.value = yourWords
// Чекбокс для капитализации первой буквы
const capitalizeFirstLetterCheckbox = document.createElement("input")
capitalizeFirstLetterCheckbox.type = "checkbox"
capitalizeFirstLetterCheckbox.checked = capitalizeFirstLetter
capitalizeFirstLetterCheckbox.id = "capitalizeFirstLetterCheckbox"
capitalizeFirstLetterCheckbox.style.marginTop = "2px"
capitalizeFirstLetterCheckbox.addEventListener("change", () => {
const isEnabled = capitalizeFirstLetterCheckbox.checked
toggleCapitalization(isEnabled)
})
const capitalizeFirstLetterLabel = document.createElement("label")
capitalizeFirstLetterLabel.textContent = "Авто-заглавная буква (работает отдельно)"
capitalizeFirstLetterLabel.setAttribute("for", "capitalizeFirstLetterCheckbox")
capitalizeFirstLetterLabel.style.fontFamily =
"-apple-system, BlinkMacSystemFont, 'Open Sans', HelveticaNeue, sans-serif"
capitalizeFirstLetterLabel.style.fontSize = "12px"
capitalizeFirstLetterLabel.style.marginLeft = "-2px"
capitalizeFirstLetterLabel.style.position = "relative"
capitalizeFirstLetterLabel.style.top = "1px"
// Выбор положения yourWords
const wordsPositionSelect = document.createElement("select")
wordsPositionSelect.classList.add("textCtrl", "Lzt-PrettySelect")
wordsPositionSelect.id = "wordsPositionSelect"
wordsPositionSelect.style.marginBottom = "0px"
const wordsPositionOptions = availableWordsPositions.map((wordsPositionItem) => {
const option = document.createElement("option")
option.value = wordsPositionItem
option.textContent = wordsPositionPhrases[wordsPositionItem]
option.selected = wordsPositionItem === wordsPosition
return option
})
const wordsPositionGroup = document.createElement("optgroup")
wordsPositionGroup.label = "Положение слов"
wordsPositionGroup.append(...wordsPositionOptions)
wordsPositionSelect.append(wordsPositionGroup)
wordsPositionContainer.append(yourWordsHeader, yourWordsInput, wordsPositionSelect)
const hideTypeSelect = document.createElement("select")
hideTypeSelect.classList.add("textCtrl", "Lzt-PrettySelect")
hideTypeSelect.id = "hideTypeSelect"
hideTypeSelect.style.marginBottom = "10px"
const hideTypeOptions = availableHideTypes.map((hideTypeItem) => {
const option = document.createElement("option")
option.value = hideTypeItem
option.textContent = hideTypePhrases[hideTypeItem]
option.selected = hideTypeItem === hideType
return option
})
const hideTypeGroup = document.createElement("optgroup")
hideTypeGroup.label = "Тип хайда"
hideTypeGroup.append(...hideTypeOptions)
hideTypeSelect.append(hideTypeGroup)
function updateUserIdInput() {
const currentHideType = hideTypeSelect.value
const currentValue = userIdInput.value.trim()
userIdInput.placeholder = hideTypePlaceholders[currentHideType]
switch (hideType) {
case "except":
exceptIds = currentValue
break
case "users":
userIds = currentValue
break
case "likes":
likesCount = currentValue
break
case "likes2":
likes2Count = currentValue
break
case "days":
daysCount = currentValue
break
}
// hideType = currentHideType
switch (currentHideType) {
case "except":
userIdInput.value = exceptIds
break
case "users":
userIdInput.value = userIds
break
case "likes":
userIdInput.value = likesCount
break
case "likes2":
userIdInput.value = likes2Count
break
case "days":
userIdInput.value = daysCount
break
}
}
hideTypeSelect.addEventListener("change", updateUserIdInput)
const userIdContainer = document.createElement("div")
userIdContainer.style.display = "flex"
userIdContainer.style.flexDirection = "column"
userIdContainer.style.margin = "0px 0 -12px"
userIdContainer.append(userIdInput, hideTypeSelect)
// Добавляем чекбоксы и кнопки в меню настроек
settingsMenu.appendChild(userIdContainer)
settingsMenu.appendChild(document.createElement("br"))
settingsMenu.appendChild(hideOnEnterCheckbox)
settingsMenu.appendChild(hideOnEnterLabel)
settingsMenu.appendChild(document.createElement("br"))
settingsMenu.appendChild(hideOnButtonCheckbox)
settingsMenu.appendChild(hideOnButtonLabel)
settingsMenu.appendChild(document.createElement("br"))
settingsMenu.appendChild(hideOnCreateCheckbox)
settingsMenu.appendChild(hideOnCreateLabel)
settingsMenu.appendChild(document.createElement("br"))
settingsMenu.appendChild(capitalizeFirstLetterCheckbox)
settingsMenu.appendChild(capitalizeFirstLetterLabel)
settingsMenu.appendChild(document.createElement("br"))
settingsMenu.appendChild(wordsPositionContainer)
settingsMenu.appendChild(addWordsOnCreateCheckbox)
settingsMenu.appendChild(addWordsOnCreateLabel)
settingsMenu.appendChild(document.createElement("br"))
settingsMenu.appendChild(ignoreHideListCheckbox)
settingsMenu.appendChild(ignoreHideListLabel)
settingsMenu.appendChild(document.createElement("br"))
settingsMenu.appendChild(buttonsContainer)
// Добавляем кнопки в контейнер
buttonsContainer.appendChild(saveButton)
buttonsContainer.appendChild(cancelButton)
document.body.appendChild(settingsMenu)
const $wordsPositionSelect = $(wordsPositionSelect)
magicChosen($wordsPositionSelect)
const $hideTypeSelect = $(hideTypeSelect)
magicChosen($hideTypeSelect)
function closeSettingsMenu() {
settingsMenu.style.opacity = 0
settingsMenu.style.transform = "translateY(-10px)"
setTimeout(() => {
settingsMenu.style.visibility = "hidden"
}, 300)
}
// Автор копирования айди по кнопке в профиле https://lolz.live/el9in/
const followContainer =
document.querySelector("div.followContainer") ||
document.querySelector("a.button.full.followContainer.OverlayTrigger")
if (followContainer) {
const idContainer = document.createElement("div")
idContainer.className = "idContainer"
const idButton = document.createElement("a")
idButton.className = "idButton button block OverlayTrigger"
idButton.setAttribute("title", "")
idButton.setAttribute("id", "")
idButton.setAttribute("data-cacheoverlay", "false")
idButton.textContent = "Скопировать ID"
idContainer.appendChild(idButton)
followContainer.insertAdjacentElement("afterend", idContainer)
idButton.addEventListener("click", () => {
const userContentLinks = document.querySelector("div.userContentLinks")
const firstLink = userContentLinks.querySelector("a.button:nth-child(2)")
const href = firstLink.getAttribute("href")
const hrefText = href.match(/\/(\d+)\//)[1]
if ((hrefText | 0) != 0) {
const userId = hrefText | 0
navigator.clipboard
.writeText(userId)
.then(() => {
xfAlert("ID успешно скопирован: " + userId)
})
.catch((err) => {
console.error("Ошибка копирования: ", err)
xfAlert("Ошибка копирования ID. Попробуйте еще раз.")
})
}
})
}
function createHide(selectedText) {
const currentHideType = hideType
let hideValue = ""
const dataTag = currentHideType
const dataPhrase = hideTypeDataPhrases[currentHideType]
switch (currentHideType) {
case "except":
hideValue = exceptIds
break
case "users":
hideValue = userIds
break
case "likes":
hideValue = likesCount
break
case "likes2":
hideValue = likes2Count
break
case "days":
hideValue = daysCount
break
}
if (!hideValue.trim()) {
return selectedText
}
const alignValue = wordsPosition !== "none" ? wordsPosition : "left"
return `<blockquote class="wysiwygHide needOption" data-tag="${dataTag}" data-phrase="${dataPhrase}" data-align="${alignValue}" data-option="${hideValue.trim()}">${selectedText}</blockquote>`
}
updateUserIdInput()
})()