Guest User

Untitled

a guest
Dec 23rd, 2021
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         ПУК-СРЕНЬК
  3. // @namespace    puksrenk
  4. // @version      2.0
  5. // @description  Encode and decode 2ch.hk fart code
  6. // @author       Anonymous
  7. // @match        https://2ch.hk/*/res/*.html
  8. // @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA21BMVEVHcEzr6OX/+Pb9tJP/9/f+3dP79/P/////9fH////97ej18e/m4uD///////Dd2df949r69vT07+39vqX81Mf89vL94tj88ez/+PX/9PT9zr378Oz8+PT89PH59vL9yrb48/Dy7uvy7ur69vTxw7T+1cr+kkmnemrthkz+j0r6jknFwsD+kEy+elz+pXnJgGH+mmXbgFD9kVX+lmHVflL+lFazqqfY1dKglJCbg3u4fmjGta/RzsvXpZXMycazr6yhmJXm3tqtqKaygnKmn53jvbKciYPKfFaahoCxQDFuAAAAJnRSTlMA7CXxHq5FAjsFd7/zCRD7loXM6dJQiX4yFr5lW1mT0q7v08jXrHUXgQ4AAAEmSURBVDjLlZPXcoMwEEVpphlsB/eWHjDNYMAlbolJ/f8vCkI8iGSlmdzXe0d7tIXj/iVJLSWYFF+bJEmaxvHpToMDemwjLXY8HBiLpe85xxnoK411GfjKmwoY6C9xgU9DAP1Wt/Rdxx/ChB1cIHu/BwkVFRcIoo9eo1BnoM+lWgtu7EqB67pBocXhlgwMU7suzznrhC+Iv3w7fKl9dnp62+/DKMpWHvazV35MVlAtw2hvj2f/kOBmfLflv6OSpJHcqwD8K8o8RQiAkBxDAIQGAQJ4BgCqfnaZABw3Qv0ON03aynF68cnVjpeoSztBANs+famXCOCavvXTtR3mlkYPPCEAge5rYgEwZ9yVnDIBiq2Mcstk+MrjxhBYD7QulxnztM0HaAQ/wGgseU57utgAAAAASUVORK5CYII=
  9. // @grant        none
  10. // ==/UserScript==
  11.  
  12. const syms = [
  13.   "ПУК",
  14.   "СРЕНЬК",
  15.   "ХРЮК",
  16.   "УИИИ",
  17.   "ЛАХТА",
  18.   "ЛИБЕРАХА",
  19.   "ХОХЛЫ",
  20.   "СВИНОСОБАКА",
  21.   "ШВАЙНОКАРАСЬ",
  22.   "ЛОЛ",
  23.   "КЕК",
  24.   "АБУ",
  25.   "ДВАЧ",
  26.   "ПАРАША",
  27.   "ПОРИДЖ",
  28.   "ХРЮЧЕВО",
  29.   "СВИН",
  30.   "ПЕРДИКС",
  31.   "ПЫНЯ",
  32.   "ЧАЮ",
  33.   "ШУЕ",
  34.   "ЛЕВАК",
  35.   "ПРАВАК",
  36.   "КОМИГЛИСТ",
  37.   "ШВЯТЫЕ",
  38.   "ВАТА",
  39.   "ВОЛОДИН",
  40.   "ДОЛБИЛЬНЯ",
  41.   "ПЕРЕФОРС",
  42.   "КУНЧИК",
  43.   "АВАТАРКА",
  44.   "АНАЛЬЧИК",
  45. ];
  46.  
  47. const keysLen = Math.log2(syms.length);
  48.  
  49. const symsEncode = () => {
  50.   let result = {};
  51.  
  52.   syms.forEach((item, index) => {
  53.     result[("0".repeat(keysLen) + index.toString(2)).slice(-keysLen)] = item;
  54.   });
  55.  
  56.   return result;
  57. };
  58.  
  59. const symsDecode = () => {
  60.   let result = {};
  61.  
  62.   Object.entries(symsEncode()).forEach(([key, value]) => {
  63.     result[value] = key;
  64.   });
  65.  
  66.   return result;
  67. };
  68.  
  69. const rle = (string) => {
  70.   let arr = string.split("-"),
  71.     encoding = [],
  72.     previous = arr[0],
  73.     count = 1;
  74.  
  75.   for (let i = 1; i < arr.length; i++) {
  76.     if (arr[i] !== previous) {
  77.       encoding.push(count, previous);
  78.       count = 1;
  79.       previous = arr[i];
  80.     } else {
  81.       count++;
  82.     }
  83.   }
  84.  
  85.   encoding.push(count, previous);
  86.   return encoding.join("-").replace(/1-/g, "").replace(/(\d)-/g, "$1");
  87. };
  88.  
  89. const decode = (string) => {
  90.   const data = symsDecode();
  91.  
  92.   let ba = string
  93.     .split("-")
  94.     .map((item) => {
  95.       const count = /(\d*)(\w+)-?/.exec(item);
  96.  
  97.       if (count) {
  98.         const key = item.replace(count[0], "");
  99.         return data[key].repeat(parseInt(count[0]));
  100.       }
  101.  
  102.       return data[item];
  103.     })
  104.     .join("");
  105.  
  106.   const padLen = ba.length % 8;
  107.   ba = ba.substring(0, ba.length - padLen);
  108.  
  109.   return new TextDecoder().decode(
  110.     new Uint8Array(ba.match(/.{1,8}/g).map((c) => parseInt(c, 2)))
  111.   );
  112. };
  113.  
  114. const encode = (string) => {
  115.   let ba = new TextEncoder()
  116.     .encode(string)
  117.     .reduce((s, b) => s + b.toString(2).padStart(8, "0"), "");
  118.  
  119.   const padLen = keysLen - (ba.length % keysLen);
  120.   ba = ba + "0".repeat(padLen);
  121.  
  122.   const data = symsEncode();
  123.  
  124.   return rle(
  125.     ba
  126.       .match(new RegExp(`.{1,${keysLen}}`, "g"))
  127.       .map((item) => {
  128.         return data[item];
  129.       })
  130.       .join("-")
  131.   );
  132. };
  133.  
  134. (() => {
  135.   const posts = document.querySelectorAll(".post__message");
  136.  
  137.   posts.forEach((post) => {
  138.     const words = post.textContent.replace(/\t+/g, "").split(/[\n, ]+/);
  139.  
  140.     const dict = syms.join("|");
  141.     const re = new RegExp(`(\d+)?(${dict})\-.+(${dict})`);
  142.  
  143.     words.forEach((word) => {
  144.       post.innerHTML = post.innerHTML.replace(re, (m) => {
  145.         try {
  146.           return `<div style="color:green;font-size:1.21em">${decode(m)
  147.             .replace(/<.*?>/g, "[Я у мамы идиот]")
  148.             .replace(/\n/g, "<br>")}</div>`;
  149.         } catch (err) {
  150.           return m;
  151.         }
  152.       });
  153.     });
  154.   });
  155.  
  156.   let div = document.createElement("div");
  157.   div.className = "options__box";
  158.  
  159.   let encrypted = false;
  160.  
  161.   let btn = document.createElement("button");
  162.   btn.className = "desktop button";
  163.   btn.style = "color:green;font-weight:bold";
  164.   btn.textContent = `Зашифровать`;
  165.   btn.addEventListener("click", (e) => {
  166.     e.preventDefault();
  167.  
  168.     const comment = document.querySelector('[name="comment"]');
  169.  
  170.     if (!encrypted) {
  171.       btn.textContent = `Расшифровать`;
  172.       encrypted = true;
  173.       comment.value = encode(comment.value);
  174.       document.querySelector(".postform__len").textContent =
  175.         15000 - comment.value.length;
  176.     } else {
  177.       btn.textContent = `Зашифровать`;
  178.       encrypted = false;
  179.       comment.value = decode(comment.value);
  180.       btn.textContent =
  181.         "Зашифровать" +
  182.         (comment.value.length > 0
  183.           ? " (" + (15000 - encode(comment.value).length) + ")"
  184.           : "");
  185.       document.querySelector(".postform__len").textContent =
  186.         15000 - comment.value.length;
  187.     }
  188.   });
  189.   div.append(btn);
  190.  
  191.   const options = document.querySelector(".options");
  192.   options.append(div);
  193.  
  194.   document
  195.     .querySelector(".postform__len")
  196.     .addEventListener("DOMSubtreeModified", () => {
  197.       if (!encrypted) {
  198.         const comment = document.querySelector('[name="comment"]');
  199.         btn.textContent =
  200.           "Зашифровать" +
  201.           (comment.value.length > 0
  202.             ? " (" + (15000 - encode(comment.value).length) + ")"
  203.             : "");
  204.       } else {
  205.         btn.textContent = `Расшифровать`;
  206.       }
  207.     });
  208. })();
  209.  
Add Comment
Please, Sign In to add comment