ImThatGuy / JVRealtime

// ==UserScript==
// @name         JVRealtime
// @author       ImThatGuy
// @description  Jeuxvideo.com en temps réél ! (plugin pour JVCpremium)
// @include      http://www.jeuxvideo.com/*
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require      https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @version      0.1
// @icon         https://image.noelshack.com/fichiers/2017/05/1485900804-jvrealtime.png
// @copyright    2017+, ImThatGuy
// ==/UserScript==

/*
JVRealtime. 2017.
Codé par ImThatGuy.

2017+, ImThatGuy.

Plugin pour JVCpremium : https://openuserjs.org/scripts/ImThatGuy/JVCpremium

JVRealtime vous permet de voir les forums de jeuxvideo.com en temps réél
les topics, les posts et le nombre de connecté(s) s'actualisent en temps réél


Utilisable sans JVcpremium mais vous ne pourrez pas le configurer.
Pour configurer ce script, vous devez installer JVCpremium.
*/

/*jshint multistr: true */
(function() {
    'use strict';

	var delay; // 2000 par defaut
	var buttonStyle       = 'font-size:11px;padding: 3px 6px;border-radius: 0;';
	var buttonStyleActive = buttonStyle + 'width:67px;';

	var R_topic;
	var R_post;
	var R_connectes;

	var c_btn;
	var t_btn;
	var p_btn;

	var d;
	var c;
	var b;

	var ci;
	var di;

	function listeSujet(data) {
        if (data.querySelectorAll('#search_in_forum').length === 0) {
            return false;
        } else {return true;}
    }

	function logConsole(text) {
		$('#consolePremium').append('<p style="margin:10px;">'+text+'</p>');
	}

	var firstTime = GM_getValue('firstTime');
	if (firstTime === undefined) { firstTime = true; }

	setTimeout(function() {
		// Défini si JVCpremium est activé
		var JVCpremiumPlugin;
		if (document.getElementById("PREMIUM") !== null) {
			JVCpremiumPlugin  = true;
		} else {
			JVCpremiumPlugin  = false;
		}

		if (JVCpremiumPlugin) {
			logConsole('[INFO] Plugin JVRealtime chargé.');
			// Redéfinis les variables si JVCpremium est activé
			if (!firstTime) {
				delay = GM_getValue('delay');

				R_topic =     GM_getValue('R_topic');
				R_post  =     GM_getValue('R_post');
				R_connectes = GM_getValue('R_connectes');

				c_btn = GM_getValue('c_btn');
				t_btn = GM_getValue('t_btn');
				p_btn = GM_getValue('p_btn');
			} else {
				// Premier lancement du plugin
				delay = 2000;

				R_topic = true;
				R_post  = true;
				R_connectes = true;

				c_btn = '<a style="'+buttonStyle+'" class="btn btn-default" id="realtime_c">Désactiver</a>';
				t_btn = '<a style="'+buttonStyle+'" class="btn btn-default" id="realtime_t">Désactiver</a>';
				p_btn = '<a style="'+buttonStyle+'" class="btn btn-default" id="realtime_p">Désactiver</a>';
				// Enregistrement des boutons
				GM_setValue('c_btn', c_btn);
				GM_setValue('t_btn', t_btn);
				GM_setValue('p_btn', p_btn);
				// Enregistrement des variables
				GM_setValue('R_connectes', true);
				GM_setValue('R_topic', true);
				GM_setValue('R_post', true);

				GM_setValue('delay', 2000);
			}

			$('#plugin').append('<img width=100 height=100 src="https://image.noelshack.com/fichiers/2017/05/1485900804-jvrealtime.png"> \
                                 <h5>Configuration</h5>\
								 <input id="realtimeDelay" value="'+delay+'" placeholder="Valeur" style="width:67px;padding: 1px 2px;margin: 2px 0;box-sizing: border-box"> Delai de rafraîchissement en ms (plus le chiffre est petit, plus les forums se mettront à jour rapidement. <i style="color:red">Déconseillé de mettre une valeur inférieur à 2000.</i>)<br>\
                                 '+c_btn+' Nombre de connecté(s) en temps réél<br>\
								 '+t_btn+' Topics en temps réél<br>\
                                 '+p_btn+' Posts en temps réél\
								');
			$('#non-installer').remove();
			// Listeners si JVCpremium est activé
			$('#realtime_c').click(function() {
				if ( R_connectes ) {
					GM_setValue('R_connectes', false);
					//this.innerHTML = 'Désactiver';
					GM_setValue('c_btn', '<a style="'+buttonStyleActive+'" class="btn btn-default" id="realtime_c">Activer</a>');
					location.reload();
				} else {
					GM_setValue('R_connectes', true);
					//this.innerHTML = 'Activer';
					GM_setValue('c_btn', '<a style="'+buttonStyle+'" class="btn btn-default" id="realtime_c">Désactiver</a>');
					location.reload();
				}
			});
			$('#realtime_t').click(function() {
				if ( R_topic ) {
					GM_setValue('R_topic', false);
					//this.innerHTML = 'Désactiver';
					GM_setValue('t_btn', '<a style="'+buttonStyleActive+'" class="btn btn-default" id="realtime_t">Activer</a>');
					location.reload();
				} else {
					GM_setValue('R_topic', true);
					//this.innerHTML = 'Activer';
					GM_setValue('t_btn', '<a style="'+buttonStyle+'" class="btn btn-default" id="realtime_t">Désactiver</a>');
					location.reload();
				}
			});
			$('#realtime_p').click(function() {
				if ( R_post ) {
					GM_setValue('R_post', false);
					//this.innerHTML = 'Désactiver';
					GM_setValue('p_btn', '<a style="'+buttonStyleActive+'" class="btn btn-default" id="realtime_p">Activer</a>');
					location.reload();
				} else {
					GM_setValue('R_post', true);
					//this.innerHTML = 'Activer';
					GM_setValue('p_btn', '<a style="'+buttonStyle+'" class="btn btn-default" id="realtime_p">Désactiver</a>');
					location.reload();
				}
			});
			// delai
			$('#realtimeDelay').focusout(function() {
				GM_setValue('delay', this.value);
				logConsole('[JVRealtime] Valeur de delai : ' + this.value);
			});
			// Fin d'excution si JVCpremium
			GM_setValue('firstTime', false);
		} else {
			R_topic = true;
			R_post  = true;
			R_connectes = true;
			delay = 2000;
		}
		//alert(R_topic);
		//alert(R_post);
		//alert(R_connectes);
	}, 3000);

	var topic;
	function getNbConnectes() {
		topic = window.location.href;

		if ( R_connectes ) { b = document.getElementsByClassName('nb-connect-fofo')[0]; }
		if ( R_topic || R_post ) {

			if (listeSujet(document)) {
				c = document.getElementsByClassName('conteneur-topic-pagi')[0];
			} else {
				c = document.getElementsByClassName('conteneur-messages-pagi')[0];
				ci = document.getElementsByClassName('bloc-message-forum ');
			}

		}

		if ( b || c) {
			GM_xmlhttpRequest({
				method: "GET",
				url: topic,
				onload: function (response) {
					//console.log('JVRealtime : Requête terminée.');
					//logConsole('[JVRealtime] Requête terminée.');
					////////////////////////////////////////////////////
					var getData = document.createElement('div');
					getData.innerHTML = response.responseText;
					getData.style.display = "none";
					////////////////////////////////////////////////////
					if ( R_post || R_topic ) {

						if ( listeSujet(getData) ) {

							if ( R_topic ) {
								d = getData.querySelectorAll('.conteneur-topic-pagi')[0];
								if ( c.innerHTML == d.innerHTML ) {} else {
									c.innerHTML = d.innerHTML;
								}
							}

						} else {

							if ( R_post ) {
								d = getData.querySelectorAll('.conteneur-messages-pagi')[0];
								di = getData.querySelectorAll('.bloc-message-forum ');

								if (di.length > ci.length) {
									//console.log('JVRealtime : Nouveau(x) post(s) mis à jour.');
									logConsole('[JVRealtime] Nouveau(x) post(s) mis à jour.');
									/*
									for (var i=0; i<di.length; i++)
									{
										$(ci[i]).remove();
										$(c).prepend(di[i]);
									}
									*/
									//var form = document.getElementById('bloc-formulaire-forum'); // sauvegarde jvc premium
									//c.innerHTML = d.innerHTML;
									//$('#bloc-formulaire-forum.bloc-pagi-default.bloc-pre-pagi-forum bloc-outils-bottom').remove();
									$(di[di.length-1]).insertAfter('.bloc-message-forum:last');
									//if ( JVCpremiumPlugin ) { $('.conteneur-messages-pagi').replaceWith(form); } // remet jvc premium
								} else {
									//console.log('[JVRealtime] Aucuns nouveaux posts sur cette page.');
									//logConsole('[JVRealtime] Aucuns nouveaux posts sur cette page.');
								}
							}
						}

					}

					if ( R_connectes ) {
						var a = getData.querySelectorAll('.nb-connect-fofo')[0];
						b.innerHTML = a.innerHTML;
					}
				}
			});
		} else {
			// ne fait rien
		}
	}

	setTimeout(function() { setInterval(getNbConnectes, delay); }, 3000);
	// Fin d'execution du script
})();