mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-26 06:38:24 -04:00
forked!!
This commit is contained in:
parent
538b87062a
commit
ea7451bcdc
326 changed files with 24876 additions and 2280 deletions
131
src/equicordplugins/showBadgesInChat/index.tsx
Normal file
131
src/equicordplugins/showBadgesInChat/index.tsx
Normal file
|
@ -0,0 +1,131 @@
|
|||
/*
|
||||
* Vencord, a Discord client mod
|
||||
* Copyright (c) 2024 Vendicated and contributors
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import { addDecoration, removeDecoration } from "@api/MessageDecorations";
|
||||
import { Devs } from "@utils/constants";
|
||||
import { isPluginDev } from "@utils/misc";
|
||||
import definePlugin from "@utils/types";
|
||||
import { findByPropsLazy } from "@webpack";
|
||||
|
||||
import badges from "../../plugins/_api/badges";
|
||||
import settings from "./settings";
|
||||
|
||||
let RoleIconComponent: React.ComponentType<any> = () => null;
|
||||
let roleIconClassName: string;
|
||||
|
||||
const discordBadges: readonly [number, string, string][] = Object.freeze([
|
||||
[0, "Discord Staff", "5e74e9b61934fc1f67c65515d1f7e60d"],
|
||||
[1, "Partnered Server Owner", "3f9748e53446a137a052f3454e2de41e"],
|
||||
[2, "HypeSquad Events", "bf01d1073931f921909045f3a39fd264"],
|
||||
[6, "HypeSquad Bravery", "8a88d63823d8a71cd5e390baa45efa02"],
|
||||
[7, "HypeSquad Brilliance", "011940fd013da3f7fb926e4a1cd2e618"],
|
||||
[8, "HypeSquad Balance", "3aa41de486fa12454c3761e8e223442e"],
|
||||
[3, "Discord Bug Hunter", "2717692c7dca7289b35297368a940dd0"],
|
||||
[14, "Discord Bug Hunter", "848f79194d4be5ff5f81505cbd0ce1e6"],
|
||||
[22, "Active Developer", "6bdc42827a38498929a4920da12695d9"],
|
||||
[17, "Early Verified Bot Developer", "6df5892e0f35b051f8b61eace34f4967"],
|
||||
[9, "Early Supporter", "7060786766c9c840eb3019e725d2b358"],
|
||||
[18, "Moderator Programs Alumni", "fee1624003e2fee35cb398e125dc479b"]
|
||||
]);
|
||||
|
||||
function CheckBadge({ badge, author }: { badge: string; author: any; }): JSX.Element | null {
|
||||
switch (badge) {
|
||||
case "VencordDonor":
|
||||
return (
|
||||
<span style={{ order: settings.store.VencordDonorPosition }}>
|
||||
{badges.getDonorBadges(author.id)?.map((badge: any) => (
|
||||
<RoleIconComponent
|
||||
className={roleIconClassName}
|
||||
name={badge.description}
|
||||
size={20}
|
||||
src={badge.image}
|
||||
/>
|
||||
))}
|
||||
</span>
|
||||
);
|
||||
case "VencordContributer":
|
||||
return isPluginDev(author.id) ? (
|
||||
<span style={{ order: settings.store.VencordContributorPosition }}>
|
||||
<RoleIconComponent
|
||||
className={roleIconClassName}
|
||||
name={"Vencord/Equicord Contributor"}
|
||||
size={20}
|
||||
src={"https://i.imgur.com/OypoHrV.png"}
|
||||
/>
|
||||
</span>
|
||||
) : null;
|
||||
case "DiscordProfile":
|
||||
const chatBadges = discordBadges
|
||||
.filter((badge: any) => (author.flags || author.publicFlags) & (1 << badge[0]))
|
||||
.map((badge: any) => (
|
||||
<RoleIconComponent
|
||||
className={roleIconClassName}
|
||||
name={badge[1]}
|
||||
size={20}
|
||||
src={`https://cdn.discordapp.com/badge-icons/${badge[2]}.png`}
|
||||
/>
|
||||
));
|
||||
return chatBadges.length > 0 ? (
|
||||
<span style={{ order: settings.store.DiscordProfilePosition }}>
|
||||
{chatBadges}
|
||||
</span>
|
||||
) : null;
|
||||
case "DiscordNitro":
|
||||
return author.premiumType > 0 ? (
|
||||
<span style={{ order: settings.store.DiscordNitroPosition }}>
|
||||
<RoleIconComponent
|
||||
className={roleIconClassName}
|
||||
name={
|
||||
"Discord Nitro" +
|
||||
(author.premiumType === 3 ? " Basic" : author.premiumType === 1 ? " Classic" : "")
|
||||
}
|
||||
size={20}
|
||||
src={"https://cdn.discordapp.com/badge-icons/2ba85e8026a8614b640c2837bcdfe21b.png"}
|
||||
/>
|
||||
</span>
|
||||
) : null;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function ChatBadges({ author }: any) {
|
||||
return (
|
||||
<span style={{ display: "inline-flex", marginLeft: 2, verticalAlign: "top" }}>
|
||||
{settings.store.showVencordDonor && <CheckBadge badge={"VencordDonor"} author={author} />}
|
||||
{settings.store.showVencordContributor && <CheckBadge badge={"VencordContributer"} author={author} />}
|
||||
{settings.store.showDiscordProfile && <CheckBadge badge={"DiscordProfile"} author={author} />}
|
||||
{settings.store.showDiscordNitro && <CheckBadge badge={"DiscordNitro"} author={author} />}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
export default definePlugin({
|
||||
name: "ShowBadgesInChat",
|
||||
authors: [Devs.Inbestigator, Devs.KrystalSkull],
|
||||
description: "Shows the message author's badges beside their name in chat.",
|
||||
dependencies: ["MessageDecorationsAPI"],
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.ROLE_ICON_ALT_TEXT",
|
||||
replacement: {
|
||||
match: /function\s+\w+?\(\w+?\)\s*{let\s+\w+?,\s*{className:.+}\)}/,
|
||||
replace: "$self.RoleIconComponent=$&;$&",
|
||||
}
|
||||
}
|
||||
],
|
||||
settings,
|
||||
set RoleIconComponent(component: any) {
|
||||
RoleIconComponent = component;
|
||||
},
|
||||
start: () => {
|
||||
roleIconClassName = findByPropsLazy("roleIcon", "separator").roleIcon;
|
||||
addDecoration("vc-show-badges-in-chat", props => <ChatBadges author={props.message?.author} />);
|
||||
},
|
||||
stop: () => {
|
||||
removeDecoration("vc-show-badges-in-chat");
|
||||
}
|
||||
});
|
166
src/equicordplugins/showBadgesInChat/settings.tsx
Normal file
166
src/equicordplugins/showBadgesInChat/settings.tsx
Normal file
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
* Vencord, a Discord client mod
|
||||
* Copyright (c) 2024 Vendicated and contributors
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import "./styles.css";
|
||||
|
||||
import { definePluginSettings } from "@api/Settings";
|
||||
import { OptionType } from "@utils/types";
|
||||
import { Text, useEffect, UserStore, useState } from "@webpack/common";
|
||||
|
||||
const settings = definePluginSettings({
|
||||
showVencordDonor: {
|
||||
type: OptionType.BOOLEAN,
|
||||
description: "Enable to show Vencord donor badges in chat.",
|
||||
hidden: true,
|
||||
default: true
|
||||
},
|
||||
VencordDonorPosition: {
|
||||
type: OptionType.NUMBER,
|
||||
description: "The position of the Vencord Donor badges.",
|
||||
hidden: true,
|
||||
default: 0
|
||||
},
|
||||
showVencordContributor: {
|
||||
type: OptionType.BOOLEAN,
|
||||
description: "Enable to show Vencord contributor badges in chat.",
|
||||
hidden: true,
|
||||
default: true
|
||||
},
|
||||
VencordContributorPosition: {
|
||||
type: OptionType.NUMBER,
|
||||
description: "The position of the Vencord Contributor badge.",
|
||||
hidden: true,
|
||||
default: 1
|
||||
},
|
||||
showDiscordProfile: {
|
||||
type: OptionType.BOOLEAN,
|
||||
description: "Enable to show Discord profile badges in chat.",
|
||||
hidden: true,
|
||||
default: true
|
||||
},
|
||||
DiscordProfilePosition: {
|
||||
type: OptionType.NUMBER,
|
||||
description: "The position of the Discord profile badges.",
|
||||
hidden: true,
|
||||
default: 2
|
||||
},
|
||||
showDiscordNitro: {
|
||||
type: OptionType.BOOLEAN,
|
||||
description: "Enable to show Discord Nitro badges in chat.",
|
||||
hidden: true,
|
||||
default: true
|
||||
},
|
||||
DiscordNitroPosition: {
|
||||
type: OptionType.NUMBER,
|
||||
description: "The position of the Discord Nitro badge.",
|
||||
hidden: true,
|
||||
default: 3
|
||||
},
|
||||
badgeSettings: {
|
||||
type: OptionType.COMPONENT,
|
||||
description: "Setup badge layout and visibility",
|
||||
component: () => <BadgeSettings />
|
||||
}
|
||||
});
|
||||
|
||||
export default settings;
|
||||
|
||||
const BadgeSettings = () => {
|
||||
const [images, setImages] = useState([
|
||||
{ src: "https://cdn.discordapp.com/emojis/1026533070955872337.png", shown: settings.store.showVencordDonor, title: "Vencord donor badges", key: "VencordDonor", position: settings.store.VencordDonorPosition },
|
||||
{ src: "https://i.imgur.com/OypoHrV.png", shown: settings.store.showVencordContributor, title: "Vencord/Equicord contributor badge", key: "VencordContributer", position: settings.store.VencordContributorPosition },
|
||||
{ src: "https://cdn.discordapp.com/badge-icons/bf01d1073931f921909045f3a39fd264.png", shown: settings.store.showDiscordProfile, title: "Discord profile badges (HypeSquad, Discord Staff, Active Developer, etc.)", key: "DiscordProfile", position: settings.store.DiscordProfilePosition },
|
||||
{ src: "https://cdn.discordapp.com/badge-icons/2ba85e8026a8614b640c2837bcdfe21b.png", shown: settings.store.showDiscordNitro, title: "Nitro badge", key: "DiscordNitro", position: settings.store.DiscordNitroPosition }
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
images.forEach(image => {
|
||||
switch (image.key) {
|
||||
case "VencordDonor":
|
||||
settings.store.VencordDonorPosition = image.position;
|
||||
settings.store.showVencordDonor = image.shown;
|
||||
break;
|
||||
case "VencordContributer":
|
||||
settings.store.VencordContributorPosition = image.position;
|
||||
settings.store.showVencordContributor = image.shown;
|
||||
break;
|
||||
case "DiscordProfile":
|
||||
settings.store.DiscordProfilePosition = image.position;
|
||||
settings.store.showDiscordProfile = image.shown;
|
||||
break;
|
||||
case "DiscordNitro":
|
||||
settings.store.DiscordNitroPosition = image.position;
|
||||
settings.store.showDiscordNitro = image.shown;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
}, [images]);
|
||||
|
||||
const handleDragStart = (e: any, index: number) => {
|
||||
if (!images[index].shown) {
|
||||
e.preventDefault();
|
||||
} else {
|
||||
e.dataTransfer.setData("index", index);
|
||||
}
|
||||
};
|
||||
|
||||
const handleDragOver = e => {
|
||||
e.preventDefault();
|
||||
};
|
||||
|
||||
const handleDrop = (e: any, dropIndex: number) => {
|
||||
const dragIndex = e.dataTransfer.getData("index");
|
||||
const newImages = [...images];
|
||||
const draggedImage = newImages[dragIndex];
|
||||
|
||||
newImages.splice(dragIndex, 1);
|
||||
newImages.splice(dropIndex, 0, draggedImage);
|
||||
|
||||
newImages.forEach((image, index) => {
|
||||
image.position = index;
|
||||
});
|
||||
|
||||
setImages(newImages);
|
||||
};
|
||||
|
||||
const toggleDisable = (index: number) => {
|
||||
const newImages = [...images];
|
||||
newImages[index].shown = !newImages[index].shown;
|
||||
setImages(newImages);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<Text>Drag the badges to reorder them, you can click to enable/disable a specific badge type.</Text>
|
||||
<div className="badge-settings">
|
||||
<img style={{ width: "55px", height: "55px", borderRadius: "50%", marginRight: "15px" }} src={UserStore.getCurrentUser().getAvatarURL()}></img>
|
||||
<Text style={{ fontSize: "22px", color: "white", marginRight: "7.5px" }}>{(UserStore.getCurrentUser() as any).globalName}</Text>
|
||||
{images
|
||||
.sort((a, b) => a.position - b.position)
|
||||
.map((image, index) => (
|
||||
<div
|
||||
key={image.key}
|
||||
className={`image-container ${!image.shown ? "disabled" : ""}`}
|
||||
onDragOver={e => handleDragOver(e)}
|
||||
onDrop={e => handleDrop(e, index)}
|
||||
onClick={() => toggleDisable(index)}
|
||||
>
|
||||
<img
|
||||
src={image.src}
|
||||
alt={image.title}
|
||||
draggable={image.shown}
|
||||
onDragStart={e => handleDragStart(e, index)}
|
||||
title={image.title}
|
||||
/>
|
||||
</div>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
21
src/equicordplugins/showBadgesInChat/styles.css
Normal file
21
src/equicordplugins/showBadgesInChat/styles.css
Normal file
|
@ -0,0 +1,21 @@
|
|||
.badge-settings {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.image-container {
|
||||
position: relative;
|
||||
transition: 0.15s;
|
||||
}
|
||||
|
||||
.image-container img {
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
opacity: 0.5;
|
||||
scale: 0.95;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue