aboutsummaryrefslogtreecommitdiff
path: root/src/api/Badges.ts
diff options
context:
space:
mode:
authormegumin <megumin.bakaretsurie@gmail.com>2022-11-11 22:50:09 +0000
committerGitHub <noreply@github.com>2022-11-11 23:50:09 +0100
commit30ca4f1cf9cc1a4179f5c7ef5cfb47eaff83f56a (patch)
tree8ee2a9e7f83ba8c3c2441636e5d122de3aa663b4 /src/api/Badges.ts
parent62e0787cf25a76881fac79b5f3df0ebda706bb21 (diff)
downloadVencord-30ca4f1cf9cc1a4179f5c7ef5cfb47eaff83f56a.tar.gz
Vencord-30ca4f1cf9cc1a4179f5c7ef5cfb47eaff83f56a.tar.bz2
Vencord-30ca4f1cf9cc1a4179f5c7ef5cfb47eaff83f56a.zip
feat: Badge API (#206)
Diffstat (limited to 'src/api/Badges.ts')
-rw-r--r--src/api/Badges.ts100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/api/Badges.ts b/src/api/Badges.ts
new file mode 100644
index 0000000..542f78d
--- /dev/null
+++ b/src/api/Badges.ts
@@ -0,0 +1,100 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2022 Vendicated and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+import { User } from "discord-types/general";
+import { HTMLProps } from "react";
+
+export enum BadgePosition {
+ START,
+ END
+}
+
+export interface ProfileBadge {
+ /** The tooltip to show on hover */
+ tooltip: string;
+ /** The custom image to use */
+ image?: string;
+ /** Action to perform when you click the badge */
+ onClick?(): void;
+ /** Should the user display this badge? */
+ shouldShow?(userInfo: BadgeUserArgs): boolean;
+ /** Optional props (e.g. style) for the badge */
+ props?: HTMLProps<HTMLImageElement>;
+ /** Insert at start or end? */
+ position?: BadgePosition;
+
+ /** The badge name to display. Discord uses this, but we don't. */
+ key?: string;
+}
+
+const Badges = new Set<ProfileBadge>();
+
+/**
+ * Register a new badge with the Badges API
+ * @param badge The badge to register
+ */
+export function addBadge(badge: ProfileBadge) {
+ Badges.add(badge);
+}
+
+/**
+ * Unregister a badge from the Badges API
+ * @param badge The badge to remove
+ */
+export function removeBadge(badge: ProfileBadge) {
+ return Badges.delete(badge);
+}
+
+/**
+ * Inject badges into the profile badges array.
+ * You probably don't need to use this.
+ */
+export function inject(badgeArray: ProfileBadge[], args: BadgeUserArgs) {
+ for (const badge of Badges) {
+ if (!badge.shouldShow || badge.shouldShow(args)) {
+ badge.position === BadgePosition.START
+ ? badgeArray.unshift(badge)
+ : badgeArray.push(badge);
+ }
+ }
+ return badgeArray;
+}
+
+export interface BadgeUserArgs {
+ user: User;
+ profile: Profile;
+ premiumSince: Date;
+ premiumGuildSince?: Date;
+}
+
+interface ConnectedAccount {
+ type: string;
+ id: string;
+ name: string;
+ verified: boolean;
+}
+
+interface Profile {
+ connectedAccounts: ConnectedAccount[];
+ premiumType: number;
+ premiumSince: string;
+ premiumGuildSince?: any;
+ lastFetched: number;
+ profileFetchFailed: boolean;
+ application?: any;
+}