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 { bricksToCurrency, getUserDetails } from "@/utils/utilities";
4import plusIcon from "@/assets/plus.svg";
5import plusDeluxeIcon from "@/assets/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]
26 .textContent += ` (${currency})`;
27 }
28 }
29
30 if (values.hideNotificationBadges.enabled) {
31 const badges = document.getElementsByClassName(
32 "notif-nav notif-sidebar",
33 );
34 for (const badge of badges) {
35 badge.remove();
36 }
37 }
38
39 if (values.membershipThemes.enabled) {
40 membershipThemes(
41 values.membershipThemes.themeId as "plus" | "plusdx",
42 );
43 }
44 });
45 });
46 },
47});
48
49/**
50 * Applies the specified membership's theme to the sitewide navigation.
51 * @param themeId The ID of the membership whose theme should be applied.
52 */
53function membershipThemes(themeId: "plus" | "plusdx") {
54 const navbar = document.querySelector(
55 ".navbar.navbar-expand-lg.navbar-light.bg-navbar.nav-topbar",
56 )!;
57 const sidebar = document.querySelector(
58 ".d-flex.flex-column.flex-shrink-0.bg-sidebar.nav-sidebar",
59 )!;
60
61 navbar.classList.add("navbar-" + themeId);
62 sidebar.classList.add("sidebar-" + themeId);
63
64 if (themeId == "plus") {
65 sidebar.getElementsByTagName("img")[0].src = plusIcon;
66 } else {
67 sidebar.getElementsByTagName("img")[0].src = plusDeluxeIcon;
68 }
69}