const Manifest = chrome.runtime.getManifest(); const SettingsURL = chrome.runtime.getURL('settings.html'); const DefaultSettings = { PinnedGamesOn: true, ForumMentsOn: true, BestFriendsOn: false, ImprovedFrListsOn: false, IRLPriceWithCurrency: { Enabled: true, Currency: 0, Package: 0 }, IRLPriceWithCurrencyOn: true, IRLPriceWithCurrencyCurrency: 0, IRLPriceWithCurrencyPackage: 0, HideNotifBadgesOn: false, StoreOwnTagOn: true, ThemeCreatorOn: false, ThemeCreator: { Enabled: false, BGColor: null, BGImage: null, BGImageSize: 'fit', PrimaryTextColor: null, SecondaryTextColor: null, LinkTextColor: null, WebsiteLogo: null }, ModifyNavOn: false, ModifyNav: [ { Label: 'Places', Link: 'https://polytoria.com/places' }, { Label: 'Store', Link: 'https://polytoria.com/store' }, { Label: 'Guilds', Link: 'https://polytoria.com/guilds' }, { Label: 'People', Link: 'https://polytoria.com/users' }, { Label: 'Forum', Link: 'https://polytoria.com/forum' } ], MoreSearchFiltersOn: true, ApplyMembershipTheme: { Enabled: false, Theme: 0 }, ApplyMembershipThemeOn: false, ApplyMembershipThemeTheme: 0, MultiCancelOutTradesOn: true, ItemWishlistOn: true, HideUpgradeBtnOn: false, TryOnItemsOn: true, OutfitCostOn: true, ShowPlaceRevenueOn: true, ReplaceItemSalesOn: false, HoardersListOn: true, HoardersList: { Enabled: true, AvatarsEnabled: false, MinCopies: 2 }, LibraryDownloadsOn: true, EventItemsCatOn: true, HomeFriendCountOn: true, HideUserAds: { Enabled: false, Banners: true, Rectangles: true }, UploadMultipleDecals: true, GD_ServerBalanceOn: true, AvatarDimensionToggleOn: true, TheGreatDivide: { Enabled: true, UnbalancedIndicatorOn: true, MVPUserIndicatorOn: true, UserStatsOn: true, LeaderboardsOn: true }, CollectibleInventoryCatOn: true, ValueListInfo: { Enabled: true, ItemValuation: true, TradeValuation: true }, ImprovedAchievements: { Enabled: true, ProgressBarOn: true, PercentageOn: true, OpacityOn: true }, ReaddCopyablePlacesOn: true, TimePlayedOn: true, HomeJoinFriendsButtonOn: true, ImprovedPlaceManagement: { Enabled: true, QuickActivityToggleOn: true, PlaceFileDownloadOn: true, MultiWhitelistOn: true, ClearWhitelistOn: true }, MoreBlockedDetailsOn: true, AssetDesignerCreditOn: true } // ON EXTENSION INSTALL / RELOAD chrome.runtime.onInstalled.addListener(() => { chrome.storage.sync.get(['PolyPlus_Settings'], function(result){ const MergedSettings = MergeObjects((result.PolyPlus_Settings || DefaultSettings), DefaultSettings) chrome.storage.sync.set({'PolyPlus_Settings': MergedSettings}, function(){ console.log('Successfully merged settings') }) }) }); let RecordingTimePlayed = false chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { if (request.action === 'reload') { chrome.runtime.reload(); } else if (request.action === 'greatdivide_stats') { chrome.storage.local.get(['PolyPlus_GreatDivideStats'], async function(result){ const Cache = (result['PolyPlus_GreatDivideStats']||{[request.userID]:undefined}) // cache for 5 minutes if (Cache[request.userID] === undefined || (new Date().getTime() - Cache[request.userID].requested > 300000)) { let Statistics = (await (await fetch('https://stats.silly.mom/player_stats?id=' + request.userID)).json()).results if (Statistics !== null) { Statistics = Statistics[0] } Cache[request.userID] = { data: Statistics, requested: new Date().getTime() } chrome.storage.local.set({['PolyPlus_GreatDivideStats']: Cache}, function(){}) } chrome.tabs.query({ active: true, currentWindow: true }, function(tabs){ chrome.scripting .executeScript({ target: {tabId: tabs[0].id}, func: LoadStats, args: [Cache[request.userID].data] }) }) }) const LoadStats = function(stats){ const GreatDivideCard = document.getElementById('p+greatdivide_card') if (stats !== null) { let KDR = (stats.Kills / stats.Deaths) if (isNaN(KDR)) { KDR = "N/A" } else { KDR = KDR.toFixed(4) } if (stats.Team === 'phantoms') { GreatDivideCard.parentElement.style.backgroundImage = 'linear-gradient(rgba(0.7, 0.7, 0.7, 0.7), rgba(0.7, 0.7, 0.7, 0.7)), url("https://c0.ptacdn.com/assets/N3DH4x5a6iW7raaQ-3lwHpRHHpWShdXc.png")'; GreatDivideCard.parentElement.style.borderColor = ''; GreatDivideCard.parentElement.style.border = '1.25px solid blue !important'; } else { GreatDivideCard.parentElement.style.backgroundImage = 'linear-gradient(rgba(0.7, 0.7, 0.7, 0.7), rgba(0.7, 0.7, 0.7, 0.7)), url("https://c0.ptacdn.com/assets/1HXpaoDLHJo2rrvwwxqJEDWvDZ6BgvSE.png")'; GreatDivideCard.parentElement.style.borderColor = ''; GreatDivideCard.parentElement.style.border = '1.25px solid green !important'; } GreatDivideCard.innerHTML = `
Last Round Seen ${ (stats.LastRoundSeen === 0) ? '-' : stats.LastRoundSeen }

