// ==UserScript== // @name Popmundo chat // @name:tr Popmundo Sohbet // @namespace bheuv.dev // @version 1.2.5 // @description Adds instant public chat boxes to locales, cities, social clubs and the community page // @description:tr Mekanlara, şehirlere, sosyal kulüplere ve hoş geldiniz sayfasına anlık sohbet edebileceğiniz odalar ekler. // @author Ian Parsons (105997) // @match https://*.popmundo.com/* // @icon https://www.google.com/s2/favicons?domain=popmundo.com // @run-at document-end // @noframes // @downloadURL none // ==/UserScript== const version = '1.2'; const hostOrigin = "https://botmundo.bheuv.dev:3005"; (function() { 'use strict'; let parseCharacterData = function() { // This must be done to make the authenticated character known to the script try { if (window.location.href.indexOf('/ChooseCharacter') !== -1) { // The select character page discloses the character ids let content = document.getElementById('ppm-content'); let buttons = content.querySelectorAll('input[type="submit"]'); let characterMap = []; for (let i = 0, len = buttons.length; i < len; i++) { let id = buttons[i].parentNode.parentNode.querySelector("div.idHolder").innerText; let name = buttons[i].parentNode.parentNode.querySelector("h2 a").innerText; characterMap[i] = id + ':' + name; } // Store the data for use on other pages window.localStorage.setItem('characterMap', characterMap.join(',')); } else { let characterMap = window.localStorage.getItem('characterMap'); if (! characterMap) { // Character map is not available; cannot run the script throw new Error("Character map is unavailable!"); } // Charactermap will now be an array of characters with format [id:name] characterMap = characterMap.split(','); const dropdown = document.querySelector('#character-tools-character select'); const options = dropdown.querySelectorAll('option'); const names = []; const ids = []; // Split character map into a list of names and ids to make searching in the next step easier characterMap.forEach((character) => { const [id, name] = character.split(':'); names.push(name); ids.push(id); }); // Attempt to match each option in the dropdown menu to a name from the list of names and set the ID that matches that name's index for (let i = 0, len = options.length; i < len; i++) { const option = options[i]; const index = names.indexOf(option.innerText); if (index !== -1) { option.dataset.id = ids[index]; } } // Now find the authenticated character's id and attach it as data to the document body let selectedOption = dropdown.querySelector('option[selected]'); let selectedValue = selectedOption.dataset.id; if (selectedValue) { document.body.dataset.character_name = selectedOption.innerText; document.body.dataset.character_id = selectedValue; } else { throw "Failed to parse character data from character select box!"; } } } catch (e) { console.log("CharacterMap could not be found/built: " + e); console.log(e); } } if (! document.querySelector('body').dataset.character_id) { parseCharacterData(); } if (! document.querySelector('body').dataset.character_id) { // Fallback method if (document.location.href.endsWith('.popmundo.com/World/Popmundo.aspx/Character')) { const characterName = document.querySelector('div.charPresBox h2').innerText; const characterIdentifier = document.querySelector('.idHolder').innerText; window.localStorage.setItem('character_name', characterName); window.localStorage.setItem('character_id', characterIdentifier); } if (window.localStorage.getItem('character_id')) { document.body.dataset.character_id = window.localStorage.getItem('character_id'); document.body.dataset.character_name = window.localStorage.getItem('character_name'); } } const characterName = document.body.dataset.character_name; const characterIdentifier = document.body.dataset.character_id; const addStyle = function(style) { const styleEl = document.createElement('style'); styleEl.textContent = style; document.head.append(styleEl); } // Resize property doesn't work on iframes in firefox - this is a workaround addStyle(` .resizer { display:flex; margin:0; padding:0; resize:vertical; overflow:hidden } .resizer > .resized { flex-grow:1; margin:0; padding:0; border:0 } `); const createChatBox = function(resourceType, resourceIdentifier, characterIdentifier, characterName, mountCallback, chatTitle) { if (!chatTitle) { chatTitle = 'Botmundo Chat'; } const wrapper = document.createElement('div'); wrapper.classList.add('box'); wrapper.innerHTML = `