Росписи в профиле (user editable nickname + 55 greetings)

55 росписей, рандом без повторов, легко менять ник автора в одном месте

// ==UserScript==
// @name         Росписи в профиле (user editable nickname + 55 greetings)
// @namespace    https://forum.blackrussia.online/
// @version      5.0
// @description  55 росписей, рандом без повторов, легко менять ник автора в одном месте
// @match        https://forum.blackrussia.online/members/*
// @run-at       document-idle
// @grant        none
// ==/UserScript==

/****************************************************************************************************
 *  ВАЖНО: ВПИШИ СВОЙ НИК ЗДЕСЬ МЕСТО ЗНАЧЕНИЯ "YOUR_NICK"  (без ковычек)                          *
 *  Пример: const MY_NICKNAME = "Tim_Venera";                                                       *
 *  После изменения этого значения — во всех подписьях и местах, где раньше стоял Tim_Venera, будет
 *  подставлен указанный здесь ник.                                                                 *
 ****************************************************************************************************/
const MY_NICKNAME = "YOYM_MLLL";

(function () {
  "use strict";

  function getProfileName() {
    var selectors = ["h1.username", ".memberHeader-name", ".p-title-value", ".username", "h1"];
    for (var i = 0; i < selectors.length; i++) {
      var el = document.querySelector(selectors[i]);
      if (el) {
        var nodes = el.childNodes;
        for (var k = 0; k < nodes.length; k++) {
          var n = nodes[k];
          if (n.nodeType === Node.TEXT_NODE) {
            var txt = n.textContent.trim();
            if (txt.length) {
              txt = txt.replace(/\s*(Предыдущие\s+имена[\s\S]*|Загрузка[\s\S]*|Previous\s+names[\s\S]*|Loading[\s\S]*)$/i, "").trim();
              return txt || null;
            }
          }
        }
        var sub = el.querySelector("a, span, strong");
        if (sub && sub.textContent) {
          var txt2 = sub.textContent.trim();
          txt2 = txt2.replace(/\s*(Предыдущие\s+имена[\s\S]*|Загрузка[\s\S]*|Previous\s+names[\s\S]*|Loading[\s\S]*)$/i, "").trim();
          if (txt2.length) return txt2;
        }
      }
    }
    var m = location.pathname.match(/\/members\/([^\/]+)/i);
    if (m && m[1]) {
      var fromUrl = decodeURIComponent(m[1]).split(".")[0].replace(/-/g, " ").trim();
      fromUrl = fromUrl.replace(/\s*(Предыдущие\s+имена[\s\S]*|Загрузка[\s\S]*|Previous\s+names[\s\S]*|Loading[\s\S]*)$/i, "").trim();
      if (fromUrl.length) return fromUrl;
    }
    return "Игрок";
  }

  var randomGreetings = [
    '[CENTER][B][COLOR=red]Привет, ${name}! 🙂[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=blue]Пусть каждый день приносит маленькие победы и большое настроение![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=purple]Здравствуй, ${name}! ✨[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=orange]Дерзай, мечтай и делай — и результат не заставит себя ждать.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=green]Хэй, ${name}! 👋[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=teal]Улыбка — твоя лучшая броня. Носи её чаще![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=orange]Привет, ${name}! 🔥[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=cyan]Сегодня отличный день, чтобы начать что-то крутое. Вперёд![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=blue]Добро пожаловать, ${name}! 🌟[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=red]Пусть в жизни будет больше искренних людей и ярких моментов.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=crimson]Привет, ${name}! 💫[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=lime]Маленькие шаги каждый день приводят к большим результатам.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=navy]Здарова, ${name}! 😎[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=orange]Пусть твоя энергия притягивает возможности и людей![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=teal]Привет, ${name}! 🌈[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=purple]Ставь большие цели и сними с них маску «невозможно».[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=darkgreen]Хай, ${name}! ✌️[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=skyblue]Твоя улыбка — это маленькая революция добра. Не останавливайся![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=violet]Привет, ${name}! 🌟[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]Пусть в делах будет порядок, а в душе — свобода и свет.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=coral]Здравствуй, ${name}! 😊[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=royalblue]Каждый день — шанс сделать шаг к тому, что действительно важно.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=magenta]Привет, ${name}! 💥[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=teal]Не бойся быть собой — это твоя самая сильная сторона.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=goldenrod]Приветствую, ${name}! 🌞[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=indigo]Пусть каждый проект приносит радость, а люди — поддержку.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=salmon]Хэй, ${name}! 🎉[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=darkblue]Твоя настойчивость — ключ к достижению целей. Дерзай![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=olive]Привет, ${name}! 🌿[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=maroon]Пусть рядом будут честные люди и верные друзья.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=crimson]Привет, ${name}! 💡[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=skyblue]Каждое «сегодня» — это шанс построить лучшее «завтра».[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=navy]Йо, ${name}! 🚀[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=lime]Дерзай — мир любит тех, кто действует![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=purple]Привет, ${name}! 🎵[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=orange]Пусть мелодия удачи звучит в твою пользу каждый день.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=teal]Здравствуй, ${name}! ✨[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=crimson]Иногда достаточно маленького шага, чтобы начать путь к мечте.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=royalblue]Привет, ${name}! 💫[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=green]Пусть удача будет твоим спутником, а вера — путеводной звездой.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=orchid]Хай, ${name}! 🌺[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=steelblue]Сохраняй спокойствие и двигайся к цели уверенно.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=coral]Привет, ${name}! 🌅[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=navy]Твоя доброта — это сила, которую никто не сможет отнять.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=lime]Здравствуй, ${name}! 🍀[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=purple]Ставь цели, делай шаги, празднуй прогресс.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=darkgreen]Привет, ${name}! 🌲[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]Пусть каждый день приносит уроки и радость роста.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=maroon]Хэй, ${name}! 🔥[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=teal]Стремись не к успеху — стремись к ценностям. Успех придёт сам.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=midnightblue]Привет, ${name}! 🌌[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=orange]Пусть новые идеи находят дорогу в действие.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=gold]Здравствуй, ${name}! ✨[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=crimson]Доверяй процессу — великие дела требуют времени.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=skyblue]Привет, ${name}! ☀️[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=purple]Каждое утро — шанс начать лучше, чем вчера.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=salmon]Хэй, ${name}! 🎈[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=darkblue]Смелость начинается с первого шага — сделай его сегодня![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=teal]Привет, ${name}! 🌊[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=goldenrod]Пусть течение жизни несёт тебя к новым открытиям.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=violet]Здравствуй, ${name}! 🌠[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=green]Ты сильнее, чем думаешь — продолжай идти![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=indigo]Привет, ${name}! 💡[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=coral]Идеи оживают через действие — начни прямо сейчас.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=limegreen]Хай, ${name}! 🌿[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=royalblue]Пусть вокруг будут те, кто верит в твои силы.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=peru]Привет, ${name}! 🌇[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=teal]Маленькие шаги ежедневно — секрет стабильного роста.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=orchid]Здравствуй, ${name}! 🌸[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=navy]Пусть в жизни будет место для радости и смеха.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=crimson]Привет, ${name}! 🔆[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=slateblue]Вызовы делают нас сильнее — принимай их с гордостью.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=navy]Хэй, ${name}! 🥇[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=lime]Отмечай прогресс — даже маленький — это победа.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=turquoise]Привет, ${name}! 🕊️[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=purple]Пусть спокойствие и ясность сопровождают твои решения.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=steelblue]Здравствуй, ${name}! ⚓[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=coral]Настойчивость и терпение творят чудеса — продолжай![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]',
    '[CENTER][B][COLOR=goldenrod]Привет, ${name}! 🌄[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=indigo]Твоя история уникальна — пиши её смело и с любовью.[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]'
  ];

  var remaining = randomGreetings.slice();
  function pickAndRemoveRandom() {
    if (remaining.length === 0) remaining = randomGreetings.slice();
    var idx = Math.floor(Math.random() * remaining.length);
    var item = remaining.splice(idx, 1)[0];
    return item;
  }

  var buttons = [
    {
      title: "Роспись №1",
      style: "color:#fff;background:#8e44ad;border:none;border-radius:6px;padding:6px 10px;margin:4px;cursor:pointer;",
      content: "[CENTER][B][COLOR=red]Привет, ${name}![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]Подпись создана с душой[/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]"
    },
    {
      title: "Роспись №2",
      style: "color:#fff;background:#e67e22;border:none;border-radius:6px;padding:6px 10px;margin:4px;cursor:pointer;",
      content: "[CENTER][B][COLOR=lime]Йо, ${name}![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=blue]Желаю ярких эмоций и удачи![/COLOR][/B][/CENTER]\n[CENTER][B][COLOR=gold]— __MY_NICK__[/COLOR][/B][/CENTER]"
    },
    {
      title: "Только приветствие",
      style: "color:#fff;background:#3498db;border:none;border-radius:6px;padding:6px 10px;margin:4px;cursor:pointer;",
      content: "[CENTER][B]Привет, ${name}! 👋[/B][/CENTER]"
    },
    {
      title: "🎲 Рандом",
      style: "color:#fff;background:#27ae60;border:none;border-radius:6px;padding:6px 12px;margin:4px;cursor:pointer;",
      isRandom: true
    }
  ];

  function findEditor() {
    var textarea = document.querySelector('textarea[name="message"], textarea');
    var editable = document.querySelector('.fr-element[contenteditable="true"], [contenteditable="true"]');
    return { textarea: textarea, editable: editable };
  }

  function insertText(raw) {
    var ref = findEditor();
    var textarea = ref.textarea;
    var editable = ref.editable;
    if (!textarea && !editable) return;
    var name = getProfileName();
    var text = raw.replace(/\$\{name\}/g, name).replace(/__MY_NICK__/g, MY_NICKNAME);
    if (editable) {
      editable.focus();
      editable.innerHTML = "";
      try {
        document.execCommand("insertHTML", false, text);
      } catch (e) {
        editable.innerText = text;
      }
    }
    if (textarea) {
      textarea.value = text;
      textarea.dispatchEvent(new Event("input", { bubbles: true }));
      textarea.dispatchEvent(new Event("change", { bubbles: true }));
    }
    var form = editable ? editable.closest("form") : textarea ? textarea.closest("form") : null;
    if (form) {
      var submitBtn = form.querySelector('button[type="submit"], input[type="submit"]');
      if (submitBtn) setTimeout(function () { submitBtn.click(); }, 350);
    }
  }

  function addButtons() {
    var ref = findEditor();
    var anchor = (ref.editable && ref.editable.parentElement) || (ref.textarea && ref.textarea.parentElement);
    if (!anchor) return;
    if (document.querySelector(".custom-signature-buttons")) return;
    var wrap = document.createElement("div");
    wrap.className = "custom-signature-buttons";
    wrap.style.marginTop = "8px";
    wrap.style.display = "flex";
    wrap.style.flexWrap = "wrap";
    buttons.forEach(function (cfg) {
      var b = document.createElement("button");
      b.type = "button";
      b.textContent = cfg.title;
      b.setAttribute("style", cfg.style);
      b.addEventListener("click", function () {
        if (cfg.isRandom) insertText(pickAndRemoveRandom()); else insertText(cfg.content);
      });
      wrap.appendChild(b);
    });
    anchor.appendChild(wrap);
  }

  var obs = new MutationObserver(function () { addButtons(); });
  obs.observe(document.body, { childList: true, subtree: true });
  setInterval(addButtons, 2000);
  addButtons();

})();