Kills ${stats.Kills.toLocaleString()} (${stats.UniqueKills.toLocaleString()} unique)
Deaths ${stats.Deaths.toLocaleString()}
Kill Death Ratio ${KDR}
Points Scored ${stats.PointsScored.toLocaleString()}
Cash Earned ${stats.CashEarned.toLocaleString()}
Flags Captured ${stats.FlagsCaptured} (${stats.FlagsReturned} returned)
Airdrops Collected ${stats.AirdropsCollected}

Monoliths Destroyed ${stats.ObelisksDestroyed}
Blocks Placed ${stats.BlocksPlaced} (${stats.BlocksDestroyed} destroyed)
Headshots ${stats.Headshots}
` const Script = document.createElement('script'); Script.setAttribute('type', 'text/javascript'); Script.setAttribute('src', chrome.runtime.getURL('resources/registerTooltips.js')); Script.addEventListener('load', function () { Script.remove(); }); document.body.appendChild(Script); } else { GreatDivideCard.classList.add('text-center', 'py-5') GreatDivideCard.innerHTML = `

Not Drafted

This user didn't participate in The Great Divide.

` } } return true } else if (request.action === 'start_time_played') { if (RecordingTimePlayed === true) { console.log('Time Played: Already Started Interval') return } RecordingTimePlayed = true chrome.storage.sync.get(['PolyPlus_TimePlayed'], function(result){ console.log('Time Played: Start Interval') const Playtime = result.PolyPlus_TimePlayed || { [request.placeID]: 0 }; let LoadedIn = false const TimePlayedInterval = setInterval(async () => { console.log('Time Played: Run Check') const PlaceStatus = (await (await fetch('https://api.polytoria.com/v1/users/' + request.userID)).json()).playing if (PlaceStatus === null) { console.log('Time Played: Not Playing Anything') if (LoadedIn === true) { console.log('Time Played: End Interval') clearInterval(TimePlayedInterval) } } else { LoadedIn = true if (!Playtime[PlaceStatus.placeID]) { Playtime[PlaceStatus.placeID] = 0 } Playtime[PlaceStatus.placeID] += 5 console.log('Time Played: Time Increase: ', new Date(Playtime[PlaceStatus.placeID] * 1000).toISOString().slice(11, 19), PlaceStatus) chrome.storage.sync.set({'PolyPlus_TimePlayed': Playtime}, function(){ console.log('Time Played: Saved Playtime') }) } }, 5000); }) } }); // WHEN CLICKING ON EXTENSION ICON OPEN THE SETTINGS PAGE chrome.action.onClicked.addListener((tab) => { chrome.tabs.create({active: true, url: SettingsURL}); }); chrome.contextMenus.removeAll(function () { // COPY ASSET ID CONTEXT MENU ITEM REGISTRATION /* const AssetTypes = ["Place", "User", "Item", "Guild"] AssetTypes.forEach(type => { chrome.contextMenus.create({ title: 'Copy ' + type + ' ID', id: 'PolyPlus-Copy' + type + 'ID', contexts: ['link'], documentUrlPatterns: ['https://polytoria.com/*', SettingsURL], targetUrlPatterns: [ 'https://polytoria.com/places/**' ] }); }) */ chrome.contextMenus.create({ title: 'Copy Place ID', id: 'PolyPlus-CopyPlaceID', contexts: ['link'], documentUrlPatterns: ['https://polytoria.com/*', SettingsURL], targetUrlPatterns: [ 'https://polytoria.com/places/**' ] }); chrome.contextMenus.create({ title: 'Copy User ID', id: 'PolyPlus-CopyUserID', contexts: ['link'], documentUrlPatterns: ['https://polytoria.com/*', SettingsURL], targetUrlPatterns: [ 'https://polytoria.com/users/**', 'https://polytoria.com/u/**' ] }); chrome.contextMenus.create({ title: 'Copy Item ID', id: 'PolyPlus-CopyItemID', contexts: ['link'], documentUrlPatterns: ['https://polytoria.com/*', SettingsURL], targetUrlPatterns: [ 'https://polytoria.com/store/**' ] }); chrome.contextMenus.create({ title: 'Copy Guild ID', id: 'PolyPlus-CopyGuildID', contexts: ['link'], documentUrlPatterns: ['https://polytoria.com/*', SettingsURL], targetUrlPatterns: [ 'https://polytoria.com/guilds/**' ] }); chrome.contextMenus.create({ title: 'Copy Thread ID', id: 'PolyPlus-CopyThreadID', contexts: ['link'], documentUrlPatterns: ['https://polytoria.com/*', SettingsURL], targetUrlPatterns: [ 'https://polytoria.com/forum/post/**' ] }); // COPY AVATAR HASH CONTEXT MENU ITEM REGISTRATION chrome.contextMenus.create({ title: 'Copy Avatar Hash', id: 'PolyPlus-CopyAvatarHash', contexts: ['image'], documentUrlPatterns: ['https://polytoria.com/*', SettingsURL], targetUrlPatterns: [ 'https://c0.ptacdn.com/thumbnails/avatars/**' ] }); }); // HANDLE CONTEXT MENU ITEMS chrome.contextMenus.onClicked.addListener(async function (info, tab) { if (["CopyPlaceID", "CopyUserID", "CopyItemID", "CopyGuildID"].indexOf(info.menuItemId.split('-')[1]) !== -1) { let ID = info.linkUrl.split('/')[4]; if (info.linkUrl.split('/')[3] === 'u') { ID = (await (await fetch('https://api.polytoria.com/v1/users/find?username=' + info.linkUrl.split('/')[4])).json()).id; } chrome.scripting .executeScript({ target: {tabId: tab.id}, func: CopyAssetID, args: [ID] }) .then(() => console.log('Copied ID!')); } if (info.menuItemId === 'PolyPlus-CopyThreadID') { let ID = info.linkUrl.split('/')[5]; chrome.scripting .executeScript({ target: {tabId: tab.id}, func: CopyAssetID, args: [ID] }) .then(() => console.log('Copied ID!')); } if (info.menuItemId === 'PolyPlus-CopyAvatarHash') { let Hash = new URL(info.srcUrl).pathname.split('/')[3].replace('-icon', '').replace('.png', ''); chrome.scripting .executeScript({ target: {tabId: tab.id}, func: CopyAvatarHash, args: [Hash] }) .then(() => console.log('Copied ID!')); } if (info.menuItemId === 'PolyPlus-RunUpdateNotifier') { RunUpdateNotifier(); } }); /* GREEN LOGO WHEN EXTENSION APPLIES TO CURRENT TAB PAGE, RED WHEN IT DOESN'T COMING SOON chrome.tabs.onActivated.addListener(function (info){ chrome.tabs.get(info.tabId, function(tab){ const Any = CheckIfScriptApplies(tab.url) console.log(Any) }); }); function CheckIfScriptApplies(url) { const matches = Manifest.content_scripts.map(script => { script.matches.forEach(match => { console.log(url, match, url.startsWith(match)) if (url.startsWith(match)) { return true } else { return false } }) }) return matches } function matchesUrl(patterns, url) { return patterns.some(pattern => { return new RegExp(pattern).test(url); }); } */ function CopyAssetID(id) { navigator.clipboard .writeText(id) .catch((err) => { alert('Failure to copy ID.', err); }); } function CopyAvatarHash(hash) { navigator.clipboard .writeText(hash) .then(() => { alert('Successfully copied avatar hash!'); }) .catch(() => { alert('Failure to copy avatar hash.'); }); } function OpenSweetAlert2Modal(icon, title, text) { console.log(window, window.Swal, window.bootstrap) window.Swal.fire({ icon: icon, title: title, text: text }) } // MergeObjects function was written by ChatGPT cause I was lazy and it was awhile ago function MergeObjects(obj1, obj2) { var mergedObj = {}; // Copy the values from obj1 to the mergedObj for (var key in obj1) { mergedObj[key] = obj1[key]; } // Merge the values from obj2 into the mergedObj, favoring obj2 for non-existing keys in obj1 for (var key in obj2) { if (!obj1.hasOwnProperty(key)) { mergedObj[key] = obj2[key]; } } return mergedObj; }