// ==UserScript== // @name Com'back // @namespace https://greasyfork.org/fr/scripts/17200-com-back // @version 2.1.10 // @description Ajoute un choix pour le type (écrit, audio, vidéo...) de message envoyé. // @author DarKobalt, Naugriim(♥), Solon, Harlinde // @match https://www.dreadcast.net/Main // @match https://www.dreadcast.eu/Main // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_listValues // @license http://creativecommons.org/licenses/by-nc-nd/4.0/ // @downloadURL none // ==/UserScript== //Un jour, j'aurai le courage pour un vrai refactoring. ;_; //********************************************** // PARAMETRAGE (EDITION A VOTRE PROPRE RISQUE, UTILISEZ PLUTÔT LE MENU D'OPTIONS!) //********************************************** //(A) Valeurs par défaut //====================== //Dictionnaire des paramètres let params = {}; //Icônes disponibles params.icons = { CLIP: "📎", ACKN: "📨", UPLD: "📤", DWLD: "🔃", FILE: "📄", PLAY: "▶️", WRIT: "📝", AUDI: "🔊", VIDE: "🎥", DECK: "💻", NORP: "✖", ININ: "【", INOU: "】", }; //Textes informatifs. params.infotexts = { CLIP: "Pièce jointe", ACKN: "Accusé de réception", UPLD: "Envoi de données en cours", DWLD: "Chargement en cours, veuillez patienter", FILE: "Fichier", PLAY: "Lecture", WRIT: "Message écrit", AUDI: "Message audio", VIDE: "Message vidéo", DECK: "Depuis un deck", NORP: "Message HRP", }; //Boutons disponibles : params.actionList = ['CLIP', 'ACKN', 'UPLD', 'DWLD', 'FILE', 'PLAY']; //Items de la liste déroulante : params.typeList = ['WRIT', 'AUDI', 'VIDE', 'DECK', 'NORP']; //Valeur fixée pour le menu déroulant params.list_defaultID = 'NONE'; //Choix entre valeur fixée ou dernière valeur pour le menu déroulant (true = valeur fixée, false = dernière valeur choisie) params.b_alwaysDefault = false; //Dernière valeur choisie params.list_lastID = params.list_defaultID; //Nombre de boutons par face de carrousel params.carousel_facesize = 6; //Nombre d'items "utilisateur" params.user_typeList = []; params.user_itemsNumber = 5; //maximum for (let i = 0; i < params.user_itemsNumber; i++) { let user_item = "list_userItem_" + i.toString(); params.user_typeList.push(user_item); } //Nombre de boutons "utilisateur" params.user_actionList = []; params.user_actionsNumber = 6; //maximum for (let i = 0; i < params.user_actionsNumber; i++) { let user_action = "list_userAction_" + i.toString(); params.user_actionList.push(user_action); } //Couleur du texte placé entre "*". params.emoteColor = "#58dcf9"; //(B) Sauvegarde des paramètres par défaut //======================================== let default_params = $.extend(true, {}, params); //copie profonde //(C) Récupération locale de paramètres //================================= //Valeur fixée pour le menu déroulant if (GM_getValue("list_defaultID") !== undefined) { params.list_defaultID = GM_getValue("list_defaultID"); } //Choix entre valeur fixée ou dernière valeur pour le menu déroulant if (GM_getValue("b_alwaysDefault") !== undefined) { params.b_alwaysDefault = GM_getValue("b_alwaysDefault"); } //Dernière valeur choisie dans le menu déroulant if (GM_getValue("list_lastID") !== undefined) { params.list_lastID = GM_getValue("list_lastID"); } //Items "utilisateur" for (let i = 0; i < params.user_itemsNumber; i++) { let user_item = params.user_typeList[i]; if (GM_getValue(user_item) !== undefined) { //l'user_item existe en mémoire let user_item_icon = user_item + '_icon'; let user_item_text = user_item + '_text'; if (GM_getValue(user_item_icon) !== undefined) { //récupération de l'icône params.icons[user_item] = GM_getValue(user_item_icon); } if (GM_getValue(user_item_text) !== undefined) { //récupération du texte params.infotexts[user_item] = GM_getValue(user_item_text); } //Ajout aux types de messages params.typeList.push(user_item); } } //Boutons "utilisateur" for (let i = 0; i < params.user_actionsNumber; i++) { let user_action = params.user_actionList[i]; if (GM_getValue(user_action) !== undefined) { //l'user_action existe en mémoire let user_action_icon = user_action + '_icon'; let user_action_text = user_action + '_text'; if (GM_getValue(user_action_icon) !== undefined) { //récupération de l'icône params.icons[user_action] = GM_getValue(user_action_icon); } if (GM_getValue(user_action_text) !== undefined) { //récupération du texte params.infotexts[user_action] = GM_getValue(user_action_text); } //Ajout aux types d'actions params.actionList.push(user_action); } } //Nombre de faces de carrousel à créer params.carousel_facesnumber = carouselFacesNumber(); //Couleur du texte placé entre "*". if (GM_getValue("emoteColor") !== undefined) { params.emoteColor = GM_getValue("emoteColor"); } //********************************************** //FIN PARAMETRAGE //********************************************** //********************************************** //INTERFACE DE CONFIGURATION UTILISATEUR //********************************************** let $databox = $('#zone_dataBox'); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Constructeur de fenêtre de configuration //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ let DCCB_ConfigurationWindow = function () { let window_width = '560px'; let window_height = '450px'; let $config_window = $('
'); $config_window.draggable(); $config_window.addClass('dataBox focused ui-draggable'); $config_window.css({ width: window_width, "margin-left": '-185px', display: 'block', position: 'absolute', "z-index": '2', }); for (let i = 1; i <= 8; i++) { $('
').appendTo($config_window); } let $config_head = $('
').appendTo($config_window); $('').appendTo($config_head); $('').appendTo($config_head); $('
Configuration DC Com\'Back
').appendTo($config_head); $('
').appendTo($config_window); let $config_content = $('
').appendTo($config_window); //---------------------------------------- //Widgets internes //---------------------------------------- let $config_interface = $('
').appendTo($config_content); $config_interface.css({ "margin-left": '3px', "font-variant": 'small-caps', color: '#fff', height: '100%', width: '98%', }); //---------------------------------------- //Bandeau incitant à fermer les messages ouverts //---------------------------------------- let $warning_banner = $('
').appendTo($config_interface); $warning_banner.text("ATTENTION : Veillez à ne pas modifier les paramètres de Com'Back si des messages sont actuellement ouverts."); $warning_banner.css({ color: '#f10a18', "text-align": 'center', magin: '20px 0', border: '1px solid #f10a18' }); //---------------------------------------- //Configuration de l'interpréation du contenu des messages //---------------------------------------- let $bodyconfig = $('
').appendTo($config_interface); let $bodyconfig_title = $('

