// ==UserScript== // @name Forenputze // @description Applies changes to the user interface of The-West's XenForo forum including design changes, addition of useful links like "Forum read"-buttons and other features. // @namespace fktext.bplaced.net/forenputze // @include http*://forum.the-west.*/* // @include http*://forum.beta.the-west.*/* // @version 1.47 // @grant none // @author stayawayknight // @author WojcieszyPL (Polish translation) // @downloadURL none // ==/UserScript== //************************************ // Great thanks to WojcieszyPL (@.the-west.pl) for translating the script into Polish! //************************************ //Add new JS source function contentEval(source) { if ('function' == typeof source) { source = '(' + source + ')();'; } var script = document.createElement('script'); script.setAttribute('type', 'application/javascript'); script.textContent = source; document.body.appendChild(script); document.body.removeChild(script); } Forenputze = function () { Forenputze = { initialized: false }; //************************************ //General settings Forenputze.name = 'Forenputze'; Forenputze.version = '1.47'; Forenputze.lang = 'net'; Forenputze.updateURL = 'https://greasyfork.org/scripts/22679-forenputze/code/Forenputze.user.js'; Forenputze.updateCheckURL = 'https://greasyfork.org/de/scripts/22679-forenputze'; Forenputze.updateStorageKey = 'forenputze_last_check'; Forenputze.conversationsStorageKey = 'forenputze_conversations'; Forenputze.collapseStorageKey = 'forenputze_collapse'; Forenputze.checkUpdateIntervall = 60 * 60 * 1000; Forenputze.collapseCookieExpireDays = 365; Forenputze.collapseCookieName = 'xf_express'; Forenputze.mainPage = 'index.php'; Forenputze.dzikiLink = 'https://dzikitw.wordpress.com/'; //************************************ //************************************ //Language Forenputze.langs = { de: { read: 'Gelesen markieren', markAllRead: 'Alle Foren als gelesen markieren', gameLogin: 'Login im Spiel', login: 'Login', registration: 'Registrieren', conversations: 'Unterhaltungen', settings: 'Grundeinstellungen', logout: 'Logout', scrollUp: 'Nach oben springen', goToLastPost: 'Zum letzten Beitrag gehen', registered: 'Registriert', askUpdate: 'Für das Benutzerskript "' + Forenputze.name + '" ist eine neuere Version verfügbar. Soll sie installiert werden?', confirmConversationCheck: 'Du hast neue ungelesene private Nachrichten. Soll die Unterhaltungsübersicht geöffnet werden?', dziki: 'DzikiTW', collapse: 'Zuklappen', expand: 'Aufklappen', forum: 'Forum' }, net: { read: 'Mark as read', markAllRead: 'Mark all forums as read', gameLogin: 'Login into the game', login: 'Login', registration: 'Register', conversations: 'Conversations', settings: 'Basic settings', logout: 'Logout', scrollUp: 'Back to top', goToLastPost: 'Go to last post', registered: 'Registered', askUpdate: 'A new version of the userscript "' + Forenputze.name + '" is available. Do you want to install it?', confirmConversationCheck: 'You have new unread private messages. Do you want to open the conversation overview?', dziki: 'DzikiTW', collapse: 'Collapse', expand: 'Expand', forum: 'Forum' }, pl: { read: 'Oznacz jako przeczytane', markAllRead: 'Oznacz wszystkie fora jako przeczytane', gameLogin: 'Zaloguj się do gry', login: 'Zaloguj się', registration: 'Rejestracja', conversations: 'Prywatne wiadomości', settings: 'Podstawowe ustawienia', logout: 'Wyloguj się', scrollUp: 'Powrót do góry', goToLastPost: 'Idź do ostatniego postu', registered: 'Zarejestrowany', askUpdate: 'Nowa wersja skryptu "' + Forenputze.name + '" jest dostępna. Czy chcesz go zaktualizować?', confirmConversationCheck: 'Masz nową prywatną wiadomość. Chcesz otworzyć podgląd rozmowy?', dziki: 'DzikiTW', collapse: 'Zwiń', expand: 'Rozwiń', forum: 'Forum' } }; //************************************ //************************************ //Main function, runs the other functions Forenputze.run = function () { Forenputze.resolveLang(); Forenputze.checkUpdate(); Forenputze.changeHomeLinks(); Forenputze.addLinks(); Forenputze.formatLogo(); Forenputze.addPageUp(); Forenputze.removeShareSections(); Forenputze.changeReadIconColor(); Forenputze.highlightLastPost(); Forenputze.addLastPostButton(); Forenputze.addForumReadButton(); Forenputze.setCollapseCookieTime(); Forenputze.addForumCollapse(); Forenputze.formatPosts(); Forenputze.changeDesign(); Forenputze.checkConversations(); }; //************************************ //************************************ Forenputze.resolveLang = function () { var tld = getTLD(); if (Forenputze.langs[tld]) { Forenputze.lang = tld; } }; //Update check Forenputze.checkUpdate = function () { //Check whether it is time for an update check or not (to avoid long loading times) if (localStorage.getItem(Forenputze.updateStorageKey)) { var lastTime = localStorage.getItem(Forenputze.updateStorageKey); var curTime = Date.now() + ''; //Compare if ((curTime - lastTime) < Forenputze.checkUpdateIntervall) { //No update check necessary return; } } //Update last check time in local storage localStorage.setItem(Forenputze.updateStorageKey, Date.now() + ''); $.get(Forenputze.updateCheckURL, function (data, textStatus, jqxhr) { //Check for success if ((jqxhr.status != 200) || (textStatus != 'success')) { console.log('Forenputze: Cannot check for update; Status: ' + jqxhr.status); return; } var versionContainer = $(data).find('dd.script-show-version').find('span'); //Version on remote server found? if (!versionContainer.exists()) { console.log('Forenputze: Cannot get remote version.') return; } //Get remote version from container var versionRemote = versionContainer.text(); //Compare remote and own version if (versionRemote > Forenputze.version) { //Update possible var choice = confirm(Forenputze.langs[Forenputze.lang].askUpdate); //Perform update if (choice) { window.location = Forenputze.updateURL; } } }); }; //************************************ //Functions to adjust the forum ui //Change links that lead to TW to forum links Forenputze.changeHomeLinks = function () { //Logo: $('#logo').find('a').attr('href', Forenputze.mainPage); //Home: $('.homeCrumb').find('a').attr('href', Forenputze.mainPage); //Navigation: $('.navTab.home.PopupClosed').find('a').attr('href', Forenputze.mainPage); }; //Adds a logout button to the Quick link list Forenputze.addLinks = function () { //Get quick links bar: var quickLinksBar = $('.quickLinksBar'); //Add link to DzikiTW for PL players if (Forenputze.lang == 'pl') { var dzikiMenu = $('
  • '); dzikiMenu.append('
  • ' + Forenputze.langs[Forenputze.lang].dziki + '
  • ') quickLinksBar.append(dzikiMenu); } //Check whether logged in if (!isLoggedIn()) { //Extend menu for guests var registerLink = $('#adm_right2.navTab.login').find('a').attr('href'); var ownMenu = $(''); ownMenu.append($('
  • ' + Forenputze.langs[Forenputze.lang].login + '
  • ')); ownMenu.append($('
  • ' + Forenputze.langs[Forenputze.lang].registration + '
  • ')); quickLinksBar.append(ownMenu); return; } //When cookie set, add game login link if (getCookie('ig_conv_last_site') != '') { var gameLogin = $('
  • ' + Forenputze.langs[Forenputze.lang].gameLogin + '
  • '); quickLinksBar.find('.section').find('ul').prepend(gameLogin); } //Extend menu for users //Create own menu section var ownMenu = $('
  • '); //Create forum link to mark all forums als read var forumReadLink = $('' + Forenputze.langs[Forenputze.lang].markAllRead + ''); forumReadLink.click(function () { //Send ajax request to mark all forums as read XenForo.ajax('index.php?forums/-/mark-read', { '_xfConfirm': 1 }, function (data) { //Redirect needed? if (data._redirectStatus == 'ok') { //Redirect/reload page location.href = data._redirectTarget; } }); }); ownMenu.append($('
  • ').append(forumReadLink)); ownMenu.append($('
  • ' + Forenputze.langs[Forenputze.lang].conversations + '
  • ')); ownMenu.append($('
  • ' + Forenputze.langs[Forenputze.lang].settings + '
  • ')); ownMenu.append($('
  • ' + Forenputze.langs[Forenputze.lang].logout + '
  • ')); quickLinksBar.append(ownMenu); }; //Resize main logo Forenputze.formatLogo = function () { $('#header').css('background', 'rgba(0,0,0,0) url("styles/west_mx/xenforo/headbg.png") no-repeat scroll center top'); $('#header').css('background-size', '100%'); $('#header').css('height', '250px'); $('#headerProxy').css('height', '255px'); }; //Add a page up button to the lower bar of the page Forenputze.addPageUp = function () { //Wait till everything is loaded var container = $('.breadBoxBottom').find('fieldset.breadcrumb'); var pageUpButton = $(''); //Set CSS properties pageUpButton.css('cursor', 'pointer'); pageUpButton.css('color', '#371902'); pageUpButton.css('display', 'block'); pageUpButton.css('float', 'right'); pageUpButton.css('font-size', '18px'); pageUpButton.css('height', '24px'); pageUpButton.css('line-height', '24px'); pageUpButton.css('margin-right', '5px'); //Add class for recognition pageUpButton.addClass('page-up-button'); //Add click listener pageUpButton.click(function () { window.scrollTo(0, 0); }); if (container.find('.sidebarCollapse').exists()) { container.find('.sidebarCollapse').after(pageUpButton); } else { container.find('.OverlayTrigger.jumpMenuTrigger').after(pageUpButton); } }; //Removes the share section above each thread Forenputze.removeShareSections = function () { //Overall share section with facebook and twitter $('.sharePage').remove(); //Follow us section on the right hand side $('.userList:first div.primaryContent').parent().remove(); //**Thanks to stewue (@forum.the-west.de)** }; //Saturate the non-read forum icons to create a bigger difference betweeen read and unread elements Forenputze.changeReadIconColor = function () { var icons = $('.nodeInfo').not('.unread, .linkNodeInfo').find('span.nodeIcon'); //Usual: icons.css('filter', 'saturate(20%)'); //Chrome, Opera, Safari: icons.css('-webkit-filter', 'saturate(20%)'); }; //Make the "Latest" text bold Forenputze.highlightLastPost = function () { $('.lastThreadTitle').find('span').css('font-weight', 'bold'); }; //Add a "mark read" button to each forum Forenputze.addForumReadButton = function () { //Check whehther logged in if (!isLoggedIn()) { return; } $('.nodeInfo.forumNodeInfo.primaryContent.unread').each(function (i, obj) { //Get link and add mark-read option var link = $(this).find('.nodeTitle').find('a').attr('href'); link += '-/mark-read'; //Add link near topic $(this).find('.nodeTitle').append(' ').append($('[' + Forenputze.langs[Forenputze.lang].read + ']')); //Add link to forum icon $(this).find('span.nodeIcon').wrap($('')); }); }; //Add a "go to last post" button to each thread in the overview Forenputze.addLastPostButton = function () { $('.discussionListItem').each(function (index, obj) { //Get latest post link var link = $(this).find('.listBlock.lastPost').find('.muted').find('a').attr('href'); if ((typeof link === 'undefined') || !isLoggedIn()) { return; } //Add button $(this).find('.title').append(' ').append($('')); }); }; //Adds onclick listeners to the category collapse buttons that ensure that the remembering cookie lasts one year and do not expire with the session Forenputze.setCollapseCookieTime = function () { //Function for persisting the cookie persist = function () { setCookie(Forenputze.collapseCookieName, getCookie(Forenputze.collapseCookieName), Forenputze.collapseCookieExpireDays); }; //Add onclick listeners to persist the cookie always when a category is clicked $('.CatTrigger').click(function () { persist(); }); //Persist cookie for the first time if (getCookie(Forenputze.collapseCookieName) && getCookie(Forenputze.collapseCookieName) != '') { persist(); } }; //Implement collapse possibility for forums Forenputze.addForumCollapse = function () { //Functions to collapse and expand forums: //Collapses a forum with animation, given by the forum's DOM node collapseAnim = function (forum) { forum.children().first().slideUp(); forum.find('.collapsed_forum_header').show(); }; //Collapses a forum fastly without animation, given by the forum's DOM node collapse = function (forum) { forum.children().first().hide(); forum.find('.collapsed_forum_header').show(); }; //Expands a forum with animation, given by the forum's DOM node expandAnim = function (forum) { //Remove button header forum.children().first().slideDown(); forum.find('.collapsed_forum_header').hide(); }; //Begin of the executive part //Read forums that are saved as collapsed from the local storage und parse it var collapsedForums = localStorage.getItem(Forenputze.collapseStorageKey); if (collapsedForums != null) { collapsedForums = JSON.parse(collapsedForums); } $('.node.forum.level_2').each(function () { var node_id = $(this).attr('class').match(/node_(\d+)/) [1]; //Create collapse button var button_collapse = $(''); //Styles button_collapse.css('width', '9px'); button_collapse.css('height', '9px'); button_collapse.css('padding', '3px'); button_collapse.css('font-size', '12px'); button_collapse.css('border-radius', '50%'); button_collapse.css('color', '#ffeecc'); button_collapse.css('background-color', '#371902'); button_collapse.css('margin-left', '8px'); button_collapse.css('cursor', 'pointer'); //Add collapse functionality to the collapse button button_collapse.click({ forum: $(this), id: node_id }, function (event) { collapseAnim(event.data.forum); var stored = localStorage.getItem(Forenputze.collapseStorageKey); if (stored == null) { stored = { }; } else { stored = JSON.parse(stored); } stored[event.data.id] = true; localStorage.setItem(Forenputze.collapseStorageKey, JSON.stringify(stored)); }); $(this).find('.nodeTitle').append(button_collapse); //Add forum header for collapsed forum and expand button var forumTitle = $(this).find('.nodeTitle').children().first().text(); var unread = $(this).children().first().hasClass('unread'); //Exact match with sheriff icon: margin-left: 55px var forumHeader = $(''); //Add forum title to the header and make it bold when unread if (unread) { forumHeader.append($('' + Forenputze.langs[Forenputze.lang].forum + ': ' + forumTitle + '')); } else { forumHeader.append($('' + Forenputze.langs[Forenputze.lang].forum + ': ' + forumTitle + '')); } //Create expand button var button_expand = $(''); //Styles button_expand.css('width', '9px'); button_expand.css('height', '9px'); button_expand.css('padding', '3px'); button_expand.css('font-size', '12px'); button_expand.css('border-radius', '50%'); button_expand.css('color', '#ffeecc'); button_expand.css('background-color', '#371902'); button_expand.css('margin-left', '5px'); button_expand.css('cursor', 'pointer'); //Add expand functionality to the expand button button_expand.click({ forum: $(this), id: node_id }, function (event) { expandAnim(event.data.forum); var stored = localStorage.getItem(Forenputze.collapseStorageKey); if (stored == null) { return; } stored = JSON.parse(stored); delete stored[event.data.id]; localStorage.setItem(Forenputze.collapseStorageKey, JSON.stringify(stored)); }); forumHeader.append(button_expand); //Hide collapse header by default forumHeader.hide(); //Append forum header to the ui $(this).append(forumHeader); //Are there collapsed forums and is the current forum saved as collapsed? if ((collapsedForums != null) && collapsedForums[node_id]) { //Collapse forum in UI collapse($(this)); } }); }; //Formats the posts so that they become smaller Forenputze.formatPosts = function () { //Replace long usernames with ellipsis $('.username').each(function () { $(this).attr('title', $(this).text()); $(this).css('text-overflow', 'ellipsis').css('white-space', 'nowrap'); }); //Increase the width of user profile section every post a little bit $('.messageUserInfo').css('padding-left', '5px').css('width', '160px'); //Removes the "agreement" section in user profiles in posts var userInfo = $('.extraUserInfo'); userInfo.each(function () { $(this).find('.pairsJustified').eq(0).find('dt').text(Forenputze.langs[Forenputze.lang].registered + ':'); $(this).find('.pairsJustified').eq(2).remove(); }); //Format the pairs in the user vocabulary for better readability var pairs = userInfo.find('.pairsJustified'); pairs.css('font-size', '12px'); pairs.find('dt').css('font-weight', 100).css('text-transform', 'none'); pairs.find('dd').css('text-transform', 'none'); }; //Do same changes to the design, including a change of the background Forenputze.changeDesign = function () { //Wooden background $('body').css('background-image', 'url(https://westdes.innogamescdn.com/images/interface/wood_texture_dark.jpg)'); //Remove footer color $('footer').find('.footer').find('.pageContent').css('background-color', 'rgba(0, 0, 0, 0.0)'); //Wooden moderator bar $('#moderatorBar').css('background-image', 'url(https://westdes.innogamescdn.com/images/interface/wood_texture_dark.jpg)'); //Moderator items color $('.modLink').css('background-color', '#ffeecc'); //Searchbar $('').appendTo('head'); //Forum content texture $('#content').find('.pageContent').css('background-image', 'url(https://westdes.innogamescdn.com/images/window/forum/external_bg.jpg)'); //Rounded corners $('#content').find('.pageContent').css('border-radius', '10px'); //Message background $('').appendTo('head'); //Rounded corners in message user block $('.messageUserBlock ').css('border-radius', '20px'); //Let buttons look like west buttons $('').appendTo('head'); //Change breadcrumb bars to western bars var breadcrumbs = $('.breadcrumb'); breadcrumbs.css('background-image', 'url("https://westdes.innogamescdn.com/images/tw2gui/window/window2_title.png?13")'); breadcrumbs.css('background-size', '100% 100%'); breadcrumbs.css('background-color', 'rgba(0,0,0,0)'); breadcrumbs.css('box-shadow', 'none'); breadcrumbs.css('border-radius', '0px'); breadcrumbs.css('padding-left', '15px'); breadcrumbs.css('padding-right', '15px'); //Change color of the text and arrow of the bar var crumbs = $('.crumb, .sidebarCollapse, .icon-room, .page-up-button'); crumbs.css('color', '#ffeecc'); crumbs.css('background-color', 'rgba(0,0,0,0)'); crumbs.css('border-bottom', 'none'); $('').appendTo('head'); }; Forenputze.checkConversations = function () { //Init local storage if (localStorage.getItem(Forenputze.conversationsStorageKey) == null) { localStorage.setItem(Forenputze.conversationsStorageKey, 0); } var numberConversations = parseInt($('#ConversationsMenu_Counter').find('span.Total').text()); var savedConversations = parseInt(localStorage.getItem(Forenputze.conversationsStorageKey)); //Alert neccessary? if (numberConversations > savedConversations) { localStorage.setItem(Forenputze.conversationsStorageKey, numberConversations); if (confirm(Forenputze.langs[Forenputze.lang].confirmConversationCheck)) { //Navigate location.href = 'index.php?conversations/'; } } localStorage.setItem(Forenputze.conversationsStorageKey, numberConversations); }; //Checks whether the user is logged (true) in or not (false) isLoggedIn = function () { return $('li#adm_right.navTab.login').size() < 1; }; //Returns the top level domain of the current site getTLD = function () { var tld = window.location.hostname; tld = tld.split('.'); pos = tld.length - 1; return tld[pos]; }; //Reads a cookie getCookie = function (c_name) { if (document.cookie.length > 0) { c_start = document.cookie.indexOf(c_name + '='); if (c_start != - 1) { c_start = c_start + c_name.length + 1; c_end = document.cookie.indexOf(';', c_start); if (c_end == - 1) { c_end = document.cookie.length; } return unescape(document.cookie.substring(c_start, c_end)); } } return ''; }; //Sets a cookie with name, value and days setCookie = function (name, value, days) { var expires; if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = '; expires=' + date.toUTCString(); } else { expires = ''; } document.cookie = name + '=' + value + expires + '; path=/'; }; //Query extension to check whether a exception is empty or not $.fn.exists = function () { return this.length !== 0; }; //Run main function Forenputze.run(); //Let XenForo crawl the overlays $('body').xfActivate(); }; $(document).ready(function () { contentEval(Forenputze); });