// ==UserScript==
// @name LZTClown
// @namespace https://zelenka.guru/urmom/
// @version 1.3
// @description Персональный список клоунов на форуме LolzTeam
// @author Интерпол
// @icon https://zelenka.guru/favicon.ico
// @match https://zelenka.guru/*
// @match https://lolz.guru/*
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/484700/LZTClown.user.js
// @updateURL https://update.greasyfork.icu/scripts/484700/LZTClown.meta.js
// ==/UserScript==
;(function () {
"use strict"
// *********** Настройки ***********
const emojiIcon = "🤡" // эмодзи возле ника
const clownButton = "https://i.imgur.com/Wyqq6g5.png" // URL картинки для назначения клоуна (PNG)
const showButton = true // false скрыть кнопку, true показать
const clownAdded = "объявлен клоуном" // уведомление при назначении
const clownDelete = "больше не является клоуном" // уведомление при выносе
const clownStyle = true // изменять ли аватарку и ник пользователя
const hideMessagesFromClowns = true // нужно ли скрывать сообщения от клоунов, последние 5 в учет
const clownAvatar = "https://i.imgur.com/MBDKn9l.png" // URL новой аватарки
const clownName = "Клоун" // новый ник для пользователя - не работает пока что!!!
// *********** Настройки ***********
let blacklist = GM_getValue("blacklist", {})
function getUserIdFromAvatarUrl(url) {
const urlParts = url.split("/")
const lastPart = urlParts[urlParts.length - 1]
return lastPart.split(".")[0]
}
function getBlacklistUserIds() {
const avatars = GM_getValue("originalAvatars", {})
// console.log("user avatars: ", avatars);
const allUserIds = Object.values(avatars)
.map((url) => getUserIdFromAvatarUrl(url))
.filter((id) => id)
const userIds = allUserIds.slice(-5)
// console.log("last 5 user IDs in blacklist: ", userIds);
return userIds
}
function addMessageSendHandler() {
const button = document.querySelector("button.lzt-fe-se-sendMessageButton")
const div = document.querySelector(
"div.fr-element.fr-view.fr-element-scroll-visible"
)
if (button && div) {
button.addEventListener("click", function () {
const userIds = getBlacklistUserIds()
if (userIds.length > 0) {
const elements = []
const childElements = div.children
for (var i = 0; i < childElements.length; i++) {
elements.push(childElements[i].outerHTML)
}
if (elements.length !== 0) {
div.innerHTML =
`[exceptids=${userIds.join(",")}]` +
elements.join("
") +
"[/exceptids]"
}
setTimeout(function () {
div.innerHTML = ``
}, 1)
}
})
}
}
function initMessageHandler() {
const userIds = getBlacklistUserIds()
if (userIds.length > 0 && hideMessagesFromClowns) {
addMessageSendHandler()
}
}
function getOriginalAvatar(username) {
const avatars = GM_getValue("originalAvatars", {})
return avatars[username]
}
function setOriginalAvatar(username, url) {
const avatars = GM_getValue("originalAvatars", {})
avatars[username] = url
GM_setValue("originalAvatars", avatars)
}
function updateClownAppearance(username, add) {
if (!clownStyle) return
document.querySelectorAll("li.message").forEach((messageElem) => {
if (messageElem.getAttribute("data-author") === username) {
const avatarElem = messageElem.querySelector(".avatar span.img")
if (avatarElem) {
if (add) {
if (!getOriginalAvatar(username)) {
setOriginalAvatar(username, avatarElem.style.backgroundImage)
}
avatarElem.style.backgroundImage = `url('${clownAvatar}')`
avatarElem.style.backgroundSize = "cover"
avatarElem.style.backgroundPosition = "center"
avatarElem.style.backgroundRepeat = "no-repeat"
} else {
const originalAvatar = getOriginalAvatar(username)
if (originalAvatar) {
avatarElem.style.backgroundImage = originalAvatar
}
}
}
}
})
}
function updateClownAppearanceOnLoad() {
document.querySelectorAll("li.message").forEach((messageElem) => {
const author = messageElem.getAttribute("data-author")
const avatarElem = messageElem.querySelector(".avatar span.img")
if (avatarElem && blacklist.hasOwnProperty(author) && clownStyle) {
avatarElem.style.backgroundImage = `url('${clownAvatar}')`
avatarElem.style.backgroundSize = "cover"
avatarElem.style.backgroundPosition = "center"
avatarElem.style.backgroundRepeat = "no-repeat"
}
})
}
function lztClown() {
document.querySelectorAll(".username").forEach((elem) => {
let username = elem.textContent.trim()
let isBlacklisted = blacklist.hasOwnProperty(username)
let nextSiblingIsIcon =
elem.nextElementSibling &&
elem.nextElementSibling.classList.contains("blacklist-icon")
if (isBlacklisted && !nextSiblingIsIcon) {
const blacklistIcon = document.createElement("span")
blacklistIcon.textContent = ` ${emojiIcon}`
blacklistIcon.className = "blacklist-icon"
blacklistIcon.style.cursor = "pointer"
blacklistIcon.title = blacklist[username]
elem.parentNode.insertBefore(blacklistIcon, elem.nextSibling)
} else if (!isBlacklisted && nextSiblingIsIcon) {
elem.nextElementSibling.remove()
}
elem.classList.toggle("blacklisted-user", isBlacklisted)
})
}
function addClown(username, reason) {
blacklist[username] = reason
GM_setValue("blacklist", blacklist)
lztClown()
updateClownAppearance(username, true)
XenForo.alert(`Пользователь ${username} ${clownAdded}`, "LZTClown", 2000)
}
function removeClown(username) {
delete blacklist[username]
lztClown()
updateClownAppearance(username, false)
const avatars = GM_getValue("originalAvatars", {})
if (avatars[username]) {
delete avatars[username]
GM_setValue("originalAvatars", avatars)
}
GM_setValue("blacklist", blacklist)
XenForo.alert(`Пользователь ${username} ${clownDelete}`, "LZTClown", 2000)
}
function createBlacklistModal() {
const blacklistModal = document.createElement("div")
blacklistModal.id = "blacklistModal"
blacklistModal.className = "modal fade in"
blacklistModal.style = "z-index: 10003; padding-right: 15px; outline: none;"
blacklistModal.tabIndex = -1
let blacklistContent = "