').appendTo($bodyconfig); $bodyconfig_title.text('Corps de message'); $bodyconfig_title.css({ "margin-bottom": '5px', "border-bottom": '1px solid', display: 'block', "font-size": '17px', "-webkit-margin-before": '0.83em', "-webkit-margin-after": '0.83em', "-webkit-margin-start": '0px', "-webkit-margin-end": '0px', "font-weight": 'bold', position: 'relative', }); let $bodyconfig_emote_color = $('
').appendTo($bodyconfig); $bodyconfig_emote_color.text('Couleur d\'emote (texte entre *...*) : '); $bodyconfig_emote_color.css({ display: 'inline-block', }); let $bodyconfig_emote_color_picker = $('').appendTo($bodyconfig_emote_color); $bodyconfig_emote_color_picker.val(params.emoteColor); $bodyconfig_emote_color_picker.css({ border: '0px', width: "150px", }); $bodyconfig_emote_color_picker.on('input', function () { let color = $(this).val(); params.emoteColor = color; GM_setValue("emoteColor", color); }); //---------------------------------------- //Configuration du menu déroulant //---------------------------------------- let $listconfig_title = $('

').appendTo($config_interface); $listconfig_title.text('Types de message personalisés (menu déroulant)'); $listconfig_title.css({ "margin-bottom": '5px', "border-bottom": '1px solid', display: 'block', "font-size": '17px', "-webkit-margin-before": '0.83em', "-webkit-margin-after": '0.83em', "-webkit-margin-start": '0px', "-webkit-margin-end": '0px', "font-weight": 'bold', }); //Choix de la valeur par défaut à l'ouverture d'un message ou d'un fil de discussion let $listconfig_default = $('
').appendTo($config_interface); $listconfig_default.text('Valeur par défaut : '); $listconfig_default.css({ display: 'inline-block', "margin-bottom": '15px', }); //Bouton-radio du choix "Dernière valeur utilisée" let $listconfig_default_lastone = $('Dernière utilisée').appendTo($listconfig_default); $listconfig_default_lastone.css({ margin: '0 5px', }); $listconfig_default_lastone.attr('checked', !params.b_alwaysDefault); //Bouton-radio du choix "Valeur par défaut fixée" let $listconfig_default_value = $('Toujours :').appendTo($listconfig_default); $listconfig_default_value.css({ margin: '0px 5px 0 25px', "padding-left": '20px', }); $listconfig_default_value.attr('checked', params.b_alwaysDefault); //Menu déroulant activé si besoin d'un valeur par défaut fixée let $listconfig_default_picker = $(''); cell.children().first().focus(); cell.children().first().keypress(function (e) { if (e.which == 13) { //Touche entrée appuyée let new_value = cell.find('input').val(); cell.text(new_value); if (new_value !== init_value) { //la nouvelle valeur est différente de l'ancienne return cb(new_value); } else { //pas de changement de valeur return cb(false); } } }); //Le champ d'édition n'a plus le focus = un clic a été donné sur un autre élément cell.children().first().blur(function () { cell.text(init_value); return cb(false); }); } //Formatage des liens et des contenus de message function format_liens(html) { //URLs starting with http://, https://, or ftp:// let replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&#\/%?=~_|!:,.;]*[-A-Z0-9+&#\/%=~_|])/gim; html = html.replace(replacePattern1, '$1'); //URLs starting with "www." (without // before it, or it'd re-link the ones done above). let replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim; html = html.replace(replacePattern2, '$1$2'); html = html.replace(/(<\/a>)|(
<\/a>)/gim, '<\/a>
'); //Problème des liens www dont la fin peut être tronquée avec une balise
html = html.replace(/(\" target)|(
\" target)/gim, '" target'); //Pareil, correction dans le href /*HARLINDE COURTESY*/ //Ta mère youtube html = html.replace(/[\S]+<\/a>/gim, '
'); //Transforme les liens de son en son... html = html.replace(/[\S]+<\/a>/gim, '
'); //Transforme les liens d'images en images cliquables html = html.replace(/[\S]+<\/a>/gim, '
<\/a>
'); //Tranforme le texte entre * en italique html = html.replace(/\*([^\*]+)\*/gim, '$1'); return html; } //********************************************** // FIN FONCTIONS UTILITAIRES //********************************************** //********************************************** // FONCTIONS DES INTERFACES MESSAGES //********************************************** //Pour un nouveau message function mainf() { var old_id = "#db_new_message"; var $databox = $(old_id); var new_id = 'db_message_' + new Date().getTime().toString(); $databox.attr('id', new_id); var db_id = '#'+new_id; var class_name = ".message_nouveau"; var toContent = db_id + " > relative > div.content"; var $msg_content = $(toContent); var $msg_textarea = $(toContent + " > " + class_name + " > #nm_texte > textarea"); //Edition du bouton pour réduire la fenêtre afin de corriger le onclick en chemin relatif jQuery //Ainsi que du double clic sur le titre de la fenêtre qui a le même effet $(db_id + " > relative > .head").attr("ondblclick", "").dblclick(function(){ $(this).parent().toggleClass('reduced'); }); $(db_id + " > relative > .head > .info1.link.reduce").attr("onclick", "").click(function(){ $(this).parent().parent().toggleClass('reduced'); }); //Menu déroulant //********************* //Création du conteneur var $types_div = $('
').appendTo($msg_content); $types_div.css({ "z-index": '999999', position: 'absolute', top: '3px', left: '37px', "background-color": '#ACABAB', }); //Création de la liste var $types_selection = $('').appendTo($types_div); $types_selection.addClass('listeTypesfc'); $types_selection.css({ //TODO : vérifier que ellipsis fonctionne height: '27px', color: '#397d94', display: 'block', width: '250px', "white-space": 'nowrap', overflow: 'hidden', "text-overflow": 'ellipsis', "-o-text-overflow": 'ellipsis', "-ms-text-overflow": 'ellipsis', "-web-text-overflow": 'ellipsis', "font-family": 'Arial,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif', }); $types_selection.change(function () { let type_id = $(this).val(); //Changement de dernier item choisi params.list_lastID = type_id; //Ajout d'une infobulle if (type_id !== 'NONE') { $(this).attr('title', makeBanner(0, type_id, 0, false)); } else { $(this).attr('title', ""); } //Sauvegarde locale GM_setValue("list_lastID", type_id); }); //Ajout d'un élément neutre $types_selection.append(''); //Ajout des éléments en fonction de 'typeList' for (let i = 0; i < params.typeList.length; i++) { let $option = $('