add vencord and equicord contributor to fetching
All checks were successful
Code quality checks / biome (push) Successful in 17s

This commit is contained in:
creations 2025-06-05 19:49:23 -04:00
parent d300f20b49
commit 269b858e88
Signed by: creations
GPG key ID: 8F553AA4320FC711
3 changed files with 100 additions and 12 deletions

View file

@ -87,7 +87,7 @@ const discordBadgeDetails = {
}, },
}; };
const badgeServices: badgeURLMap[] = [ const badgeServices: BadgeService[] = [
{ {
service: "Vencord", service: "Vencord",
url: "https://badges.vencord.dev/badges.json", url: "https://badges.vencord.dev/badges.json",
@ -118,6 +118,9 @@ const badgeServices: badgeURLMap[] = [
}, },
]; ];
const vencordEquicordContributorUrl =
"https://raw.githubusercontent.com/Equicord/Equibored/refs/heads/main/plugins.json";
function getServiceDescription(service: string): string { function getServiceDescription(service: string): string {
const descriptions: Record<string, string> = { const descriptions: Record<string, string> = {
Vencord: "Custom badges from Vencord Discord client", Vencord: "Custom badges from Vencord Discord client",
@ -137,6 +140,7 @@ export {
badgeServices, badgeServices,
discordBadges, discordBadges,
discordBadgeDetails, discordBadgeDetails,
vencordEquicordContributorUrl,
getServiceDescription, getServiceDescription,
gitUrl, gitUrl,
}; };

View file

@ -1,5 +1,11 @@
import { echo } from "@atums/echo"; import { echo } from "@atums/echo";
import { badgeFetchInterval, badgeServices, gitUrl, redisTtl } from "@config"; import {
badgeFetchInterval,
badgeServices,
gitUrl,
redisTtl,
vencordEquicordContributorUrl,
} from "@config";
import { redis } from "bun"; import { redis } from "bun";
class BadgeCacheManager { class BadgeCacheManager {
@ -110,6 +116,72 @@ class BadgeCacheManager {
data = (await res.json()) as VencordEquicordData; data = (await res.json()) as VencordEquicordData;
} }
} }
if (typeof vencordEquicordContributorUrl === "string") {
const contributorRes = await fetch(vencordEquicordContributorUrl, {
headers: {
"User-Agent": `BadgeAPI/1.0 ${gitUrl}`,
},
});
if (contributorRes.ok) {
const pluginData = await contributorRes.json();
if (Array.isArray(pluginData)) {
if (!data) {
data = {} as VencordEquicordData;
}
const contributors = new Set<string>();
for (const plugin of pluginData) {
if (plugin.authors && Array.isArray(plugin.authors)) {
const isEquicordPlugin =
plugin.filePath &&
typeof plugin.filePath === "string" &&
plugin.filePath.includes("equicordplugins/");
const shouldInclude =
(serviceKey === "equicord" && isEquicordPlugin) ||
(serviceKey === "vencord" && !isEquicordPlugin);
if (shouldInclude) {
for (const author of plugin.authors) {
if (author.id) {
contributors.add(author.id);
}
}
}
}
}
const badgeDetails =
serviceKey === "vencord"
? {
tooltip: "Vencord Contributor",
badge: "https://vencord.dev/assets/favicon.png",
}
: {
tooltip: "Equicord Contributor",
badge: "https://i.imgur.com/57ATLZu.png",
};
for (const authorId of contributors) {
if (!data[authorId]) {
data[authorId] = [];
}
const hasContributorBadge = data[authorId].some(
(badge) => badge.tooltip === badgeDetails.tooltip,
);
if (!hasContributorBadge) {
data[authorId].push(badgeDetails);
}
}
}
}
}
break; break;
} }

32
types/badge.d.ts vendored
View file

@ -10,7 +10,7 @@ interface FetchBadgesOptions {
separated?: boolean; separated?: boolean;
} }
type badgeURLMap = { type BadgeService = {
service: string; service: string;
url: url:
| string | string
@ -51,15 +51,6 @@ interface ReviewDbData
type BadgeServiceData = VencordEquicordData | NekocordData | ReviewDbData; type BadgeServiceData = VencordEquicordData | NekocordData | ReviewDbData;
interface BadgeService {
service: string;
url:
| string
| ((
userId: string,
) => string | { user: string; badge: (id: string) => string });
}
interface VencordBadgeItem { interface VencordBadgeItem {
tooltip: string; tooltip: string;
badge: string; badge: string;
@ -87,3 +78,24 @@ interface DiscordUserData {
avatar: string; avatar: string;
flags: number; flags: number;
} }
interface PluginData {
hasPatches: boolean;
hasCommands: boolean;
enabledByDefault: boolean;
required: boolean;
tags: string[];
name: string;
description: string;
authors: Array<{
name: string;
id: string;
}>;
filePath: string;
commands?: Array<{
name: string;
description: string;
}>;
dependencies?: string[];
target?: string;
}