A rewrite of Poly+, my quality-of-life browser extension for Polytoria. Built entirely fresh using the WXT extension framework, Typescript, and with added better overall code quality.
extension
1import config from "@/utils/config.json"; 2import { preferences } from "@/utils/storage"; 3import { getUserDetails, bricksToCurrency } from "@/utils/utilities"; 4import plusIcon from "/svgs/plus.svg"; 5import plusDeluxeIcon from "/svgs/plusDx.svg"; 6 7export default defineContentScript({ 8 matches: ['*://polytoria.com/*'], 9 main() { 10 getUserDetails() 11 .then((user) => { 12 if (!user) { 13 // Error page or event page most likely, where users are not authenticated 14 console.warn('[Poly+] Failure to get logged in user details.'); 15 return; 16 }; 17 18 if (config.devBuild) console.info('[Poly+] Logged in as: ', user); 19 20 preferences.getPreferences() 21 .then((values) => { 22 if (values.irlBrickPrice.enabled) { 23 const currency = bricksToCurrency(user.bricks, "USD"); 24 if (currency) { 25 document.getElementsByClassName('brickBalanceCount')[0].textContent += ` (${currency})`; 26 }; 27 }; 28 29 if (values.hideNotificationBadges.enabled) { 30 const badges = document.getElementsByClassName('notif-nav notif-sidebar'); 31 for (const badge of badges) { 32 badge.remove(); 33 }; 34 }; 35 36 if (values.membershipThemes.enabled) membershipThemes(values.membershipThemes.themeId as "plus" | "plusdx"); 37 }); 38 }); 39 } 40}); 41 42function membershipThemes(themeId: "plus" | "plusdx") { 43 const navbar = document.querySelector('.navbar.navbar-expand-lg.navbar-light.bg-navbar.nav-topbar')!; 44 const sidebar = document.querySelector('.d-flex.flex-column.flex-shrink-0.bg-sidebar.nav-sidebar')!; 45 46 navbar.classList.add('navbar-' + themeId); 47 sidebar.classList.add('sidebar-' + themeId); 48 49 sidebar.getElementsByTagName('img')[0].src = browser.runtime.getURL(`/svgs/${themeId}.svg` as `/svgs/plus.svg` | `/svgs/plusdx.svg`); 50};