NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name DBNA UserDistance // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description Shows the distance and an estimate travel time on the profile of a DBNA user // @author Daenny // @match https://mein.dbna.de/* // @grant none // @license MIT // ==/UserScript== DBNA = {}; DBNA.UserDistance = function () { var settings = { googleMapsApiKey: '', fromCity: '' }; var pageFunctions = { rating: insertDistanceOnRatingPage }; this.handleRequest = function (pageFullUrl) { //["http://mein.dbna.de/index.php?page=index", "mein", "index.php?page=index"] var pageUrlMatch = /https:\/\/([a-z]+).dbna.de\/(.*$)/.exec(pageFullUrl); var isDbnaUrl = pageUrlMatch !== null && pageUrlMatch.length == 3; if (!isDbnaUrl) return; var subdomain = pageUrlMatch[1]; var urlRessource = pageUrlMatch[2]; var pageNameMatch = /\.php\?page=([a-z]+)/.exec(urlRessource); var pageName = (pageNameMatch != null ? pageNameMatch[1] : null); if (pageName != null) { var pageFunctionKeys = Object.keys(pageFunctions); if ($.inArray(pageName, pageFunctionKeys) > -1) { doGlobalActionsOnAllHandledPages(function () { pageFunctions[pageName](); }); } } else { // Steckbrief if (urlRessource.startsWith('kurzsteckbrief.php')) { doGlobalActionsOnAllHandledPages(function () { insertDistanceOnProfilePage(); }); } } }; function doGlobalActionsOnAllHandledPages(onGlobalActionsDone) { var settingsAreLoaded = loadSettings(); if (!settingsAreLoaded) return; // Font Awesome laden loadCssFile('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'); // Google Maps Api var googleMapsScriptUrl = 'https://maps.googleapis.com/maps/api/js?key=' + settings.googleMapsApiKey + '&signed_in=true&libraries=places'; $.getScript(googleMapsScriptUrl, function () { onGlobalActionsDone(); }); } function googleMapsResponseToHtml(googleMapsResponseFirstElement) { var distanceText = googleMapsResponseFirstElement['distance']['text']; var durationText = googleMapsResponseFirstElement['duration']['text']; var color; var rawDistanceKm = parseInt(googleMapsResponseFirstElement['distance']['value']) / 1000; if (rawDistanceKm <= 50) color = 'green'; else if (rawDistanceKm > 50 && rawDistanceKm < 90) color = 'orange'; else color = 'red'; var distanceHtml = '<div><i class="fa fa-car" aria-hidden="true"></i> ' + distanceText + '</div>'; var durationHtml = '<div><i class="fa fa-clock-o" aria-hidden="true" style="margin-right: 6px;margin-left: 2px;"></i>' + durationText + '</div>'; return '<div style="color:' + color + ';font-weight:bold;font-style:normal;">' + distanceHtml + durationHtml + '</div>'; } function calculateDistanceAndDuration(fromCity, toCity, onDistanceCalculated, onError) { var service = new google.maps.DistanceMatrixService(); service.getDistanceMatrix({ origins: [fromCity], destinations: [toCity], travelMode: google.maps.TravelMode.DRIVING, unitSystem: google.maps.UnitSystem.METRIC, avoidHighways: false, avoidTolls: false }, function (response, status) { if (status == google.maps.DistanceMatrixStatus.OK && response.rows[0].elements[0].status != "ZERO_RESULTS") { var firstElement = response['rows'][0]['elements'][0]; onDistanceCalculated(firstElement); } else { onError(); } }); } function insertDistanceOnRatingPage() { showSettingsPage(); var lastVoteUserLocation = $('.cboxcard-text em').html(); calculateDistanceAndDuration(settings.fromCity, lastVoteUserLocation, function (googleMapsFirstElement) { var html = googleMapsResponseToHtml(googleMapsFirstElement); $('.cboxcard-text em').append(html); }); } function insertDistanceOnProfilePage() { var userLocationElement = $('.dbnatooltipp:not(#herzen)'); var userLocationString = userLocationElement.html(); calculateDistanceAndDuration(settings.fromCity, userLocationString, function (googleMapsFirstElement) { var html = googleMapsResponseToHtml(googleMapsFirstElement); userLocationElement.append(html); }); } function showSettingsPage() { if (settings.googleMapsApiKey.length > 0 && settings.fromCity.length > 0) return; loadCssFile('https://cdnjs.cloudflare.com/ajax/libs/vex-js/3.0.0/css/vex.min.css'); loadCssFile('https://cdnjs.cloudflare.com/ajax/libs/vex-js/3.0.0/css/vex-theme-os.min.css'); $.getScript('https://cdnjs.cloudflare.com/ajax/libs/vex-js/3.0.0/js/vex.combined.min.js', function () { vex.defaultOptions.className = 'vex-theme-os'; vex.dialog.open({ message: 'DBNA-Distance Einstellungen', input: [ '<input name="googleMapsApiKey" type="text" placeholder="Google Maps API Key" value="' + settings.googleMapsApiKey + '" required />', '<input name="fromCity" type="text" placeholder="Dein Wohnort (Startort)" value="' + settings.fromCity + '" required />' ].join(''), buttons: [ $.extend({}, vex.dialog.buttons.YES, { text: 'Speichern' }), $.extend({}, vex.dialog.buttons.NO, { text: 'Abbrechen' }) ], callback: function (data) { if (data) { settings.googleMapsApiKey = data.googleMapsApiKey; settings.fromCity = data.fromCity; saveSettings(); window.location.reload(); } } }); }); } function loadSettings() { var serializedSettings = localStorage.getItem('dbnaTampermonkeySettings'); var settingsArePresent = (serializedSettings !== null && serializedSettings.length > 0); if (settingsArePresent) { settings = JSON.parse(serializedSettings); } else { showSettingsPage(); } return settingsArePresent; } function saveSettings() { var serializedSettings = JSON.stringify(settings); localStorage.setItem('dbnaTampermonkeySettings', serializedSettings); } function loadCssFile(cssFilePath) { var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = cssFilePath; link.media = 'all'; head.appendChild(link); } }; (function () { 'use strict'; var userDistance = new DBNA.UserDistance(); userDistance.handleRequest(window.location.href); })();