// ==UserScript== // @name [HFR] Private Chat // @version 0.1.7.3 // @namespace http://toyonos.info // @description Permet de communiquer par chat avec tout membre du forum, en sa basant sur le système des mps // @include https://forum.hardware.fr/* // @exclude https://forum.hardware.fr/bddpost.php // @grant GM_info // @grant GM_deleteValue // @grant GM_getValue // @grant GM_listValues // @grant GM_setValue // @grant GM_getResourceText // @grant GM_getResourceURL // @grant GM_addStyle // @grant GM_log // @grant GM_openInTab // @grant GM_registerMenuCommand // @grant GM_setClipboard // @grant GM_xmlhttpRequest // ==/UserScript== // historique modifs r21 : // 0.1.7.3 (10/12/2017) : // - commentage des alert XML // 0.1.7.2 (09/12/2017) : // - correction du selecteur de messages (evol du forum) par PetitJean // 0.1.7.1 (03/12/2017) : // - passage au https var toyoAjaxLib = (function() { // Private members function loadPage(url, method, arguments, responseHandler) { var req; method = method.toUpperCase(); if (method == 'GET' && arguments != null) url += '?' + arguments; // branch for native XMLHttpRequest object if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = processReqChange(req, responseHandler); req.open(method, url, true); if (method == 'POST') req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); arguments = method == 'POST' ? arguments : null; req.send(arguments); } else if (window.ActiveXObject) { // branch for IE/Windows ActiveX version req = new ActiveXObject("Microsoft.XMLHTTP"); if (req) { req.onreadystatechange = processReqChange(req, responseHandler); req.open(method, url, true); if (method == 'POST') req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); if (method == 'POST') req.send(arguments); else req.send(); } } } function processReqChange(req, responseHandler) { return function () { try { // only if req shows "loaded" if (req.readyState == 4) { // only if "OK" if (req.status == 200) { var content = req.responseXML != null && req.responseXML.documentElement != null ? req.responseXML.documentElement : req.responseText; if (responseHandler != null) responseHandler(content); } else { //alert("There was a problem retrieving the XML data:\n" + //req.statusText); } } } catch(e){} } } // Public members return { "loadDoc" : function(url, method, arguments, responseHandler) { try { loadPage(url, method, arguments, responseHandler); } catch(e) { var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Unknown Error"); alert("Unable to get data:\n" + msg); return; } } }; })(); /******************************************************************/ var cssManager = { cssContent : '', addCssProperties : function(properties) { cssManager.cssContent += properties; }, insertStyle : function() { GM_addStyle(cssManager.cssContent); cssManager.cssContent = ''; } }; var getElementByXpath = function(path, element, doc) { if (doc == null) doc = document; var arr = Array(), xpr = doc.evaluate(path, element, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); for (;item = xpr.iterateNext();) arr.push(item); return arr; }; /******************************************************************/ var hfrPrivateChat = { minimizeImg : "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0D%00%00%00%0D%08%03%00%00%00E5%14N%00%00%00%04gAMA%00%00%AF%C87%05%8A%E9%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%00%EAPLTE%E4%EC%EF%E3%ED%EE%C4%C2%C3%E7%EC%F0%C3%C3%C1%C4%C4%C4%E3%ED%EF%DB%E4%E9%C6%C4%C7%E6%F0%F1%DC%E5%EA%E4%ED%EC%C5%C7%C6%E4%EE%ED%C0%C4%C3%E2%EE%EE%E3%EB%ED%E1%EB%EC%C7%C7%C7%C9%D7%DA%E5%EE%F3%C5%C5%C3%C5%D7%DB%D8%E5%EB%D4%E3%E8%E4%EF%F1%DD%DD%DD%E7%EC%F2v%91%98%E5%EA%F0%C3%C3%C5%C5%C5%C7%E6%EF%EE%C4%C5%C7%83%9E%A5%E8%ED%F3%C9%D8%DB%C2%C2%C2%E3%EF%EF%E5%EE%EDu%92%98%E2%EC%EE%C2%C4%C1v%94%9E%C3%C4%C6t%95%9E%E4%EF%F3%E6%EB%EF%E6%EF%F4y%94%9D%D9%D7%D8%E5%F1%F1%C7%C5%C6%C2%C4%C3%C6%C6%C6%DB%E6%E8%DC%DA%DBw%94%9A%E3%EE%F0%E8%ED%F0%E0%E9%EE%D8%D8%D8%E3%EF%ED%E5%EC%F2%DB%E6%EC%E6%EE%F1%C2%C3%C5%C8%D7%DC%E4%EC%EE%E4%EE%EF%E6%EE%F0%E5%EF%F0%C3%C3%C3%E5%ED%F0%E5%EF%F1%E5%ED%EF%C5%C5%C5%E4%EE%F0%EE%96%9C%17%00%00%00%A5IDATx%DA%0C%8CU%12%C2%40%10%05%07%02%04wwww%87%84%F5%DD%B9%FFu%D8%FE%7BU%FD%1A%EA%C7%92I%F6BI%13%8Dv%AE%90%CF%05%12%B3F7%B2!%40%0C%84%89%97%D9%3AE%B5%E6%0A%05%9C%89%C3%E4%1B)%9B%A8%9A%00%03%9C%A2F%A9%A9%3C%F8%60%12%FA%12w%DDo%BC%D2%D2A0%81O%BFy%5B%ECV%D3j%CA.%90%C3%9F%A5%5Cx%A25%B3%0F%8E%1Ez%14%99%B6%95%08%B3mD%CD%B5%1E%D9%1F%97j%8C1v%971%1F%84T%0A%F9%80z%CC!Kx%B5%C5%5C%04%FDp%E8%24%D2%FB%BF%00%03%00%FB_!%05%D4%3F%F0%DF%00%00%00%00IEND%AEB%60%82", maximizeImg : "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0D%00%00%00%0D%08%03%00%00%00E5%14N%00%00%00%04gAMA%00%00%AF%C87%05%8A%E9%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%01%11PLTE%E5%EF%EE%C3%C3%C5%E4%F0%F0%E4%EE%ED%E4%EB%F1%E3%ED%EF%E4%EF%F1%E5%EE%F3%E6%EE%F0%D6%E3%E9%E4%ED%F2%DC%E5%EA%E4%EC%EF%E5%F1%F1%C5%C5%C7%E4%EC%EE%E6%EF%EE%E6%F0%F2%C1%C3%C2%E2%EC%ED%E6%EE%F1%E1%EC%F0%DD%E4%EA%CA%D4%DD%D0%D1%D5%E7%EC%EF%C2%C2%C0u%92%98%DA%E5%E9%CD%D1%D2%C7%D6%DB%E3%EB%EDy%90%98x%93%9E%C6%C6%C6%E7%EF%F1r%95%99t%92%9C%C6%C6%C8%E8%ED%F1%C5%C3%C4%C3%C5%C4%D2%D3%D7%CA%D7%DD%C0%C3%C8%80%9D%A3%DB%E4%EBv%94%9E%E0%F0%EF%C2%C2%C4%C2%C4%C3u%95%A0%C2%C2%C2%C9%D6%DE%C3%C1%C2%83%9E%A5%BF%C3%C4%E1%EA%E9%C1%C5%C8%E3%EC%EBw%94%9Ay%94%9F%C4%C3%C8%C4%C4%C6%C5%C6%C8%DB%E4%E9u%93%9B%C1%C2%C6%E7%EC%F2%C4%C2%C3%C8%D7%DA%CD%D2%D8%E3%EA%F0w%94%9C%E5%EC%F2%C5%C5%C5%C5%C3%C6%C5%C3%C8%C8%D5%DD%C3%C5%C2%E6%F0%F1%C3%C3%C3%E5%ED%F0%E5%ED%EF%E5%EF%F0%C2%C3%C5%E4%EE%F0%E3%ED%EE%C4%C4%C4%E5%EF%F1%E4%EE%EF%FC%BD%8A%D2%00%00%00%B3IDATx%DA%04%C1%87%22Ba%18%00%D0%EF%EE%DB%BC%B7%A9%A1d%86%06%A2%85%86(Q%F4%EF%F5%FE%0F%D29p%BF%E4J%A9%97%C5%0Eg_%BF%E1f%EA%BD%C9%2F'2%5EZfa%2FM%F8k%FC%CBP%23c%81%926%04t%EC%16%B5%B0-%F8s%09%23%EC%5C8%19%94y%82%BBBx%FAQ%BEJ%A5%FA%AE%E0%A0%DA%A4w%FD3%7BX%B5%12%FA%16.%0Ag%9D%FF%CD%7Bsx%B25%0A%E62'l%F6L%1DD%D9%08%0Ei%FAX%0D%EA%3A%19%25I%0DT%C9%20%1D%24%3C%1F%7C%9D%07%9E3%B1%14%94A%AC%8B%1C%1A%83%09_%5B8%8F%F1g%B7r%14%60%00%E5%8C!%0C%03%3D%CAL%00%00%00%00IEND%AEB%60%82", myPseudo : null, activePostId : null, autoRefreshTimers : Array(), notifyTimers : Array(), lockPost : false, get mpsNumber() { return GM_getValue('hfr_hpc_mpsNumber', 5); }, get refreshRate() { // En secondes return GM_getValue('hfr_hpc_refreshRate', 120); }, get chatImgUrl() { return GM_getValue('hfr_hpc_chatImgUrl', ''); }, getHeader : function (postId) { var chatContent = document.getElementById('hpc_content_' + postId); return chatContent != null ? chatContent.previousSibling : null; }, isMinimized : function(postId) { var minimizedPostsIds = GM_getValue('hfr_hpc_minimizedPostsIds', ''); var ids = minimizedPostsIds != '' ? minimizedPostsIds.split(',') : new Array(); return ids.indexOf(postId) != -1; }, toggleMinimize : function(postId) { var chatHeader = hfrPrivateChat.getHeader(postId); var chatContent = chatHeader.nextSibling; // On change l'icône (minimize ou maximise) var imgToggle = chatHeader.firstChild.nextSibling.firstChild; imgToggle.src = imgToggle.src == hfrPrivateChat.minimizeImg ? hfrPrivateChat.maximizeImg : hfrPrivateChat.minimizeImg; // On stop éventuellement la notification hfrPrivateChat.stopNotify(postId, chatHeader); var minimizedPostsIds = GM_getValue('hfr_hpc_minimizedPostsIds', ''); var ids = minimizedPostsIds != '' ? minimizedPostsIds.split(',') : new Array(); // On maximise... if (ids.indexOf(postId) != -1) { ids = ids.slice(0, ids.indexOf(postId)).concat(ids.slice(ids.indexOf(postId) + 1, ids.length)); GM_setValue('hfr_hpc_minimizedPostsIds', ids.join(',')); // Réaffichage du chat chatContent.style.display = 'block'; // On lance un refresh hfrPrivateChat.getMPsContent(postId, chatContent.firstChild, true); // On donne le focus chatContent.firstChild.nextSibling.firstChild.focus(); } // ...ou on minimise else { ids.push(postId); chatContent.style.display = 'none'; GM_setValue('hfr_hpc_minimizedPostsIds', ids.join(',')); } }, get postsIds() { var postsIds = GM_getValue('hfr_hpc_postsIds', ''); return postsIds != '' ? postsIds.split(',') : new Array(); }, isClosed : function(postId) { var postsIds = GM_getValue('hfr_hpc_postsIds', ''); var ids = postsIds != '' ? postsIds.split(',') : new Array(); return ids.indexOf(postId) == -1; }, toggleClose : function(postId) { var postsIds = GM_getValue('hfr_hpc_postsIds', ''); var ids = postsIds != '' ? postsIds.split(',') : new Array(); if (ids.indexOf(postId) != -1) { var idsToShift = ids.slice(ids.indexOf(postId) + 1, ids.length); ids = ids.slice(0, ids.indexOf(postId)).concat(idsToShift); document.getElementById('hpc_content_' + postId).parentNode.style.display = 'none'; // Réorganisation des fenêtres de chat idsToShift.forEach(function(id) { var currentWindow = document.getElementById('hpc_content_' + id).parentNode; currentWindow.style.right = (parseInt(currentWindow.style.right) - 307) + 'px'; } ); } else { ids.push(postId); } GM_setValue('hfr_hpc_postsIds', ids.join(',')); }, startAutoRefreshProcess : function(postId) { hfrPrivateChat.autoRefreshTimers[postId] = setInterval(function() { hfrPrivateChat.getMPsContent(postId, document.getElementById('hpc_content_' + postId).firstChild); } , hfrPrivateChat.refreshRate*1000); }, doNotify : function(postId) { var chatHeader = hfrPrivateChat.getHeader(postId); clearInterval(hfrPrivateChat.notifyTimers[postId]); hfrPrivateChat.notifyTimers[postId] = setInterval(function() { chatHeader.style.backgroundColor = chatHeader.style.backgroundColor == 'rgb(192, 192, 192)' ? 'rgb(51, 102, 153)' : 'rgb(192, 192, 192)'; chatHeader.firstChild.style.color = chatHeader.firstChild.style.color == 'rgb(0, 0, 0)' ? 'rgb(255, 255, 255)' : 'rgb(0, 0, 0)'; } , 500); }, stopNotify : function(postId, chatHeader) { clearInterval(hfrPrivateChat.notifyTimers[postId]); }, getMPsContent : function(postId, chatMps) { var disableNotify = hfrPrivateChat.getMPsContent.arguments.length > 2 ? hfrPrivateChat.getMPsContent.arguments[2] : false; var flood = hfrPrivateChat.getMPsContent.arguments.length > 3 ? hfrPrivateChat.getMPsContent.arguments[3] : false; if (!hfrPrivateChat.isMinimized(postId)) { var chatHeader = hfrPrivateChat.getHeader(postId); var waitImg = document.createElement('img'); waitImg.src = "data:image/gif;base64,R0lGODlhEAALAPQAAP%2F%2F%2FwAAANra2tDQ0Orq6gYGBgAAAC4uLoKCgmBgYLq6uiIiIkpKSoqKimRkZL6%2BviYmJgQEBE5OTubm5tjY2PT09Dg4ONzc3PLy8ra2tqCgoMrKyu7u7gAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh%2BQQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5%2By967tYLyicBYE7EYkYAgAh%2BQQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W%2FHISxGBzdHTuBNOmcJVCyoUlk7CEAAh%2BQQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ%2BYrBH%2BhWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C%2B4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa%2F7txxwlwv2isSacYUc%2Bl4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r%2Fu3HHCXC%2FaKxJpxhRz6Xi0ANAZDWa%2BkEAA7AAAAAAAAAAAA"; waitImg.alt = waitImg.title = 'Loading...'; chatHeader.firstChild.nextSibling.insertBefore(waitImg, chatHeader.firstChild.nextSibling.firstChild); } hfrPrivateChat.retrieveMetaInfosByPage(postId, 1, disableNotify, flood, chatMps); }, retrieveMetaInfosByPage : function(postId, pageNumber, disableNotify, flood, chatMps) { var tmp; var url = 'https://forum.hardware.fr/forum1.php'; var args = 'config=hfr.inc&cat=prive'; args += pageNumber != null ? '&page=' + pageNumber : ''; toyoAjaxLib.loadDoc(url, 'get', args, function(pageContent) { var pageMax = (tmp = pageContent.match(/([0-9]+)<\/a><\/div>
/)) != null ? tmp.pop() : null; var regexp = new RegExp('(.+?).*?(.+?).*?class="Tableau">(.+?).*\\s*.*\\s*.*\\s*.*?
(.+?)'); var infos = pageContent.match(regexp); if (infos == null) { // Pas la bonne page, on passe à la suivante si on est pas arrivé à la dernière et si il y a plus d'une seule page de mps if (pageNumber != null && pageNumber < pageMax) hfrPrivateChat.retrieveMetaInfosByPage(postId, pageNumber + 1, disableNotify, flood, chatMps); } else { var lastMpPseudo = infos.pop(); var interlocutorPseudo = infos.pop(); var maxPage = (tmp = infos.pop().match(/class="cCatTopic">(.+?)<\/a>/)) != null ? tmp.pop() : null; var postTitle = infos.pop(); var newMp = infos.pop() == 'On' && interlocutorPseudo.toLowerCase() == lastMpPseudo.toLowerCase() && !disableNotify; hfrPrivateChat.getHeader(postId).firstChild.innerHTML = postTitle; if (hfrPrivateChat.isMinimized(postId)) { // Si nouveau mp, notification d'un nouveau message if (newMp) hfrPrivateChat.doNotify(postId); } else { hfrPrivateChat.retrieveMpsByPage(postId, maxPage, hfrPrivateChat.mpsNumber, newMp, flood, chatMps); } } } ); }, retrieveMpsByPage : function(postId, pageNumber, remainingMps, newMp, flood, chatMps) { var url = 'https://forum.hardware.fr/forum2.php'; var args = 'config=hfr.inc&cat=prive&post=' + postId; args += pageNumber != null ? '&page=' + pageNumber : ''; toyoAjaxLib.loadDoc(url, 'get', args, function(pageContent) { var chatHeader = hfrPrivateChat.getHeader(postId); var waitImg = chatHeader.firstChild.nextSibling.firstChild; if (waitImg.nodeName.toLowerCase() == 'img') { chatHeader.firstChild.nextSibling.removeChild(waitImg); chatMps.innerHTML = ''; } if (hfrPrivateChat.myPseudo == null) hfrPrivateChat.myPseudo = pageContent.match(//).pop(); var contentNode = document.createElement('div'); contentNode.innerHTML = pageContent; var currentMps = getElementByXpath('.//table[starts-with(@class, "messagetable")]', contentNode); for (var ind in currentMps = currentMps.reverse()) { var mpDiv = document.createElement('div'); mpDiv.className = 'hpc_mp'; var pseudo = getElementByXpath('.//b[@class="s2"]', currentMps[ind]).pop().innerHTML; var postUrl = getElementByXpath('.//div[@class="right"]', currentMps[ind]).pop().innerHTML.match(/href="(.*?)"/).pop(); var tmp, mpContent = getElementByXpath('.//div[starts-with(@id, "para")]', currentMps[ind]).pop(); if ((tmp = getElementByXpath('.//div[@class="edited"]', mpContent)).length > 0) { mpContent.removeChild(tmp.pop()); mpDiv.className += ' mp_edited'; } if (mpContent.innerHTML.match(/Reprise du message précédent :<\/strong>/) != null) continue; var newLink = document.createElement('a'); newLink.innerHTML = pseudo + ' :'; newLink.className = 'hpc_pseudo'; newLink.href = url + '?' + args + postUrl; newLink.title = 'Aller sur le message correspondant'; mpDiv.appendChild(newLink); mpDiv.innerHTML += mpContent.innerHTML; getElementByXpath('.//table[@class="spoiler"]', mpDiv).forEach(function(spoiler) { spoiler.removeAttribute('onclick'); spoiler.addEventListener('click', function() { var divToHide = getElementByXpath('.//div[@class="Topic masque"]', this).pop(); divToHide.style.visibility = divToHide.style.visibility == 'visible' ? 'hidden' : 'visible'; }, false); } ); getElementByXpath('.//table[@class="code"]', mpDiv).forEach(function(code) { code.removeAttribute('ondblclick'); } ); chatMps.insertBefore(mpDiv, chatMps.firstChild); if (--remainingMps == 0) break; } if (flood) { var mpDiv = document.createElement('div'); mpDiv.className = 'hpc_mp flood'; mpDiv.innerHTML = 'Flood interdit [:o_non]'; chatMps.appendChild(mpDiv); } if (remainingMps > 0 && pageNumber > 1) { // Il reste des messages à récupérer, on va les chercher à la page précédente si on n'est pas déja arrivé à la page 1 hfrPrivateChat.retrieveMpsByPage(postId, pageNumber-1, remainingMps, newMp, flood, chatMps); } else { setTimeout(function(){ chatMps.scrollTop = chatMps.scrollHeight; }, 100); document.getElementById('hpc_post_' + postId).firstChild.readOnly = false; // Si nouveau mp, notification d'un nouveau message (sauf si la fenêtre à déjà le focus) if (newMp && postId != hfrPrivateChat.activePostId) hfrPrivateChat.doNotify(postId); } } ); }, insertStyle : function() { // Style général cssManager.addCssProperties("div.hfr_private_chat span, div.hfr_private_chat div, div.hfr_private_chat textarea {font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;}"); cssManager.addCssProperties("div.hfr_private_chat {width: 300px; position: fixed; border: 1px solid black; border-bottom: 0; bottom: 0; background-color: #fff;}"); cssManager.addCssProperties("div.hpc_header {background-color: #c0c0c0; height: 20px; text-align: right; padding-top: 6px;}"); cssManager.addCssProperties("div.hpc_header div {text-align: right;}"); cssManager.addCssProperties("div.hpc_header input{ padding-right: 3px;}"); cssManager.addCssProperties("div.hpc_header img { padding-right: 5px; vertical-align: 0px;}"); cssManager.addCssProperties("div.hpc_header a:link, div.hpc_header a:visited {text-align: left; padding-left: 5px; width: 200px; font-size: 0.75em; color: #000; font-weight: bold; display: block; float: left; white-space: nowrap; overflow: hidden;}"); cssManager.addCssProperties("div.hpc_header a:hover, div.hpc_header a:active {text-decoration: underline;}"); cssManager.addCssProperties("div.hpc_mps {background-color: #f7f7f7; height: 150px; overflow: auto}"); cssManager.addCssProperties("img.hpc_wait {display: block; margin: auto !important; margin-top: 59px !important;}"); cssManager.addCssProperties("div.hpc_mp {padding: 5px; border-bottom: 1px solid #c0c0c0; font-size: 0.7em; text-align: left;}"); cssManager.addCssProperties("div.hpc_mp table[class='spoiler'], div.hpc_mp table[class='oldcitation'] {font-size: 1em;}"); cssManager.addCssProperties("div.hpc_mp table[class='code'], div.hpc_mp table[class='oldquote'], div.hpc_mp table[class='fixed'] {font-size: 1.1em;}"); cssManager.addCssProperties("div.hpc_mp a.hpc_pseudo:link, div.hpc_mp a.hpc_pseudo:visited {font-weight: bold; color: #000;}"); cssManager.addCssProperties("div.hpc_mp a.hpc_pseudo:hover, div.hpc_mp a.hpc_pseudo:active {text-decoration: underline;}"); cssManager.addCssProperties("div.hpc_mp p {margin: 0; padding: 0;}"); cssManager.addCssProperties("div.hpc_mp img {max-width: 150px;}"); cssManager.addCssProperties("div.mp_edited {background-color: #ededed;}"); cssManager.addCssProperties("div.hpc_mp img[src^='https://forum-images.hardware.fr'] {display: inline; width: auto;}"); cssManager.addCssProperties("div.flood {color: red; font-weight: bold;}"); cssManager.addCssProperties("div[id^='hpc_post'] {padding: 10px; background-color: #F7F7F7;}"); cssManager.addCssProperties("div[id^='hpc_post'] textarea {border: 1px solid black; width: 100%; font-size: 0.75em;}"); cssManager.insertStyle(); }, displayWindow : function(postId) { // Construction de la fenêtre var chatDiv = document.createElement('div'); chatDiv.className = 'hfr_private_chat'; chatDiv.style.right = ((hfrPrivateChat.postsIds.indexOf(postId) * 307) + 5) + 'px'; //document.body.appendChild(chatDiv); document.getElementById('mesdiscussions').appendChild(chatDiv); var chatHeader = document.createElement('div'); chatHeader.className = 'hpc_header'; chatDiv.appendChild(chatHeader); var titleLink = document.createElement('a'); titleLink.innerHTML = ' '; titleLink.href = 'https://forum.hardware.fr/forum2.php?config=hfr.inc&cat=prive&post=' + postId; titleLink.title = 'Aller sur le MP correspondant'; chatHeader.appendChild(titleLink); var inputMinimize = document.createElement('input'); inputMinimize.type = 'image'; inputMinimize.src = hfrPrivateChat.isMinimized(postId) ? hfrPrivateChat.maximizeImg : hfrPrivateChat.minimizeImg; inputMinimize.alt = 'minimiser'; inputMinimize.addEventListener('click', function(){ hfrPrivateChat.toggleMinimize(postId); }, false); var inputClose = document.createElement('input'); inputClose.type = 'image'; inputClose.src = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0D%00%00%00%0D%08%02%00%00%00%FD%89s%2B%00%00%00%09pHYs%00%00%0B%12%00%00%0B%12%01%D2%DD~%FC%00%00%00%A7IDATx%DA%8DQ%5B%0E%C20%0C%CB%A19%09%9F%1C%86%D5y%88%FCLbCh%88%03%F0%0D7%20e%DAVm%D3F%D4Vj%E2%3AvC%ED%ADSs%B0%CA%10%00DLU%99Y%F5%92%D4%EB%F6Af%FEz%7F%B6W%A0I%D9%FA%8Bw%CFYy%CC%04%2FE%A3%3Eu8%9EJh%99%C98e_%16f%CFB0%85%81%25G%9C%A5%00%8C%7DW%DBM%3EX%C2%AF%AD%F2%95%D0%E0%22%F9C%1F'%84%3E%EC%FA%05%AAI%DF%C6%FF%25%06%85%97%DDyd%BFu%D3B%F8%CC%92G%8C%3C%D2%D8A%C0%BFH%B0%8A%FD%DA%DC%BF0%EF%A77%E9o%D0%81%00%00%00%00IEND%AEB%60%82"; inputClose.alt = 'fermer'; inputClose.addEventListener('click', function() { // On stop éventuellement la notification hfrPrivateChat.stopNotify(postId, chatHeader); // On ferme la fenêtre de chat hfrPrivateChat.toggleClose(postId); // Si la fenêtre était minimisée, on la maximise pour la prochaine fois if (hfrPrivateChat.isMinimized(postId)) hfrPrivateChat.toggleMinimize(postId); } , false); var buttonsContainer = document.createElement('div'); chatHeader.appendChild(buttonsContainer); buttonsContainer.appendChild(inputMinimize); buttonsContainer.appendChild(inputClose); var chatContent = document.createElement('div'); chatContent.id = 'hpc_content_' + postId; chatContent.style.display = hfrPrivateChat.isMinimized(postId) ? 'none' : 'block'; chatDiv.appendChild(chatContent); var chatMps = document.createElement('div'); chatMps.className = 'hpc_mps'; chatContent.appendChild(chatMps); var chatPost = document.createElement('div'); chatPost.id = 'hpc_post_' + postId; chatContent.appendChild(chatPost); var newTA = document.createElement('textarea'); newTA.readOnly = true; newTA.setAttribute('accesskey', 'b'); newTA.addEventListener('keydown', function(event) { if (event.which == 13) { if (hfrPrivateChat.lockPost) return; if (event.ctrlKey) { var ssSave = this.selectionStart; var stSave = this.scrollTop; this.value = this.value.slice(0, this.selectionStart) + "\n" + this.value.slice(this.selectionStart); this.setSelectionRange(ssSave + 1, ssSave + 1); this.scrollTop = stSave + 16; } else { if (this.value != '') { hfrPrivateChat.lockPost = true; this.readOnly = true; var url = 'https://forum.hardware.fr/bddpost.php?config=hfr.inc'; var args = 'content_form=' + encodeURIComponent(this.value) + '&post=' + postId + '&pseudo=' + encodeURIComponent(hfrPrivateChat.myPseudo) + '&cat=prive&verifrequet=1100&sujet=DTC'; args += '&hash_check=' + getElementByXpath('//input[@name="hash_check"]', document).pop().value; toyoAjaxLib.loadDoc(url, 'post', args, function(response) { hfrPrivateChat.lockPost = false; var ta = document.getElementById('hpc_post_' + postId).firstChild; ta.value = ''; ta.focus(); var flood = response.match(/flood/) != null; hfrPrivateChat.getMPsContent(postId, chatMps, false, flood); } ); } event.preventDefault(); } } } , false); newTA.addEventListener('focus', function() { hfrPrivateChat.stopNotify(postId, chatHeader); hfrPrivateChat.activePostId = postId; chatHeader.style.backgroundColor = 'rgb(51, 102, 153)'; chatHeader.firstChild.style.color = 'rgb(255, 255, 255)'; } , false); newTA.addEventListener('blur', function() { hfrPrivateChat.activePostId = null; chatHeader.style.backgroundColor = 'rgb(192, 192, 192)'; chatHeader.firstChild.style.color = 'rgb(0, 0, 0)'; } , false); chatPost.appendChild(newTA); // On active l'autoresfresh hfrPrivateChat.startAutoRefreshProcess(postId); // On va récupérer les mps hfrPrivateChat.getMPsContent(postId, chatMps); }, displayWindows : function() { hfrPrivateChat.postsIds.forEach(function(postId){ hfrPrivateChat.displayWindow(postId); }); }, generateImg : function(postId) { var newImg = document.createElement('img'); newImg.src = hfrPrivateChat.chatImgUrl == '' ? "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%04gAMA%00%00%AF%C87%05%8A%E9%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%02%83IDAT8%CB%8D%D1ML%D2q%1C%06p%EB%D0%96%1E%3Au%E8%ED%80d%1D%D2%D6%8B%CE9%B6%88%F0%D0X%BA%E6%40%86%A8%C8BL%C9%A1%22%19%06d%82%A5%5B%8A%FE%C1%3FZ)%94%E8%DFR%0C%CD%11%EB%A2%07m%A6%E2%7BXk%83C%0A%DD%9A9k%CB%F0%89%D82%9B%CC%3C%3C%A7%DF%BE%9F%3D%7B~Q%00%A2v%8A%9A%7BX%3Co%8E%5BY%EA%3C%02%AF%95%B6n%91%C7%B6%A5'%C7%EE%FB%F3%BE%E3%B1%9Cs%94%ED%EB%A0%05%97%BB%0EakZe%F4%C6%5D%01m%A2%83%C4r_%22%FC%AE%7C%7C%1B%AB%87%DF%CE%C02u%0C%0Bf%FA%97%5D%01%24%F7%40%7D%60%C6%85%95Q%12%EB3O%B0%FA%86%C4%D2%B4%13C%BA%B3%BE%5D%01%19%9CL%A9%C7V%B6%F1u%B6%17%C1%C5%3E%AC-8%10%18%26P%9D%7B%D1%1E%11%90%B2%E2%C4%CD%E2K%2BD%0E%0Bd%1E%7B%BD%90%9F0IT%C8~%04%EC%0A%7C%EA%BF%8B%C0%80%06%23-7p%3A%FF%943I%19%1F%F3%0F%20b%1Cg7%8BS%83%8DB%16%B6%A6%DD%20%87%B1U%8F%3A%93%06w%1E(%D1%FF%CE%86%9A%A1j%24hOZ%CF(NDo%02%06%FE%B9%91%87%85W%D1Wu%0D%9E.5%3A%15%3C%109l%B4%14%A4%C22%A3%86y%AA%02%0D%EER%D4%BA%CB%D0%F3%BE%0D%25%8Eb%A4%14%26%91%9B%80%89O%EF%F98Dm%1B%8C%AAd%C10u%0Bun%25t%13%25%B8%3DQ%04%D5%DB%22%88%C9%3Cx%C9%F4%FF%0FV%A7%E3%C24%ADBC%A8%81a%EA%26%9AB)%1F%94!%CB%90%05%FF%A3%2B%7F%81%BD%E7%9BT%26U%F1%B6%C1%E2y%E5%90%D8%B2q%BD%5B%80%02J%00IG%26.%E8%19%3E%A5%B4%AA%CAk%11%08%C3%C7%7B%18%DD%92%0C%85%7Bu%F83p%EF%B9%1D%9Av%0AJ%C2%8A%C7%E3%DF%A14-a%7FJ%B75%86%D9%1A%1D%E9%AB%A3h%9C%16%1EO%3E%B86%B0%18%84%DE%03%E4%8F%03%B9%C3%40%E6%20%C0%A7%00b%14%10j%3C%88c%D7%90%11%819%7D%E2%CF%C9%5E%23%14%2F%02%10%B9%00%91c%03Bj%03%3Ck%10if%20%CD%18%C4S%CB%CB%F0%60%11%01_%13%D3%DF%5BS%0A%81v%0C%D2%D7%80%F8U%A8%81%03%C8%19%00%B2%7F%B7%A8%F5B%AB%B8%1F%1E%2C%22%F0%A1%A3%20%C5Y%9DQ%99%CC%B39%12K%26%C0%D2%CE%852%0F%96z%16%CCJ7%E8%97%9F%F9%8C%E5%92%F0%60%91%80_A%7F%B2%00%90%B7%7CA%00%00%00%00IEND%AEB%60%82" : hfrPrivateChat.chatImgUrl; newImg.alt = newImg.title = 'Lancer un chat'; newImg.style.cursor = 'pointer'; newImg.addEventListener('click', function() { if (hfrPrivateChat.isClosed(postId)) { hfrPrivateChat.toggleClose(postId); hfrPrivateChat.displayWindow(postId); document.getElementById('hpc_post_' + postId).firstChild.focus(); } else { var chatContent = document.getElementById('hpc_content_' + postId); // Fenêtre déjà ouverte et minimisée, on maximise et on rafraichit if (hfrPrivateChat.isMinimized(postId)) hfrPrivateChat.toggleMinimize(postId); // Et on donne le focus au textarea chatContent.firstChild.nextSibling.firstChild.focus(); } } , false); return newImg; }, insertShortcuts : function() { if (('' + document.location).match(/https:\/\/forum.hardware.fr\/forum.*?cat=prive/) != null) { var root = document.getElementById('mesdiscussions'); var tr = null; // Icônes dans la page qui liste les MPs tr = getElementByXpath('//table//tr[@class="cBackHeader fondForum1Subcat"]', root); if (tr.length > 0) { var th = tr.pop().firstChild; th.setAttribute('colspan', parseInt(th.getAttribute('colspan')) + 1); } tr = getElementByXpath('//table//tr[@class="cBackHeader fondForum1PagesHaut"]', root); if (tr.length > 0) { var th = tr.pop().firstChild; th.setAttribute('colspan', parseInt(th.getAttribute('colspan')) + 1); } tr = getElementByXpath('//table//tr[@class="cBackHeader fondForum1PagesBas"]', root); if (tr.length > 0) { var th = tr.pop().firstChild; th.setAttribute('colspan', parseInt(th.getAttribute('colspan')) + 1); } tr = getElementByXpath('//table//tr[@class="cBackHeader fondForum1Description"]', root); if (tr.length > 0) { tr = tr.pop(); var newTh = document.createElement('th'); newTh.setAttribute('scope', 'col'); newTh.innerHTML = '   '; tr.insertBefore(newTh, tr.firstChild); } getElementByXpath('//table//tr[starts-with(@class, "sujet ligne_booleen")]', root).forEach(function(tr) { var newTd = document.createElement('td'); if (getElementByXpath('.//img[@alt="closed"]', tr).length == 0) { var newImg = hfrPrivateChat.generateImg(getElementByXpath('.//td//input[@type="checkbox"]', tr).pop().value); newTd.appendChild(newImg); } else { newTd.innerHTML = ' '; } tr.insertBefore(newTd, tr.firstChild.nextSibling.nextSibling); } ); } }, insertQuickOpener : function () { var url = 'https://forum.hardware.fr/forum1.php'; var args = 'config=hfr.inc&cat=prive&page=1'; toyoAjaxLib.loadDoc(url, 'get', args, function(pageContent) { var contentNode = document.createElement('div'); contentNode.innerHTML = pageContent; var newMps = new Array(); getElementByXpath('.//table//tr[starts-with(@class, "sujet ligne_booleen")]', contentNode).forEach(function(tr) { if (getElementByXpath('.//td[starts-with(@class, "sujetCase1")]//img[@alt="On"]', tr).length == 1) { newMps.push(getElementByXpath('.//td[@class="sujetCase10"]//input[@type="checkbox"]', tr).pop().value); } } ); if (newMps.length >= 1) { var mpDiv = getElementByXpath('.//div[@class="left"]//div[@class="left"]', document).pop(); if (!mpDiv) return; var newA = document.createElement('a'); newA.innerHTML = '(Ouvrir dans des fenêtres de chat)'; newA.style.paddingLeft = '5px'; newA.className = 's1Ext'; newA.href = 'javascript:void(0);'; newA.addEventListener('click', function(event) { for (var i = 0; i < newMps.length; i++) { var postId = newMps[i]; if (hfrPrivateChat.isClosed(postId)) { hfrPrivateChat.toggleClose(postId); hfrPrivateChat.displayWindow(postId); document.getElementById('hpc_post_' + postId).firstChild.focus(); } else { var chatContent = document.getElementById('hpc_content_' + postId); // Fenêtre déjà ouverte et minimisée, on maximise et on rafraichit if (hfrPrivateChat.isMinimized(postId)) hfrPrivateChat.toggleMinimize(postId); // Et on donne le focus au textarea chatContent.firstChild.nextSibling.firstChild.focus(); } } } , false); mpDiv.appendChild(newA); } } ); }, insertGmMenuCommands : function() { GM_registerMenuCommand("[HFR] Private chat -> Url de l'image", function() { var imgUrl = prompt("Url de l'image ?", hfrPrivateChat.chatImgUrl); if (imgUrl == null) return; GM_setValue('hfr_hpc_chatImgUrl', imgUrl); } ); GM_registerMenuCommand("[HFR] Private chat -> Fréquence de rafraîchissement", function() { var refreshRate = prompt("Fréquence de rafraîchissement de la fenêtre de chat (en secondes) ?", hfrPrivateChat.refreshRate); if (!refreshRate) return; GM_setValue('hfr_hpc_refreshRate', refreshRate); } ); GM_registerMenuCommand("[HFR] Private chat -> Nombre de MPs affichés", function() { var mpsNumber = prompt("Nombre de MPs affichés par fenêtre de chat ?", hfrPrivateChat.mpsNumber); if (!mpsNumber) return; GM_setValue('hfr_hpc_mpsNumber', mpsNumber); } ); }, launch : function() { hfrPrivateChat.insertGmMenuCommands(); hfrPrivateChat.insertShortcuts(); hfrPrivateChat.insertQuickOpener(); hfrPrivateChat.insertStyle(); hfrPrivateChat.displayWindows(); } }; hfrPrivateChat.launch(); // ============ Module d'auto update du script ============ ({ check4Update : function() { var autoUpdate = this; var mirrorUrl = GM_getValue('mirrorUrl', 'null'); if (mirrorUrl == 'null') autoUpdate.retrieveMirrorUrl(); var currentVersion = GM_getValue('currentVersion', '0.1.7'); // On met éventuellement la version stockée à jour avec la version courante, si la version courante est plus récente if (autoUpdate.isLater('0.1.7', currentVersion)) { GM_setValue('currentVersion', '0.1.7'); currentVersion = '0.1.7'; } // Par contre, si la version stockée est plus récente que la version courante -> création un menu d'update pour la dernière version else if (autoUpdate.isLater(currentVersion, '0.1.7')) { GM_registerMenuCommand("[HFR] Private Chat -> Installer la version " + currentVersion, function() { GM_openInTab(mirrorUrl + 'hfr_private_chat.user.js'); } ); } // Si la version courante et la version stockée sont identiques, on ne fait rien if (GM_getValue('lastVersionCheck') == undefined || GM_getValue('lastVersionCheck') == '') GM_setValue('lastVersionCheck', new Date().getTime() + ''); // Pas eu de check depuis 24h, on vérifie... if ((new Date().getTime() - GM_getValue('lastVersionCheck')) > 86400000 && mirrorUrl != 'null') { var checkUrl = mirrorUrl + 'getLastVersion.php5?name=' + encodeURIComponent('[HFR] Private Chat'); if (isNaN(currentVersion.substring(currentVersion.length - 1))) checkUrl += '&sversion=' + currentVersion.substring(currentVersion.length - 1); GM_xmlhttpRequest({ method: "GET", url: checkUrl, onload: function(response) { var regExpVersion = new RegExp('^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}[a-zA-Z]?$'); var lastVersion = response.responseText; // Pas d'erreur et nouvelle version plus récente if (lastVersion != '-1' && regExpVersion.test(lastVersion) && autoUpdate.isLater(lastVersion, currentVersion)) { if (confirm('Une nouvelle version de [HFR] Private Chat est disponible : ' + lastVersion + '\nVoulez-vous l\'installer ?')) { GM_openInTab(mirrorUrl + 'hfr_private_chat.user.js'); } else { // Mémorisation de la version refusée : elle servira de version de référence GM_setValue('currentVersion', lastVersion); } } GM_setValue('lastVersionCheck', new Date().getTime() + ''); } }); } }, max : function(v1, v2) { var tabV1 = v1.split('.'); var tabV2 = v2.split('.'); if (isNaN(tabV1[2].substring(tabV1[2].length - 1))) tabV1[2] = tabV1[2].substring(0, tabV1[2].length - 1); if (isNaN(tabV2[2].substring(tabV2[2].length - 1))) tabV2[2] = tabV2[2].substring(0, tabV2[2].length - 1); if ((tabV1[0] > tabV2[0]) || (tabV1[0] == tabV2[0] && tabV1[1] > tabV2[1]) || (tabV1[0] == tabV2[0] && tabV1[1] == tabV2[1] && tabV1[2] > tabV2[2])) { return v1; } else { return v2; } }, isLater : function(v1, v2) { return v1 != v2 && this.max(v1, v2) == v1; }, retrieveMirrorUrl : function() { var mirrors = 'http://hfr.toyonos.info/gm/;http://hfr-mirror.toyonos.info/gm/'.split(';'); var checkMirror = function (i) { var mirror = mirrors[i]; GM_xmlhttpRequest({ url: mirror + 'getLastVersion.php5', method: "HEAD", onload: function(response) { // Dès qu'un miroir répond, on le mémorise. if (response.status == 200) { GM_setValue('mirrorUrl', mirror); } else { // Sinon on test le prochain if ((i + 1) < mirrors.length) { checkMirror(i + 1); } else { GM_setValue('mirrorUrl', 'null'); } } } }); }; checkMirror(0); }, }).check4Update();