NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name PvPRO scripts // @namespace https://github.com/antimYT/ // @version 2.00 // @license MIT // @icon https://www.pvpro.com/img/favicon.ico // @updateURL https://openuserjs.org/meta/antimYT/PvPRO_scripts.meta.js // @downloadURL https://openuserjs.org/install/antimYT/PvPRO_scripts.user.js // @copyright 2020, antimYT (https://openuserjs.org/users/antimYT) // @description PvPRO scripts // @author /antim/ // @match https://www.pvpro.com/* // @grant unsafeWindow // @grant GM.info // @grant GM_setValue // @grant GM_getValue // @grant none // @require https://gist.githubusercontent.com/arantius/3123124/raw/grant-none-shim.js // ==/UserScript== // ==Changelog== // // v1.96 -> v2.00: // - reworked everything // // ==/Changelog== function timeSince(date) { var seconds = Math.abs(Math.floor((new Date() - date) / 1000)); var years = Math.floor(seconds / 31536000); var months = Math.floor(seconds / 2592000); var days = Math.floor(seconds / 86400); var hours = Math.floor(seconds / 3600); var minutes = Math.floor(seconds / 60); if (months >= 12) return years + "yrs"; if (days > 30) return months + "months"; if (hours >= 24) return days + "d"; if (minutes >= 60) return hours + "hrs"; if (seconds >= 60) return minutes + "min"; return Math.floor(seconds) + " seconds"; } function filterTournaments(tournaments_box, modename, dontfilter){ var tours = tournaments_box.find('.grid-competitions-items-row'); tours.each(function( index ) { if(dontfilter == true){ $( this ).css("display", ""); } else { if($(this).find('.mode').text() == modename) $( this ).css("display", ""); else $( this ).css("display", "none"); } }); } function GetMissionsHtmlForMainHeader(initialStateData){ var missions_html = ""; $.each( initialStateData.payload.promoQuests, function( index, value ){ //missions without 'scheduledFinishDate' are not real try{ if(value.project == initialStateData.payload.defaultSportProjects.CSGO && Date.now() < Date.parse(value.scheduledFinishDate)){ //show mission console.log(value); var challenge = initialStateData.payload.account.challengeRegistrations[value.id]; console.log(challenge); if(challenge != null && challenge.status == "FINISHED") return; //same as continue; var prizehtml = ""; if(value.prizeDistributionPolicy.prize.value.credits > 0) prizehtml = '<span class="currency"> — <img src="https://www.pvpro.com/img/pvpro_coin.png" width="15" class="coin mr-xs"><span>' + value.prizeDistributionPolicy.prize.value.credits + '</span></span>'; else if(value.prizeDistributionPolicy.prize.value.crystals > 0) prizehtml = '<span class="currency"> — <img src="https://www.pvpro.com/img/pvpro_crystal.png" width="15" class="crystal mr-xs"><span>' + value.prizeDistributionPolicy.prize.value.crystals + '</span></span>'; if(challenge != null) missions_html += '<div class="row mx-xs align-items-center" style="background-color:#008eff45;border-radius:16px;max-width:320px;height:50px"><div class="col-auto mr-20"><img src="' + value.imageUrl + '" style="height:45px;padding: 0.25em;"></div><div class="col"><div class="heading-wrapper px-sm"><div class="heading-labels"><h6 class="heading heading-6">' + value.performanceDescription + '</h6><div class="sub-heading sub-heading-6">' + challenge.score + prizehtml + '</div></div></div></div></div>'; else missions_html += '<div class="row mx-xs align-items-center" style="background-color:#008eff45;border-radius:16px;max-width:320px;height:50px"><div class="col-auto mr-20"><img src="' + value.imageUrl + '" style="height:45px;padding: 0.25em;"></div><div class="col"><div class="heading-wrapper px-sm"><div class="heading-labels"><h6 class="heading heading-6">' + value.performanceDescription + '*</h6><div class="sub-heading sub-heading-6">' + value.defaultPlayerScore + prizehtml + '</div></div></div></div></div>'; } }catch(ex){ console.log(ex); } }); return missions_html; } function GetLeaguesHtmlForMainHeader(initialStateData, elementAppendTo){ $.each( initialStateData.payload.account.challengeRegistrations, function( index, value ){ //missions without 'scheduledFinishDate' are not real try{ if(value.status == "ACTIVE" && value.parentId != null && parseFloat(value.score) > 0.0){ //show mission console.log(value); // $.ajax({ url: "https://webapi.pvpro.com/pvpro/challenge/details?challengeId=" + value.parentId + "§ion=details", dataType: 'json', xhrFields: { withCredentials: true }, success: function(data) { if(data.success == true){ //alert("Data: " + data + "\nStatus: " + status); console.log(data); elementAppendTo.append('<div class="row mx-xs align-items-center" onclick="window.location.href=\'https://www.pvpro.com/challenge/details/' + value.parentId + '?positionsChallengeId=' + value.challengeId + '§ion=results\'" style="background-color:#008eff45;border-radius:16px;max-width:320px;height:50px"><div class="col-auto mr-20"><img src="' + data.payload.imageUrl + '" style="height:45px;padding: 0.25em;"></div><div class="col"><div class="heading-wrapper px-sm"><div class="heading-labels"><h6 class="heading heading-6">' + data.payload.name + '</h6><div class="sub-heading sub-heading-6">Score: ' + value.score + '</div></div></div></div></div>'); //initialStateData=data; } } }); } }catch(ex){ console.log(ex); } }); } function onLoadFunc(){ var lastUrl = window.location.href; var initialStateData = null; $.ajax({ url: "https://webapi.pvpro.com/pvpro/app/loadInitialState", dataType: 'json', xhrFields: { withCredentials: true }, success: function(data) { if(data.success == true){ //alert("Data: " + data + "\nStatus: " + status); console.log(data); initialStateData=data; }else console.log('FAILED TO LOAD initialStateData'); } }); setInterval(function(){ if(initialStateData == null) return; var main_header = $(".main-header"); var tournaments_box = $(".Tournament > .grid-competitions"); var sidebar_profile = $(".sidebar-profile"); var accept_game_modal = $(".accept-game-modal"); //var main_header_logo = main_header.find('.header-logo>img'); var mini_profile_modal = $('div.modal-layout.mini-profile-modal'); var active_game_body = $('div.active-game-body'); var game_lobby_details = active_game_body.find('div.game-lobby-details'); var mini_profile = $('div.mini-profile'); // ============================= // url changed // ============================= if(lastUrl != window.location.href){ //url changed console.log(window.location.href); lastUrl = window.location.href; } // ============================= // tournaments page updated // ============================= if(tournaments_box.length > 0 && tournaments_box.hasClass("antim_class") == false){ tournaments_box.addClass("antim_class"); tournaments_box.prepend( '<div class="row flex-grow-1"><div class="col-auto d-flex flex-wrap align-items-center pr-gap"><div class="form-input-wrapper fill flex-grow-1"><div class="control-group flex-grow-1">' + '<button type="button" id="antim_tournaments_filterall" class="button radio dark antim_tournaments active">All</button>' + '<button type="button" id="antim_tournaments_filter1v1" class="button radio dark antim_tournaments">1v1</button>' + '<button type="button" id="antim_tournaments_filter2v2" class="button radio dark antim_tournaments">2v2</button>' + '<button type="button" id="antim_tournaments_filter3v3" class="button radio dark antim_tournaments">3v3</button>' + '<button type="button" id="antim_tournaments_filter5v5" class="button radio dark antim_tournaments">5v5</button>' + '</div></div></div></div>' ); $("#antim_tournaments_filterall").click(function() { $(".antim_tournaments").removeClass("active"); $(this).addClass("active"); filterTournaments(tournaments_box, "", true); }); $("#antim_tournaments_filter1v1").click(function() { $(".antim_tournaments").removeClass("active"); $(this).addClass("active"); filterTournaments(tournaments_box, "1v1", false); }); $("#antim_tournaments_filter2v2").click(function() { $(".antim_tournaments").removeClass("active"); $(this).addClass("active"); filterTournaments(tournaments_box, "2v2", false); }); $("#antim_tournaments_filter3v3").click(function() { $(".antim_tournaments").removeClass("active"); $(this).addClass("active"); filterTournaments(tournaments_box, "3v3", false); }); $("#antim_tournaments_filter5v5").click(function() { $(".antim_tournaments").removeClass("active"); $(this).addClass("active"); filterTournaments(tournaments_box, "5v5", false); }); } // ============================= // sidebar profile changed // ============================= if(false && sidebar_profile.length > 0 && sidebar_profile.hasClass("antim_class") == false){ sidebar_profile.addClass("antim_class"); console.log("sidebar-profile changed"); try{ var rank_progressbar = sidebar_profile.find('.progress-bar-filler'); var rank_percent = rank_progressbar[0].style.width; rank_percent = rank_percent.substr(0, rank_percent.length-1); var infoline = sidebar_profile.find('.justify-content-between'); infoline.append( '<span>(+0)</span>' ); console.log(infoline); }catch(ex){console.log(ex);} //sidebar_profile.prepend( '<div class="row flex-grow-1"><div class="col-auto d-flex flex-wrap align-items-center pr-gap"><div class="form-input-wrapper fill flex-grow-1"><div class="control-group flex-grow-1">' // + '<button type="button" id="antim_tournaments_filterall" class="button radio dark antim_tournaments active">All</button>' // + '<button type="button" id="antim_tournaments_filter1v1" class="button radio dark antim_tournaments">1v1</button>' // + '</div></div></div></div>' ); // $("#antim_tournaments_filterall").click(function() { // $(".antim_tournaments").removeClass("active"); // $(this).addClass("active"); // filterTournaments(tournaments_box, "", true); // }); } // ============================= // autoaccept // ============================= if(accept_game_modal.length > 0){ accept_game_modal.find("button.accept-game").click(); console.log("auto accepted!"); } // ============================= // main header changed // ============================= if(main_header.length > 0 && main_header.hasClass("antim_class") == false){ main_header.addClass("antim_class"); console.log("main header changed"); main_header.find('div.text-light').after('<div style="display: grid;height: 75%;padding: 0 1rem">' + '<button id="antim_header_showmissions" class="button fill sm ml-auto lightsweep success antim_header_button" style="font-size:0.9em;padding:0 1rem;width:100%;border-bottom-right-radius:0px;border-bottom-left-radius:0px;">Missions</button>' + '<button id="antim_header_showleagues" class="button fill sm ml-auto lightsweep antim_header_button" style="font-size:0.9em;padding:0 1rem;width:100%;border-top-right-radius:0px;border-top-left-radius:0px;">Leagues</button>' + '</div>' + '<div id="antim_header_missions" class="flex-grow-1 antim_header_tab" style="display: flex;align-items: center;">' + GetMissionsHtmlForMainHeader(initialStateData) + '</div>' + '<div id="antim_header_leagues" class="flex-grow-1 antim_header_tab" style="display: none;align-items: center;"></div>'); GetLeaguesHtmlForMainHeader(initialStateData, $('#antim_header_leagues')); $("#antim_header_showmissions").click(function() { $(".antim_header_button").removeClass("success"); $(this).addClass("success"); $(".antim_header_tab").css("display", "none"); $("#antim_header_missions").css("display", "flex"); }); $("#antim_header_showleagues").click(function() { $(".antim_header_button").removeClass("success"); $(this).addClass("success"); $(".antim_header_tab").css("display", "none"); $("#antim_header_leagues").css("display", "flex"); }); } // ============================= // replace logo // ============================= if(false && main_header_logo.length > 0 && main_header_logo.hasClass("antim_class") == false){ main_header_logo.addClass("antim_class"); console.log("logo changed"); main_header_logo.attr("src", "https://raw.githubusercontent.com/antimYT/antimYT.github.io/master/pvpro_content/pvpro_logo.gif"); main_header.find('.header-logo').css('width', '280px'); } // ============================= // mini profile modal changed/appeared // ============================= if(mini_profile_modal.length > 0 && mini_profile_modal.hasClass("antim_class") == false){ mini_profile_modal.addClass("antim_class"); console.log("mini profile modal changed"); var username = mini_profile_modal.find('h2.heading>span').text(); //additional info $.ajax({ url: "https://webapi.pvpro.com/pvpro/secured/community/profile/mini?playerToViewUsername=" + username + "&sport=CSGO", dataType: 'json', xhrFields: { withCredentials: true }, success: function(data) { if(data.success == true){ //console.log(data); var leaver = "?"; var noShower = "?"; var detected = "?"; var leaver2 = "?"; var noShower2 = "?"; var detected2 = "?"; var prime = "?"; try{ leaver = data.payload.player.actionProfile.stats.timesLeaver; }catch(ex){} try{ noShower = data.payload.player.actionProfile.stats.timesNoShower; }catch(ex){} try{ detected = data.payload.player.actionProfile.stats.numAcDetections; }catch(ex){} try{ leaver2 = data.payload.gameStats.stats.COMPETITIVE.timesLeaver; }catch(ex){} try{ noShower2 = data.payload.gameStats.stats.COMPETITIVE.timesNoShower; }catch(ex){} try{ detected2 = data.payload.gameStats.stats.COMPETITIVE.numAcDetections; }catch(ex){} try{ prime = data.payload.player.actionProfile.isPrimeAccount; }catch(ex){} mini_profile_modal.find('div.col-12.col-md-8.col-xl-9').append('<div class="bg-dark flex-grow-1 mt-sm d-flex flex-wrap align-items-center"><div class="table-grid grid-stats flex-grow-1"><table class="table"><tbody><tr class="grid-header grid-stats-header">' + '<td class="grid-header-item grid-stats-header-item text-center">Leaver</td>' + '<td class="grid-header-item grid-stats-header-item text-center">No shower</td>' + '<td class="grid-header-item grid-stats-header-item text-center">Detected (AC)</td>' + '<td class="grid-header-item grid-stats-header-item text-center">Prime</td>' + '</tr><tr class="grid-items-row grid-stats-items-row">' + '<td class="grid-item grid-stats-item text-center">' + leaver + ' (' + leaver2 + ')</td>' + '<td class="grid-item grid-stats-item text-center">' + noShower + ' (' + noShower2 + ')</td>' + '<td class="grid-item grid-stats-item text-center">' + detected + ' (' + detected2 + ')</td>' + '<td class="grid-item grid-stats-item text-center">' + prime + '</td>' + '</tr></tbody></table></div></div>'); } } }); //check for ban $.ajax({ url: "https://webapi.pvpro.com/pvpro/leaderboards/hallOfShame/list?searchUsername=" + username, dataType: 'json', xhrFields: { withCredentials: true }, success: function(data) { try{ var bannedPlayer = null; if(data.success == true && data.payload.data != null && data.payload.data.length > 0){ $.each( data.payload.data, function( index, value ){ if(Date.now() < Date.parse(value.ban.expirationDate) && value.username == username){ bannedPlayer = value; return false; //same as break; } }); } if(bannedPlayer == null){ mini_profile_modal.find('div.modal-layout-header').find('h2.heading').append(' — <span style="color: #2e7d32">not banned</span>'); } else { console.log(bannedPlayer); var reason = bannedPlayer.ban.reason; var expirationDate = "?"; var banDate = bannedPlayer.ban.banDate; var permanent = "?"; var until = ""; var bannedTimeAgo = " " + timeSince(Date.parse(banDate)) + " ago"; try{ expirationDate = bannedPlayer.ban.expirationDate; }catch(ex){} try{ permanent = bannedPlayer.ban.permanent; }catch(ex){} //Date.now() < Date.parse(value.scheduledFinishDate) if(permanent != true){ until = ", left " + timeSince(Date.parse(expirationDate)); } mini_profile_modal.find('div.modal-layout-header').find('h2.heading').append(' — <span style="color: #c62828">BANNED FOR ' + reason + bannedTimeAgo + until + '</span>'); } }catch(ex){ console.log(ex); } } }); } // ============================= // game_lobby_details (connect game details) changed/appeared // ============================= if(game_lobby_details.length > 0 && game_lobby_details.hasClass("antim_class") == false){ game_lobby_details.addClass("antim_class"); console.log("game_lobby_details changed"); var players = active_game_body.find('div.game-lobby-team-member'); if(false){ $.ajax({ url: "https://webapi.pvpro.com/pvpro/secured/community/profile/mini?playerToViewUsername=" + username + "&sport=CSGO", dataType: 'json', xhrFields: { withCredentials: true }, success: function(data) { if(data.success == true){ //console.log(data); var leaver = "?"; var noShower = "?"; var detected = "?"; var leaver2 = "?"; var noShower2 = "?"; var detected2 = "?"; var prime = "?"; try{ leaver = data.payload.player.actionProfile.stats.timesLeaver; }catch(ex){} try{ noShower = data.payload.player.actionProfile.stats.timesNoShower; }catch(ex){} try{ detected = data.payload.player.actionProfile.stats.numAcDetections; }catch(ex){} try{ leaver2 = data.payload.gameStats.stats.COMPETITIVE.timesLeaver; }catch(ex){} try{ noShower2 = data.payload.gameStats.stats.COMPETITIVE.timesNoShower; }catch(ex){} try{ detected2 = data.payload.gameStats.stats.COMPETITIVE.numAcDetections; }catch(ex){} try{ prime = data.payload.player.actionProfile.isPrimeAccount; }catch(ex){} mini_profile_modal.find('div.col-12.col-md-8.col-xl-9').append('<div class="bg-dark flex-grow-1 mt-sm d-flex flex-wrap align-items-center"><div class="table-grid grid-stats flex-grow-1"><table class="table"><tbody><tr class="grid-header grid-stats-header">' + '<td class="grid-header-item grid-stats-header-item text-center">Leaver</td>' + '<td class="grid-header-item grid-stats-header-item text-center">No shower</td>' + '<td class="grid-header-item grid-stats-header-item text-center">Detected (AC)</td>' + '<td class="grid-header-item grid-stats-header-item text-center">Prime</td>' + '</tr><tr class="grid-items-row grid-stats-items-row">' + '<td class="grid-item grid-stats-item text-center">' + leaver + ' (' + leaver2 + ')</td>' + '<td class="grid-item grid-stats-item text-center">' + noShower + ' (' + noShower2 + ')</td>' + '<td class="grid-item grid-stats-item text-center">' + detected + ' (' + detected2 + ')</td>' + '<td class="grid-item grid-stats-item text-center">' + prime + '</td>' + '</tr></tbody></table></div></div>'); } } }); } } // ============================= // profile: games tab, game line changed/appeared // TODO: ability to report players // ============================= if(false && lastUrl.indexOf("secured/account/profile/csgo/game/history") >= 0){ try{ var gamelines = $('div.acountPayments').find('table.table').find('tr.grid-items-row:not(.antim_class)'); if(gamelines.length > 0){ gamelines.addClass("antim_class"); gamelines.find('grid-list-item')[0].click = function(){ } console.log(gamelines); } } catch(ex) { console.log(ex); } } // ============================= // mini_profile changed // ============================= if(mini_profile.length > 0 && mini_profile.hasClass("antim_class") == false){ mini_profile.addClass("antim_class"); console.log("account_profile changed"); var profile_tickets = mini_profile.find('div.profile-tickets'); profile_tickets.find('img.ticket').each(function() { var ticketName = $(this).attr('title'); var ticket = null; $.each( initialStateData.payload.account.player.tickets, function( index, value ){ if(value.name != ticketName) return; ticket = value; }); if(ticket != null){ $(this).after('<span>x' + ticket.total + '</span>') } }); } // ============================= // ==== END // ============================= }, 500); } (function() { 'use strict'; //append jquery var script = document.createElement('script'); script.src = 'https://code.jquery.com/jquery-3.4.1.min.js'; script.type = 'text/javascript'; document.getElementsByTagName('head')[0].appendChild(script); //onload function var _scriptloaded = false; function _docload(){ setTimeout(function() { _docload(); }, 200); if(_scriptloaded == true){ return; } $( document ).ready(function() { onLoadFunc(); }); _scriptloaded = true; console.log("a-script loaded"); } setTimeout(function() { _docload(); }, 100); //DeleteAds(); })();