Greasy Fork is available in English.

[MR] Popmundo Utilities

Some gameplay improvements and shorcuts for popmundo.

// ==UserScript==
// @name         [MR] Popmundo Utilities
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  Some gameplay improvements and shorcuts for popmundo.
// @author       Serhat Yücel A.K.A Matt Revolve (1736266)
// @match        https://*.popmundo.com/*
// @require https://code.jquery.com/jquery-3.5.1.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js

// ==/UserScript==

(function() {
    'use strict';
    const url = window.location.href;
    const orig = window.location.origin;

    progressBarPercentages();
    controlPhoneCall();
    const blocked_char_list = ["3513487"];

    if(url.includes("/Locale/ItemsEquipment")){
        showHideOnlyYourItemsPrepare();
    }else if(url.includes("/Interact/Phone")) {
        //mobilePhoneCallAutoChosenCombo();
    }else if(url.includes("/Character/OfferItem")) {
        hideOfferedItem();
    }else if(url.includes("/City") && $("#ctl00_cphLeftColumn_ctl00_lnkAirport").length > 0) {
        addCityShortcuts();
    }else if(url.includes("/Character/Relations/") && $("#mnuToolTipImproveCharacter").length != 0) {
        //relationLinkToPhoneCall();
        makePhoneCalls();
    }else if(url.includes("/Character/Diary/")) {
        //countKilledZombies();
    }else if(url.includes("/Character/Items")) {
        inventoryUtility();
    }else if(url.includes("/Forum/Popmundo.aspx/Thread/")) {
        bbcodeGenerator();
    }

    function bbcodeGenerator() {
        $(".forumMessageHeader a:first-child").each(function() {
            const charName = $(this).text().trim();
            const charid = $(this).attr("href").split("/").slice(-1)[0].trim();
            $(this).before(`<img src="/Static/Icons/TinyHide_White.png" class="mr_bbcode" data="[charid=${charid} name=${charName}]">`);
            //$(this).before(`<img src="/Static/Icons/TinyHide_White.png" class="mr_bbcode" data="!sonuç ${charid}">`);
        });

        $(".mr_bbcode").on('click',function() {
            const str = $(this).attr("data");
            const el = document.createElement('textarea');
            el.value = str;
            el.setAttribute('readonly', '');
            el.style.position = 'absolute';
            el.style.left = '-9999px';
            document.body.appendChild(el);
            el.select();
            document.execCommand('copy');
            document.body.removeChild(el);
        });
    }

    function inventoryUtility() {
        if($("#ctl00_cphLeftColumn_ctl00_chkThrowAwaySelItems").length > 0) {
            $("#ctl00_cphLeftColumn_ctl00_chkThrowAwaySelItems").click();
        }
    }

    function countKilledZombies() {
        var zombieCount = 0;
        $(".diaryExtraspace li").each(function() {
            let diaryText = $(this).text().trim();

            if(diaryText.length < 100) {
               if(diaryText.includes("zombiyi cehenneme geri gönderdim!")){
                   console.log(diaryText);
                   diaryText = diaryText.replace(" zombiyi cehenneme geri gönderdim!","").trim();
                   diaryText = diaryText.replace("BOOM! El bombasıyla ","").trim();
                   zombieCount += parseInt(diaryText.trim());
               }else if(diaryText.includes("Stormswinger enerjimi biraz tazeledi")) {
                   console.log(diaryText);
                   diaryText = diaryText.replace("Stormswinger enerjimi biraz tazeledi ve ","");
                   diaryText = diaryText.replace(" zombiyi katletmemden memnun görünüyor.","");
                   zombieCount += parseInt(diaryText.trim());

               }
            }

        });


        console.log(zombieCount);
    }

    function showHideOnlyYourItemsPrepare() {
        if(localStorage.getItem("ONLY_YOUR_ITEMS") == null) {
            localStorage.setItem("ONLY_YOUR_ITEMS", 0);
        }

        $("#checkedlist").before('<a href="#" style="display:block; margin-bottom:15px;" id="showHideOnlyYourItems">Alınabilecek Eşyaları Göster/Gizle</a>');
        showHideOnlyYourItems();

        $("#showHideOnlyYourItems").on('click', function() {
            if(localStorage.getItem("ONLY_YOUR_ITEMS") == 1){
                localStorage.setItem("ONLY_YOUR_ITEMS", 0);
            }else {
                localStorage.setItem("ONLY_YOUR_ITEMS", 1);
            }

            showHideOnlyYourItems();
        });

    }


    function showHideOnlyYourItems() {

        $("#checkedlist tr:not(:first-child)").each(function() {
            if(localStorage.getItem("ONLY_YOUR_ITEMS") == 1) {
                if($(this).find("td:first").find("input").length < 2 && $(this).attr("class") != "group") {
                    $(this).hide();
                }
            }else {
                $(this).show();
            }
        });
    }


    function progressBarPercentages() {

        let classNames  = [{"class": ".progressBar", "child": null},
                           {"class": ".greenProgressBar", "child": null},
                           {"class": ".blueProgressBar", "child": null},
                           {"class": ".plusMinusBar", "child": ".negholder"}];

        classNames.forEach(function(element) {
            $(element.class).each(function() {
                let percent = $(this).attr("title");
                if(percent.includes(' ')){
                    percent = percent.split(' ').slice(-1)[0] ;
                }

                if(element.child == null) {
                    $(this).prepend('<div style="float: left; font-size: 9px;">'+percent+'</div>');
                }else{
                    $(this).find(element.child).prepend('<div style="float: left; font-size: 9px;">'+percent+'</div>');
                }

            });
        });
    }

    function mobilePhoneCallAutoChosenCombo(type = -1) {
        if($("#ctl00_cphTopColumn_ctl00_ddlInteractionTypes").length > 0 && url.includes("/Interact/Phone/")) {
            if(type == 1){
                $("#ctl00_cphTopColumn_ctl00_ddlInteractionTypes").val("24"); // Geriye naber demek kaldı...
            }else if($("#ctl00_cphTopColumn_ctl00_ddlInteractionTypes option[value='165']").length > 0) { //Aşk meşk varsa onu seç.
                $("#ctl00_cphTopColumn_ctl00_ddlInteractionTypes").val("165");
            }else if($("#ctl00_cphTopColumn_ctl00_ddlInteractionTypes option[value='73']").length > 0) { //Telefonda yaz varsa o da olur
                $("#ctl00_cphTopColumn_ctl00_ddlInteractionTypes").val("73");
            }else{
                $("#ctl00_cphTopColumn_ctl00_ddlInteractionTypes").val("24"); // Geriye naber demek kaldı...
            }
            

        }
    }

    function hideOfferedItem() {
        console.log(localStorage.getItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX"));
        if(localStorage.getItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX") == null) {
            localStorage.setItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX", 0);
        }

        var offerredItemList = {"offred_item_list": []};

        if(localStorage.getItem("MR_HIDE_OFFERRED_ITEM_LIST") == null) {
            localStorage.setItem("MR_HIDE_OFFERRED_ITEM_LIST", JSON.stringify(offerredItemList));
        }else{
            offerredItemList = JSON.parse(localStorage.getItem("MR_HIDE_OFFERRED_ITEM_LIST"));
            console.log(offerredItemList);
        }

        var checked = localStorage.getItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX") == 1 ? 'checked' : '';

        $("#ctl00_cphLeftColumn_ctl00_chkDelivery").parent().before("<p><input id='mr_hideoffere_item_checkbox' type='checkbox' "+checked+"><label for='mr_hideoffere_item_checkbox'>Teklif edince listeden kaldır</label></p>");

        $("#ctl00_cphLeftColumn_ctl00_ddlItem > option").each(function() {
            if(offerredItemList.offred_item_list.includes($(this).val()) && localStorage.getItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX") == 1){
                $(this).remove();
            }
        });


        $("#mr_hideoffere_item_checkbox").change(function() {
            if(this.checked) {
                localStorage.setItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX", 1);
            }else{
                localStorage.setItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX", 0);
            }
        });

        $("#ctl00_cphLeftColumn_ctl00_btnGive").on('click', function() {
            if(localStorage.getItem("MR_HIDE_OFFERRED_ITEM_CHCKBOX") == 1){
                var itemId = $("#ctl00_cphLeftColumn_ctl00_ddlItem").val();
                var offeredItemList = JSON.parse(localStorage.getItem("MR_HIDE_OFFERRED_ITEM_LIST"));
                offeredItemList.offred_item_list.push(itemId);
                localStorage.setItem("MR_HIDE_OFFERRED_ITEM_LIST", JSON.stringify(offeredItemList));

            }
        });



    }

    function getCityProps(cityId) {
        var props =  {
            "8": { home:3161145, path: {place: 49089, name: "Breskens", duration:90 } },
            "35": { home:3198434, path: {place: 249590, name: "Hatay", duration:65 } },
            "61": { home:3263617, path: {place: "", name: "", duration:"" } },
            "58": { home:3230603, path: {place: "", name: "", duration:"" } },
            "9": { home:3159414, path: {place: 49090, name: "Costa Brava", duration:20 } },
            "36": { home:3218479, path: {place: 282985, name: "Srebrno", duration:95 } },
            "7": { home:3231072, path: {place: 233224, name: "Schliemann's Zimmer", duration:10 } },
            "33": { home:2965425, path: {place: 188643, name: "Blankenberge", duration: 95 } },
            "46": { home:3198948, path: {place: 773546, name: "Constanţa", duration:95 } },
            "42": { home:3231282, path: {place: 653963, name: "Tisza", duration:90 } },
            "17": { home:3161537, path: {place: 49095, name: "La Pampa", duration:90 } },
            "55": { home:3222289, path: {place: "", name: "", duration:"" } },
            "29": { home:3220722, path: {place: 131991, name: "Korcula", duration:95 } },
            "27": { home:3205233, path: {place: 182793, name: "Öğretmenin evi (Girmeden Biftek Yiyin!!)", duration:5 } },
            "19": { home:3237480, path: {place: 49097, name: "Pyhäjärvi", duration:95 } },
            "30": { home:3160535, path: {place: 137942, name: "Gala Gölü", duration:90 } },
            "47": { home:3204448, path: {place: 782567, name: "Urla", duration:90 } },
            "51": { home:3202857, path: {place: 1845324, name: "St Lucia", duration:90 } },
            "56": { home:3187003, path: {place: "", name: "", duration:"" } },
            "22": { home:3204935, path: {place: 67582, name: "Gilleleje", duration:95 } },
            "5": { home:3161774, path: {place: 234234, name: "Herman's Palace", duration:5 } },
            "14": { home:3196672, path: {place: 49198, name: "Santa Monica Beach", duration:20 } },
            "24": { home:3162492, path: {place: 103128, name: "La Rioja", duration:50 } },
            "54": { home:3188092, path: {place: "", name: "", duration:"" } },
            "10": { home:3198312, path: {place: 49091, name: "Niney Mile Beach", duration:50 } },
            "32": { home:3218344, path: {place: 170268, name: "Acapulco", duration:90 } },
            "52": { home:3218697, path: {place: 1886305, name: "Lago di Garda", duration:95 } },
            "38": { home:3198981, path: {place: 358359, name: "St Lawrence River", duration:95 } },
            "18": { home:3204377, path: {place: 49096, name: "Волга", duration:120 } },
            "11": { home:3245177, path: {place: 76469, name: "Little house on the Prairie", duration:10 } },
            "6": { home:2986433, path: {place: 49087, name: "Cape Cod", duration: 95 } },
            "20": { home:3162065, path: {place: 49098, name: "Charente", duration:65 } },
            "31": { home:2986566, path: {place: 140964, name: "Costa Verde", duration:20 } },
            "25": { home:3199641, path: {place: 104742, name: "Ipanema", duration:20 } },
            "23": { home:3181531, path: {place: 72404, name: "Ostia Lido", duration:50 } },
            "21": { home:3262551, path: {place: 53596, name: "Guarujá", duration:90 } },
            "49": { home:3177850, path: {place: 1174002, name: "Pliva", duration:95 } },
            "50": { home:3023079, path: {place: 1349118, name: "Elliott Bay Park", duration:20 } },
            "39": { home:3222154, path: {place: 473018, name: "Sentosa", duration:36 } },
            "53": { home:3201807, path: {place: "", name: "", duration:"" } },
            "1": { home:3160405, path: {place: 49044, name: "Årsta Havsbad", duration:90 } },
            "45": { home:3255714, path: {place: 670043, name: "Putuo Shan", duration:90 } },
            "60": { home:3200260, path: {place: "", name: "", duration:"" } },
            "34": { home:3222559, path: {place: 195084, name: "Pirita", duration:15 } },
            "62": { home:3227018, path: {place: "", name: "", duration:"" } },
            "16": { home:3268245, path: {place: 49094, name: "Sunnyside", duration:15 } },
            "26": { home:3203190, path: {place: 106202, name: "Telegrafbukta", duration:15 } },
            "48": { home:3231449, path: {place: 847919, name: "Wielkopolskie", duration:100 } },
            "28": { home:3220498 , path: {place: 122919, name: "Merkys", duration:90 } }
        };

        return props[cityId];
    }

    function addCityShortcuts() {
        var cityId = $("#ctl00_cphRightColumn_ctl01_ddlCities").val();
        var cityProps = getCityProps(cityId);

        var homeId = cityProps.home;
        var html = `<tr>
            <td>Duş Evi:</td>
            <td><a href="/World/Popmundo.aspx/Locale/${homeId}">Duş Evi</a></td>
            <td class="right"><a title="Duş evine git" class="icon" href="/World/Popmundo.aspx/Locale/MoveToLocale/${homeId}"><img title="Duş evi adlı mekâna git" src="../../../Static/Icons/movetolocale.png" alt="" style="border-width:0px;"></a></td>
        </tr>`;

        if(cityProps.path.place != ""){
            html += `<tr>
            <td>Patika:</td>
            <td><a href="/World/Popmundo.aspx/Locale/ItemsEquipment/${cityProps.path.place}">Patika</a> (${cityProps.path.name}) (${cityProps.path.duration} Dakika)</td>
            <td class="right"><a title="Patika mekanına git" class="icon" href="/World/Popmundo.aspx/Locale/MoveToLocale/${cityProps.path.place}"><img title="Patika mekanına git" src="../../../Static/Icons/movetolocale.png" alt="" style="border-width:0px;"></a></td>
        </tr>`;
        }

        $("#ctl00_cphLeftColumn_ctl00_lnkAirport").parent().parent().parent().append(html);

    }

    function relationLinkToPhoneCall() {
        $(".data tbody > tr").each(function() {
            var charId = $(this).children().eq(0).find("a").attr("href").split("/").slice(-1)[0];
            var isCharInSameCity = $(this).children().eq(0).find("a").html().includes("<strong>");

            if(!isCharInSameCity) {
                $(this).children().eq(0).find("a").attr("href","/World/Popmundo.aspx/Interact/Phone/"+charId);
            }

           });
    }

    function makePhoneCalls() {
        $(".data").before(`
        <p>
        <select id="mr_phone_call_combo" class="round">
		<option selected="selected" value="0">Romantik Öncelikli</option>
		<option value="1">Naber Demek İçin Ara</option>
	</select>
        <button id="mr_make_phone_call" style="margin:15px 0"><i class="fas fa-mobile-alt"></i> Uzaktaki Herkesi Ara</button>
    </p>
        `);

        $("#mr_make_phone_call").click(function () {
            var peopleToCall = {run: 1, call_type: $("#mr_phone_call_combo").val(), last_called: 0, contacts: [] };
            $(".data tbody > tr").each(function() {
                var charId = $(this).children().eq(0).find("a").attr("href").split("/").slice(-1)[0];
                var isCharInSameCity = $(this).children().eq(0).find("a").html().includes("<strong>");

                if(!isCharInSameCity) {
                    if(!blocked_char_list.includes(charId)){
                        peopleToCall.contacts.push(charId);
                    }
                }

            });
            localStorage.setItem("MR_PHONE_CALL", JSON.stringify(peopleToCall));
        });
    }

    function controlPhoneCall() {
        var peopleToCall = localStorage.getItem("MR_PHONE_CALL");
        if(peopleToCall && peopleToCall != "null") {
            peopleToCall = JSON.parse(peopleToCall);


            if(peopleToCall.run == 1) {
                var targetCharId = peopleToCall.contacts[peopleToCall.last_called];

                if(!url.includes("/World/Popmundo.aspx/Interact/Phone/"+targetCharId)){
                    window.location.href = window.location.origin + "/World/Popmundo.aspx/Interact/Phone/"+targetCharId;
                }else{
                    if(peopleToCall.last_called == peopleToCall.contacts.length - 1) {
                        peopleToCall.run = 0;
                    }else{
                        peopleToCall.last_called = peopleToCall.last_called + 1;
                    }

                    if($("#ctl00_cphTopColumn_ctl00_btnInteract").length > 0) {
                        mobilePhoneCallAutoChosenCombo(peopleToCall.call_type);
                        $("#ctl00_cphTopColumn_ctl00_btnInteract").click();
                    }else{
                        targetCharId = peopleToCall.contacts[peopleToCall.last_called];
                        window.location.href = window.location.origin + "/World/Popmundo.aspx/Interact/Phone/"+targetCharId;
                    }
                }

            }
            localStorage.setItem("MR_PHONE_CALL", JSON.stringify(peopleToCall));
        }


    }

})();