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