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 "@/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].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
42/**
43 * Applies the specified membership's theme to the sitewide navigation.
44 * @param themeId The ID of the membership whose theme should be applied.
45 */
46function membershipThemes(themeId: "plus" | "plusdx") {
47 const navbar = document.querySelector('.navbar.navbar-expand-lg.navbar-light.bg-navbar.nav-topbar')!;
48 const sidebar = document.querySelector('.d-flex.flex-column.flex-shrink-0.bg-sidebar.nav-sidebar')!;
49
50 navbar.classList.add('navbar-' + themeId);
51 sidebar.classList.add('sidebar-' + themeId);
52
53 if (themeId == "plus") {
54 sidebar.getElementsByTagName('img')[0].src = plusIcon;
55 } else {
56 sidebar.getElementsByTagName('img')[0].src = plusDeluxeIcon;
57 }
58};