Advertisement
Guest User

Untitled

a guest
Feb 7th, 2018
446
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.27 KB | None | 0 0
  1. // ==UserScript==
  2. // @name AveNoel
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description try to take over the world!
  6. // @author You
  7. // @match https://avenoel.org/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. //Profils
  12. var favProfiles;
  13. var banProfiles;
  14. var currentProfile;
  15. var colorListProfil = [
  16. "White",
  17. "LightBlue",
  18. "LightCoral",
  19. "LightCyan",
  20. "LightGoldenRodYellow",
  21. "LightGrey",
  22. "LightGreen",
  23. "LightPink",
  24. "LightSalmon",
  25. "LightSeaGreen",
  26. "LightSkyBlue",
  27. "LightSlateGrey",
  28. "LightSteelBlue"
  29. ];
  30.  
  31. //Topic
  32. var bans;
  33.  
  34. // Global
  35. var id = 0;
  36. const space = "&nbsp";
  37. const url = "https://avenoel.org";
  38. const imgQuote = "<img src=\"/images/topic/quote.png\" alt=\"Icône citation\">";
  39. const imgEdit = "<img src=\"/images/topic/edit.png\" alt=\"Icône éditer\" title=\"Éditer le message\">";
  40. const imgDelete = "<img src=\"/images/topic/delete.png\" alt=\"Icône suppression\">";
  41.  
  42. (function() {
  43. 'use strict';
  44.  
  45. //debugger;
  46. //localStorage.removeItem("favs");
  47. //localStorage.removeItem("bans");
  48. //localStorage.removeItem("favProfiles");
  49. //localStorage.removeItem("banProfiles");
  50.  
  51. initCache();
  52.  
  53. var path = window.location.pathname;
  54.  
  55. if (path.startsWith('/profil')) {
  56. traiterProfil();
  57. } else {
  58. ajouterBarFav();
  59. if (path.startsWith('/forum')) {
  60. traiterForum();
  61. } else if (path.startsWith('/topic')) {
  62. traiterTopic();
  63. } else {
  64. console.log('Cas ' + path + " non traité.");
  65. }
  66. }
  67.  
  68. })();
  69.  
  70. function initCache() {
  71. bans = localStorage.bans === undefined ? [] : JSON.parse(localStorage.bans);
  72. favProfiles = localStorage.favProfiles === undefined ? [] : JSON.parse(localStorage.favProfiles);
  73. banProfiles = localStorage.banProfiles === undefined ? [] : JSON.parse(localStorage.banProfiles);
  74. }
  75.  
  76. function ajouterBarFav() {
  77.  
  78. var idCourrier = getId();
  79. var idFavoris = getId();
  80. var barFav = document.getElementsByClassName("col-md-3 col-sm-12 col-xs-12 pull-right hidden-sm hidden-xs");
  81. var innerHTML =
  82. "<section>"+
  83. " <div id=\""+idCourrier+"\"><div>"+
  84. " <div id=\""+idFavoris+"\">Favoris</div>"+
  85. "</section>";
  86. barFav[0].children[1].innerHTML = innerHTML;
  87.  
  88. httpGetAsync("https://avenoel.org/favoris", function (html) {
  89. var list = html.getElementsByTagName("tBody")[0].children;
  90. var buttonBar = document.getElementById(idFavoris);
  91. var innerHTML = "";
  92.  
  93. //debugger;
  94. for(var i = 0; i < list.length; i++) {
  95. var fav = list[i];
  96.  
  97. fav.children[1].children[0].href = fav.children[0].children[0].getAttribute("href");
  98.  
  99. fav.removeChild(fav.children[2]);
  100. fav.removeChild(fav.children[2]);
  101. fav.removeChild(fav.children[2]);
  102. fav.removeChild(fav.children[0]);
  103. innerHTML += "<li>" + fav.innerHTML + "</li>";
  104. }
  105. buttonBar.innerHTML += innerHTML;
  106. });
  107.  
  108. httpGetAsync("https://avenoel.org/messagerie", function (html) {
  109. var mails = html.getElementsByClassName("active");
  110.  
  111. if (mails.length > 2) {
  112. var innerHTMLCourrier = "<div>Courriers";
  113.  
  114. for(var i = 1; i < mails.length -1; ++i) {
  115. innerHTMLCourrier += "<li>";
  116. innerHTMLCourrier += mails[i].getElementsByClassName("author")[0].innerHTML + " : ";
  117. innerHTMLCourrier += mails[i].getElementsByClassName("title")[0].innerHTML;
  118. innerHTMLCourrier += "</li>";
  119. }
  120.  
  121. innerHTMLCourrier += "</div>";
  122. document.getElementById(idCourrier).innerHTML = innerHTMLCourrier;
  123. }
  124. });
  125.  
  126. }
  127.  
  128. //-----------------------------------------------------
  129. // Topic
  130. //-----------------------------------------------------
  131.  
  132. function traiterTopic() {
  133. var lstTopic = document.getElementsByClassName("topic-messages");
  134. var trsTopic = lstTopic[0].children;
  135. for(var iTopic = 0; iTopic < trsTopic.length; ++iTopic) {
  136. traiterTrTopic(trsTopic[iTopic]);
  137. }
  138.  
  139. traiterNavBarTopic();
  140. }
  141.  
  142.  
  143. function traiterNavBarTopic() {
  144.  
  145. var relativePath = "";
  146. getPath().split("-").splice(2).forEach(function(split) {
  147. relativePath += split + "-";
  148. });
  149. relativePath = relativePath.slice(0, -1);
  150.  
  151. var buttons = addButtonToNavBar(["buttonBan"]);
  152. var buttonBan = buttons[0];
  153.  
  154. // Bouton des bans
  155. var isInBan = contentsString(bans, relativePath) != -1;
  156. if (isInBan) {
  157. buttonBan.innerHTML = "DEBAN";
  158. buttonBan.onclick = function() {
  159. deleteFromCache(bans, "bans");
  160. };
  161. } else {
  162. buttonBan.innerHTML = "BAN";
  163. buttonBan.onclick = function() {
  164. addInCache(bans, "bans");
  165. };
  166. }
  167.  
  168. }
  169.  
  170. function addInCache(cacheList, cacheName) {
  171. console.log("addInCache : " + cacheName);
  172. cacheList.push(getPath());
  173. localStorage.setItem(cacheName, JSON.stringify(cacheList));
  174. ajouterBarFav();
  175. traiterNavBarTopic();
  176. }
  177.  
  178. function deleteFromCache(cacheList, cacheName) {
  179. console.log("deleteFromCache : " + cacheName);
  180.  
  181. var relativePath = "";
  182. getPath().split("-").splice(2).forEach(function(split) {
  183. relativePath += split + "-";
  184. });
  185. relativePath = relativePath.slice(0, -1);
  186.  
  187. var i = contentsString(cacheList, relativePath);
  188. if (i !== -1) {
  189. cacheList.splice(i, 1);
  190. localStorage.setItem(cacheName, JSON.stringify(cacheList));
  191. }
  192.  
  193. ajouterBarFav();
  194. traiterNavBarTopic();
  195. }
  196.  
  197. function traiterTrTopic(tr) {
  198.  
  199. var message = null;
  200. var rank = -1;
  201.  
  202. // Suppression des FDP
  203. banProfiles.forEach(function(connard) {
  204.  
  205. var id = getId();
  206. message = null;
  207. if (hasProfilLink(tr, connard.name)) {
  208. message = "<div id=\"" + id + "\"><span>Réponse sur" + space + "</span><a href=\"https://avenoel.org/profil/" + connard.name + "\">" + connard.name + "</a></div>";
  209. }
  210. if (hasProfilAvatar(tr, connard.name)) {
  211. message = "<div id=\"" + id + "\"><span>Message de" + space + "</span><a href=\"https://avenoel.org/profil/" + connard.name + "\">" + connard.name + "</a></div>";
  212. }
  213.  
  214. if (message !== null) {
  215. rank = connard.rank;
  216. return;
  217. }
  218. });
  219.  
  220. if (rank == 2) {
  221. tr.innerHTML = message;
  222. } else {
  223. addButtonHiddenTopicMessage(tr, rank == 1);
  224. }
  225.  
  226. }
  227.  
  228. function addButtonHiddenTopicMessage(tr, isHidden) {
  229.  
  230. var aside = tr.getElementsByClassName("message-aside hidden-xs")[0];
  231. var content = tr.getElementsByClassName("message-content")[0];
  232. var header = tr.getElementsByClassName("message-header")[0];
  233. var footer = tr.getElementsByClassName("message-footer")[0];
  234.  
  235. var idButton = getId();
  236. var idHeaderHidden = getId();
  237.  
  238. header.innerHTML += "<div id=\"" + idHeaderHidden + "\">Message masqué.</div>";
  239. var headerHidden = document.getElementById(idHeaderHidden);
  240. headerHidden.isHidden = !isHidden;
  241. headerHidden.style.display = headerHidden.isHidden ? "none" : "";
  242.  
  243. content.isHidden = isHidden;
  244. content.style.display = content.isHidden ? "none" : "";
  245. var innerButton = content.isHidden ? "Afficher" : "Masquer";
  246. aside.innerHTML += "<button id=\"" + idButton + "\" >" + innerButton + "</button>";
  247.  
  248. var button = document.getElementById(idButton);
  249. button.onclick = function() {
  250. content.isHidden = !content.isHidden;
  251. button.innerHTML = content.isHidden ? "Afficher" : "Masquer";
  252. content.style.display = content.isHidden ? "none" : "";
  253. footer.style.display = content.isHidden ? "none" : "";
  254. headerHidden.isHidden = !headerHidden.isHidden;
  255. headerHidden.style.display = headerHidden.isHidden ? "none" : "";
  256. };
  257. }
  258.  
  259. //-----------------------------------------------------
  260. // Forum
  261. //-----------------------------------------------------
  262.  
  263.  
  264. function traiterForum() {
  265. var lst = document.getElementsByClassName("table table-striped topics");
  266. var trs = lst[0].children[1].children;
  267. for(var i = 0; i < trs.length; ++i) {
  268. traiterTrForum(trs[i]);
  269. }
  270. }
  271.  
  272. function traiterTrForum(tr) {
  273.  
  274. // Suppression des caracteres ching chong
  275. if (tr.innerText.match(/[\u3400-\u9FBF]/)) {
  276. console.log("Suppression des caracteres ching chong");
  277. tr.innerHTML = "";
  278. return;
  279. }
  280.  
  281. // Suppression des FDP
  282. banProfiles.forEach(function(connard) {
  283. if (hasProfilLink(tr, connard.name)) {
  284. console.log("Suppression du FDP : " + connard.name);
  285. tr.innerHTML = "";
  286. return;
  287. }
  288. });
  289.  
  290. bans.forEach(function(url) {
  291. if (hasUrl(tr, url)) {
  292. console.log("Suppression du sujet : " + url);
  293. tr.innerHTML = "";
  294. return;
  295. }
  296. });
  297.  
  298. // Surlignage
  299. favProfiles.forEach(function(surligne) {
  300. if (hasProfilLink(tr, surligne.name)) {
  301. console.log("Surlignage : " + surligne.name);
  302. tr.style.background = colorListProfil[surligne.color];
  303. return;
  304. }
  305. });
  306.  
  307. }
  308.  
  309. //-----------------------------------------------------
  310. // Profil
  311. //-----------------------------------------------------
  312.  
  313. function traiterProfil() {
  314. var elem = document.getElementsByClassName("profile-wrapper-right");
  315. currentProfile = window.location.href.substring("https://avenoel.org/profil/".length);
  316.  
  317. elem[0].innerHTML += "Banni de rang <select id=\"idBanRank\"></select><div id=\"idBanRankDetail\"></div>";
  318. elem[0].innerHTML += "Favoris couleur <select id=\"idFavColor\"></select>";
  319.  
  320. // favoris ----------------------------------------------------------
  321. var isFav = false;
  322. var color = 0;
  323. favProfiles.forEach(function(fav) {
  324. if (fav.name === currentProfile) {
  325. isFav = true;
  326. color = fav.color;
  327. return;
  328. }
  329. });
  330.  
  331. var colorList = [];
  332. for (var iColor = 0; iColor < colorListProfil.length; iColor++) {
  333. colorList.push(iColor);
  334. }
  335.  
  336. createComboBox("idFavColor", colorList);
  337. var comboFavColor = document.getElementById("idFavColor");
  338.  
  339. for (var j = 0; j < comboFavColor.length; j++) {
  340. comboFavColor[j].innerHTML = "";
  341. comboFavColor[j].style.backgroundColor = colorListProfil[j];
  342. }
  343.  
  344. if (isFav) {
  345. comboFavColor.selectedIndex = parseInt(color);
  346. comboFavColor.style.backgroundColor = colorListProfil[color];
  347. }
  348. detailRankProfile(rank);
  349. comboFavColor.onchange = function(event) {
  350. favProfile(event.target.selectedOptions[0].value);
  351. };
  352.  
  353. // bans ----------------------------------------------------------
  354. var isBan = false;
  355. var rank = 0;
  356. banProfiles.forEach(function(connard) {
  357. if (connard.name === currentProfile) {
  358. isBan = true;
  359. rank = connard.rank;
  360. return;
  361. }
  362. });
  363.  
  364. createComboBox("idBanRank", ["non","0","1","2"]);
  365. var comboBanRank = document.getElementById("idBanRank");
  366. if (isBan) {
  367. comboBanRank.selectedIndex = parseInt(rank) + 1;
  368. }
  369. detailRankProfile(rank);
  370. comboBanRank.onchange = function(event) {
  371. banProfile(event.target.selectedOptions[0].value);
  372. };
  373.  
  374. }
  375.  
  376. function favProfile(color) {
  377. console.log("favProfile : " + currentProfile + ", color : " + colorListProfil[color]);
  378.  
  379. var index = -1;
  380. for(var i = 0; i < favProfiles.length; ++i) {
  381. if (stringContents(favProfiles[i].name, currentProfile)) {
  382. index = i;
  383. break;
  384. }
  385. }
  386.  
  387. if (index !== -1) {
  388. favProfiles.splice(index, 1);
  389. localStorage.setItem("favProfiles", JSON.stringify(favProfiles));
  390. }
  391.  
  392. if (color !== "0") {
  393. favProfiles.push({name:currentProfile, color:color});
  394. localStorage.setItem("favProfiles", JSON.stringify(favProfiles));
  395. }
  396.  
  397. document.getElementById("idFavColor").style.backgroundColor = colorListProfil[color];
  398. }
  399.  
  400. function banProfile(rank) {
  401. console.log("banProfile : " + currentProfile + ", rang : " + rank);
  402.  
  403. var index = -1;
  404. for(var i = 0; i < banProfiles.length; ++i) {
  405. if (stringContents(banProfiles[i].name, currentProfile)) {
  406. index = i;
  407. break;
  408. }
  409. }
  410.  
  411. if (index !== -1) {
  412. banProfiles.splice(index, 1);
  413. localStorage.setItem("banProfiles", JSON.stringify(banProfiles));
  414. }
  415.  
  416. if (rank !== "non") {
  417. banProfiles.push({name:currentProfile, rank:rank});
  418. localStorage.setItem("banProfiles", JSON.stringify(banProfiles));
  419. }
  420.  
  421. detailRankProfile(rank);
  422. }
  423.  
  424. function detailRankProfile(rank) {
  425. var innerHTML;
  426. if (rank === "0") {
  427. innerHTML = "Ses sujets sont supprimés.";
  428. } else if (rank === "1") {
  429. innerHTML = "Ses sujets sont supprimés et ses messages sont masqués.";
  430. } else if (rank === "2") {
  431. innerHTML = "Ses sujets et messages sont supprimés.";
  432. } else {
  433. innerHTML = "Non banni.";
  434. }
  435.  
  436. document.getElementById("idBanRankDetail").innerHTML = innerHTML;
  437. }
  438.  
  439. //-----------------------------------------------------
  440. // Utils
  441. //-----------------------------------------------------
  442.  
  443. function createImageButton(idButton, buttonHtml) {
  444. var button = document.getElementById(idButton);
  445. button.innerHTML = buttonHtml;
  446. return button;
  447. }
  448.  
  449. function createComboBox(idParent, list) {
  450. var sel = document.getElementById(idParent);
  451. var optionoption = null;
  452.  
  453. for(i = 0; i < list.length; i++) {
  454.  
  455. optionoption = document.createElement('option');
  456. optionoption.value = list[i];
  457. optionoption.innerHTML = list[i];
  458. sel.appendChild(optionoption);
  459. }
  460. return sel;
  461. }
  462.  
  463. function httpGetAsync(theUrl, callback)
  464. {
  465. var xmlHttp = new XMLHttpRequest();
  466. xmlHttp.onreadystatechange = function() {
  467. if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
  468. callback(new DOMParser().parseFromString(xmlHttp.responseText, "text/html"));
  469. };
  470. xmlHttp.open("GET", theUrl, true); // true for asynchronous
  471. xmlHttp.send(null);
  472. }
  473.  
  474. function contentsString(list, match) {
  475. for(var i = 0; i < list.length; ++i) {
  476. if (stringContents(list[i], match)) {
  477. return i;
  478. }
  479. }
  480. return -1;
  481. }
  482.  
  483. function getPath() {
  484. return url + window.location.pathname;
  485. }
  486.  
  487. function designTopButton(button) {
  488. button.style.color = "white";
  489. button.style.backgroundColor = "transparent";
  490. button.style.border = "none";
  491. }
  492.  
  493. function hasProfilLink(elem, name) {
  494. return stringContents(elem.innerHTML, "https://avenoel.org/profil/" + name + "\"");
  495. }
  496.  
  497. function hasProfilAvatar(elem, name) {
  498. return stringContents(elem.innerHTML, "alt=\"Avatar de "+ name + "\"");
  499. }
  500.  
  501. function hasUrl(elem, url) {
  502. return stringContents(elem.innerHTML, "<a href=\"" + url + "\">");
  503. }
  504.  
  505. function stringContents(string, match) {
  506. return string.indexOf(match) !== -1;
  507. }
  508.  
  509. function addButtonToNavBar(names) {
  510.  
  511. var buttons = [];
  512.  
  513. if (document.getElementById(names[0]) === null) {
  514. var navbar = document.getElementsByClassName("nav navbar-nav navbar-links");
  515. var innerHTML = "";
  516. names.forEach(function(name) {
  517. innerHTML += "<li class=\"\"><a><button id=\"" + name + "\" ></button></a></li>";
  518. });
  519. navbar[0].innerHTML += innerHTML;
  520. names.forEach(function(name) {
  521. designTopButton(document.getElementById(name));
  522. });
  523. }
  524.  
  525. names.forEach(function(name) {
  526. buttons.push(document.getElementById(name));
  527. });
  528.  
  529. return buttons;
  530. }
  531.  
  532. function getId() {
  533. return "id" + id++;
  534. }
  535.  
  536. //-----------------------------------------------------
  537. // TODO list
  538. //-----------------------------------------------------
  539. //Passer les commentaires avec les fleches du clavier
  540. //Ouvirir et fermer un commentaire
  541. //acces au profil des personnes bannis en cliquant sur le nom
  542. //-----------------------------------------------------
  543. // Patch
  544. //-----------------------------------------------------
  545. //
  546. // 2.0.1 : Pastebin => Etape 3
  547. // + Le clique sur le favoris emmene à la dernière page
  548. // 2.0.0 : Pastebin => https://pastebin.com/eHCt5h8E
  549. // + Prise en compte de la liste de favoris (affichage reste à droite)
  550. // L'icone du fichier n'est pas encore mise
  551. // + Changement du bouton afficher/masquer un commentaire.
  552. // 1.1.0 : Pastebin => https://pastebin.com/85F6ydsC
  553. // + gestion de la lovelist sur les profils
  554. // + plus besoin d'aller dans le code pour gérer ses listes
  555. // 1.0.3 : Pastebin => https://pastebin.com/RNWPdyyF
  556. // + suppression de 'Courriers' quand la liste est vide
  557. // + gestion de la banlist sur les profils
  558. // 1.0.2 : https://pastebin.com/TJzUnw69
  559. // + ajout de la liste des messages non lus au niveau de la barre des favs
  560. // 1.0.1 : https://pastebin.com/mFv7z7wb
  561. // + correction du bug des bans de topics
  562. // + detection du favoris/ban à chaque page du topic
  563. // 1.0.0 : https://pastebin.com/bjVmYYgM
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement