NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name JV Chat + // @namespace Naptu // @description Propose trois nouvelles options pour JV Chat (récupération des messages privés, possibilité de changer de pseudo, possibilité de changer de skin) // @include http://www.jeuxvideo.com/jvchat* // ==/UserScript== $(function() { // Préparation du localStorage if(!localStorage.jvChatPlus) localStorage.jvChatPlus = '{}'; // Du CSS, pour les box et leur contenu $('head').append( $('<style />', { type: 'text/css', id: 'CssJvChatPlus', text: 'div[id^="box"] { display: none; background: #FFF;border: 1px solid #797979;border-top: none!important;padding: 5px;font: 12px Open Sans;position: fixed;top: 0;border-radius: 0 0 9px 9px;left: 25px;right: 25px;z-index: 456445484844848;box-shadow: 0 0 60px #000;width: 600px;margin: auto; }'+ '.dest { float: right; margin-right: 6px; }'+ '.ligne_mp { min-height: 16px; border-bottom: 1px solid #C7C7C7; margin: 0px -9px -11px -9px; padding: 2px 11px 7px 11px; }'+ '.ligne_mp a { float: left; display: block; clear: right; margin-left: 5px; }'+ '.ligne_mp a:not(.lu) { font-weight: 700!important; }'+ '#box_mp { overflow:hidden!important; max-height: 300px; }'+ '.titreBox { display: block; background: url(http://image.noelshack.com/fichiers/2013/27/1372630378-bg-box.png) repeat; margin: -5px -5px 5px -5px; padding: 6px; border-bottom: 1px solid #BEBEBE; }'+ '#lienBR { position: absolute; bottom: 0px; background: #D3D3D3; left: 0; right: 0; padding: 4px; border-top: 1px solid #BDBDBD; }'+ '#lienBR:hover { background: #CCC; }'+ '#lienBR > a { display: block; color: #475F6D!important; }'+ 'input[type="text"], input[type="text"] { border-radius: 2px!important; padding: 2px!important; border: 1px solid #BEBEBE!important; }'+ '#box_pseudo input { display: block; margin-left: auto; margin-right: auto; }'+ '#label_cc img { border: 1px solid #B4B4B4; border-radius: 2px; padding: 0 26px; margin-right: 0px; padding-left: 27px!important; }'+ '#box_pseudo input { font: 13px Open Sans; }'+ '#box_pseudo > div > img { position: absolute; top: 35px; right: 7px; display: none; }'+ '#box_selectSkin div div { display: inline-block; padding: 10px; margin: -3px; }'+ '.fermerBox { opacity: 0.5; position: absolute; right: 10px; top: 4px; }'+ '.fermerBox:hover { opacity: 0.9; }'+ '#box_selectSkin select { max-width: 79px; }' }) ); // Objet principal, dont les propriétés directes deviendront ensuite des identifiants HTML, ce qui justifie la présence des underscores ("mp" tout court existe déjà, par exemple) var options = { _mp: { raccClavier: 'M', text: 'mp (0)', titre: 'Messages privés', go: function() { var callee = arguments.callee, curseurSurBox = true; // On stoppe l'AJAX lorsque le curseur de souris est sur la box, autrement, il faudrait cliquer plusieurs fois sur un lien pour qu'il fonctionne $('#box_mp').on({ mouseenter: function() { curseurSurBox = true; }, mouseleave: function() { curseurSurBox = true; } }); if(document.cookie.indexOf('tehlogin') === -1 || curseurSurBox) { setTimeout(callee, 1000); return; } // On stockera l'intégralité des MPs reçus dans une div cachée, pour la simple et bonne raison que l'HTML est plus simple à manier que du texte en brut if(!$('#mpsOriginaux').is('*')) { $('body').prepend( $('<div />', { id: 'mpsOriginaux', css: {display: 'none'} }) ); } // Mise à jour du nombre de MPs non lus, dans le bouton de la zone de post + mise à jour des MPs dans la box setTimeout(function() { $.get( 'http://www.jeuxvideo.com/messages-prives/get_message_nonlu.php', false, function(r) { $('#_mp').text($('#_mp').text().replace(/\d+/, r.nb_message)); }, 'JSON' ); $.get( 'http://www.jeuxvideo.com/messages-prives/boite-reception.php', false, function(r) { var html = ''; if(r.indexOf('Vous n\'avez aucun message dans la boîte de réception. Get a life.') > -1 || (r.match(/<a href="http:\/\/www\.jeuxvideo\.com\/messages-prives\/message\.php/g).length === r.match(/<a.+?class="lu"/g).length)) html = 'Vous n\'avez aucun message non lu dans la boîte de réception. Get a life.'; else if (r.indexOf('Vous tentez d\'accéder à un espace privé, qui nécessite d\'être inscrit et connecté à Jeuxvideo.com') > -1) html = 'Veuillez vous connecter.'; else { $('#mpsOriginaux').html(r.split('cellspacing="1" summary="">')[1].split('</table>')[0]); $('#mpsOriginaux a:not(.lu)').each(function() { $(this).attr('target', '_blank'); html += '<div class="ligne_mp">'+ $(this).wrapAll('<a></a>').parent().html() +'<span class="dest">'+ $(this).parent().parent().prev().text() +'</span></div><br />'; }); } $('#box_mp > div').html('<div style="padding-bottom: 14px!important;">'+ html +'</div><div id="lienBR"><a target="_blank" href="http://www.jeuxvideo.com/messages-prives/boite-reception.php">Boîte de réception</a></div>'); }, 'text' ); setTimeout(callee, 2000); }, 1000); } }, _pseudo: { raccClavier: 'P', text: 'changer de pseudo', titre: 'Changer de pseudo', go: function() { $('#box_pseudo > div') .html( $('<form />', { html: '<input type="text" id="inputPseudo" placeholder="Pseudo">'+ '<input type="password" id="inputPass" placeholder="Mot de passe">'+ '<button type="submit" id="connex" class="bbtn">Connexion</button>', submit: function(e) { e.preventDefault(); // Ces variables ne deviennent utiles qu'en cas d'erreurs liées à la présence d'un code de confirmation var tk, session, code; if($('#_code').is('*')) { tk = $('#_tk').val(); code = $('#_code').val(); session = $('#_session').val(); } $.post( 'http://www.jeuxvideo.com/profil/ajax_connect.php', { pseudo: $('#inputPseudo').val(), pass: $('#inputPass').val(), retenir: 1, tk: tk, session: session, code: code }, function(r) { // Suppression des éléments d'erreurs, pour ne pas qu'ils se dédoublent en cas d'erreurs consécutives if($('#_code').is('*')) $('#label_cc, #_tk, #_code, #_session').remove(); // operation = 0 ==> OK if(r.operation == 0) { $('head').append( $('<style />', { type: 'text/css', text: '.pseudo a[title="'+ $('#inputPseudo').val().toLowerCase() +'"] { color: #09F!important; }' }) ); $('#inputPseudo, #inputPass').val(''); $('#succesLog').fadeIn(); setTimeout(function() { $('#succesLog').fadeOut({ complete: function() { $('#box_pseudo').slideUp('slow', function() { $('#area').focus(); }); } }); }, 1000); // operation =/= 0 ==> ERREUR } else { $('#erreurLog').fadeIn(); setTimeout(function() { $('#erreurLog').fadeOut(); }, 2000); // operation = 101 ==> MAUVAISE COMBINAISON PSEUDO/PASS, operation =/= 101 => CODE DE CONFIRMATION if(r.operation != 101) { $('#connex') .before( $('<label />', { 'for': '_code', id: 'label_cc', html: r.code_captsha }) ) .before( $('<input>', { type: 'text', id: '_code', maxlength: '4', autocomplete: 'off', placeholder: 'Code' }) ) .before( $('<input>', { type: 'hidden', id: '_tk', value: r.tk.toString().replace(/"/g, '') }) ) .before( $('<input>', { type: 'hidden', id: '_session', value: r.session }) ); } } }, 'JSON' ); } }) ) .prepend( $('<img>', { id: 'erreurLog', src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAUCAIAAAA2kktGAAAACXBIWXMAAAsSAAALEgHS3X78AAAAZklEQVR42mP4TwRgGBBFr44fvxkaeo6X9wwDAxABGUAuUBCh6MWOHXBpZAQUBEqBFAGVY1UBVwdUwAA0FsKHmIzJBipggBuDSxFQAYrhyD5CFidOEVHWEeVwooKAqMAkNloGW3oCAAmm+5w1a7LtAAAAAElFTkSuQmCC', }) ) .prepend( $('<img>', { id: 'succesLog', src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAUCAIAAAA2kktGAAAACXBIWXMAAAsSAAALEgHS3X78AAAAz0lEQVR42mP48/fPPyTwHxtgwJT49fsnEP3+/ROh6D8RAKro5bvHlx4fn3myvu9wIRABGUDu6w/PEIqAKpr2JRvPZEBDQMGff36AFAFVlO0OwVQBRB9/vIMYwbDkXB8eFY4LhIAKGIJXauBSkbbZAcgGKoCKWs7hmHmmAagPyN55ZzlQxeqr0+B6oBTEgUCy43AWkAE0CdlghEnIAYPmBoSbgNZBVACtQ1YBchPcdxDDgDYCGciKQL5DDifMAAOKgMIJf4gDpQjEHVmpgF6KAIxF+DYUcyjIAAAAAElFTkSuQmCC', }) ); } }, _selectSkin: { raccClavier: 'S', text: 'skin pokémon', titre: 'Choisir un skin', go: function() { if(!$('#skinCss').is('*')) $('head').append( $('<style />', { type: 'text/css', id: 'skinCss' }) ); // Retourne le CSS lié au skin, le dernier argument est destiné à contenir du CSS en brut, ça peut toujours servir function skin(bgPost, bdTopPost, bgTab, bdTab, colorTab, bgMsg, bdMsg, aHov, areaBd, autre) { var css = '#post { background:'+ bgPost +'; border-top: 1px solid '+ bdTopPost +'; }'+ '#tabs li.tab_visible { background: '+ bgTab +'; border: 1px solid '+ bdTab +'; color: '+ colorTab +'; }'+ '.msg1 .message { background: '+ bgMsg + '; border: 1px solid '+ bdMsg +'; }'+ '#options a:hover { color:'+ aHov +'; }'+ '#area { border: 1px solid '+ areaBd +'; }'; if(autre) css += autre; return css.replace(/;/g, '!important;'); } // La répartition par génération, c'était vraiment une excellente idée var skins = { g1: { roucarnage: skin('url(http://image.noelshack.com/fichiers/2013/34/1377106791-roucarnage.jpg) -14px -168px', '#000', '#7E7455', '#3A3A3A', '#271F0E', '#EBEBEB', '#C2C2C2', '#5A540D', '#000') , magicarpe: skin('url(http://image.noelshack.com/fichiers/2013/34/1377079290-magicarpe.png) -14px -255px', '#575757', '#8B8B8B', '#5E5E5E', '#2E0707', '#DDD', '#BEBEBE', '#D82300', '#A2A2A2') , aquali: skin('url(http://image.noelshack.com/fichiers/2013/34/1376936906-aquali.jpg) -61px -111px', '#4C7AA3', '#60E1FA', '#06C9C1', '#15807B', '#CEEBF8', '#74D4E7', '#08B8DA', '#469494') , voltali: skin('url(http://image.noelshack.com/fichiers/2013/34/1376995472-voltali.jpg) -155px -305px', '#3D6F1C', '#FFEE6F', '#CA9F5D', '#646419', '#E8FFDD', '#B8FFB5', '#389912', '#729C32') , pyroli: skin('url(http://image.noelshack.com/fichiers/2013/34/1376994301-pyroli.jpg) -14px -121px', '#6F1C1C', '#FD7C53', '#FD8952', '#A53B12', '#FFD0BA', '#FFBC96', '#FF5C00', '#94561C') }, g2: { mentali: skin('url(http://image.noelshack.com/fichiers/2013/34/1377017590-mentali.jpg) -292px -379px', '#398852', '#C3FFDE', '#35CFB7', '#1D8D72', '#E7FFF4', '#8CFFC8', '#B432AF', '#2CAA78') , tyranocif: skin('url(http://image.noelshack.com/fichiers/2013/34/1377090599-tyra.jpg) -38px -108px', '#000', '#BBB', '#777', '#076D65', '#E6FFD8', '#D8D8D8', '#535353', '#1E5520') }, g3: { absol: skin('url(http://image.noelshack.com/fichiers/2013/34/1377016536-absol.jpg) -345px -351px', '#0F6151', '#AEC5FF', '#6F9DFF', '#0C536F', '#E7E8FF', '#B5D3FF', '#19649E', '#8B9FA5') , latios: skin('url(http://image.noelshack.com/fichiers/2013/34/1377112332-latios.jpg) -13px -236px', '#141414', '#4E95EE', '#1C69BB', '#0C4368', '#D8FFF1', '#A2E0FD', '#0E4D86', '#272727') }, g4: { }, g5: { }, g6: { feunnec: skin('url(http://image.noelshack.com/fichiers/2013/34/1377024404-feunnec.png) 0 -313px', '#BE4212', '#FFB896', '#F5844F', '#B4180A', '#FFF5E7', '#FFD0BE', '#DF7019', '#AC4D35') , 'mega-lucario': skin('url(http://image.noelshack.com/fichiers/2013/34/1377081688-megalucario.jpg) -57px -168px', '#575452', '#22D3E2', '#00A0A7', '#07777C', '#E0FFFE', '#90E4FF', '#AF2323', '#5E5E5E') , 'mega-mewtwo': skin('url(http://image.noelshack.com/fichiers/2013/34/1377091406-pokemon-mewtwo-new-forme-by-mark331-d61derq.jpg) -39px -89px', '#310041', '#FDE0F6', '#6B00A7', '#6D0754', '#FDF4FC', '#F5BEFF', '#7D31CF', '#8A8A8A') , 'mega-brasegali': skin('url(http://image.noelshack.com/fichiers/2013/34/1377103107-brasegali.jpg) -15px -149px', '#383533', '#FD9A58', '#E46501', '#7C3F07', '#FFF8DB', '#FFD3A3', '#974C07', '#5C340F') , yveltal: '' , xerneas: skin('url(http://image.noelshack.com/fichiers/2013/33/1376855900-xerneas1.jpg)', '#519261', '#96D9FF', '#4DA2FD', '#0A70B4', '#E7FDFF', '#BED8FF', '#0E9132') } }; // Mise en place des <option> dans les <select> adéquats + mise en mémoire du skin choisi $.each(skins, function(generation, pokemons) { $('#box_selectSkin > div') .append( $('<div />') .append( $('<h5 />', { text: generation.replace(/g(\d)/, 'Génération $1') }) ) .append( $('<select />', { id: generation, change: function() { var json = JSON.parse(localStorage.jvChatPlus); json.skin = $(this).val(); localStorage.jvChatPlus = JSON.stringify(json); $('#skinCss').html(pokemons[$(this).val()]); } }) ) ); $.each(pokemons, function(pokemon, css) { $('#'+ generation).append( $('<option />', { text: pokemon.replace(new RegExp(pokemon.charAt(0)), pokemon.charAt(0).toUpperCase()), value: pokemon }) ); }); var json = JSON.parse(localStorage.jvChatPlus); if(json.skin) setTimeout(function() { $($('#box_selectSkin option[value="'+ json.skin +'"]').parent()).val(json.skin).trigger('change'); }, 500); }); } } } // eventTermine est un booléen, il empêche la mise en place d'événements plus d'une fois (sauf pour les raccourcis clavier, puisque c'est nécessaire) function demarrer(eventTermine) { if(!$('#options').is('*')) // On relance la fonction tant que JV Chat n'est pas encore chargé setTimeout(function() { demarrer(false); }, 500); else // On navigue dans l'objet principal pour créer les box et lancer les fonctions $.each(options, function(id, obj) { $('body').prepend( $('<div />', { id: 'box'+ id }) .append( $('<h1 />', { 'class': 'titreBox', text: obj.titre }) ) .append( $('<img>', { src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAQAAAADHm0dAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAAAEgAAABIAEbJaz4AAAAJdnBBZwAAABUAAAAVAHF8yDUAAABtSURBVCjP5ZLBCcAwCEWfHSXDBEeSjJRZMkNXSQ9pS2wgpMdSPYj8h35EqazGtkx+FxUkCndG8WztEqWQTsEoqFNdA+mErdUZ2uB8TZ+jkCnk0d54ASOwE7BBeUy1zqvNDLy6gHYL1avy+yc8APGFa375gR00AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==', 'class': 'fermerBox', click: function() { $(this).parent().slideUp('slow'); } }) ) .append($('<div />')) ); if(!eventTermine) $('#area').on('focus', function(e) { $('.fermerBox').trigger('click'); }); // Raccourcis clavier $(document).on('keydown', function(e) { if(!e.ctrlKey) return; else if(e.keyCode !== 17 && String.fromCharCode(e.keyCode) === obj.raccClavier.toUpperCase()) { $('#'+ id).trigger('click'); e.preventDefault(); } }); eventTermine = true; $('#options').prepend( $('<a />', { id: id, href: '#', text: obj.text.toLowerCase(), click: function(e) { e.preventDefault(); $('.fermerBox').trigger('click'); ($('#box'+ id).css('display') === 'block') ? $('#box'+ id).slideUp('slow') : $('#box'+ id).slideDown('slow'); } }) ); obj.go(); }); } demarrer(false); });