1
0
Fork 1
mirror of https://github.com/Vendicated/Vencord.git synced 2025-01-10 09:56:24 +00:00

Merge branch 'dev' into patch-donor-and-contrib-cards

This commit is contained in:
samara 2024-12-05 00:01:38 -08:00 committed by GitHub
commit 3708304efd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 78 additions and 65 deletions

View file

@ -54,5 +54,5 @@ export function sendBotMessage(channelId: string, message: PartialDeep<Message>)
export function findOption<T>(args: Argument[], name: string): T & {} | undefined;
export function findOption<T>(args: Argument[], name: string, fallbackValue: T): T & {};
export function findOption(args: Argument[], name: string, fallbackValue?: any) {
return (args.find(a => a.name === name)?.value || fallbackValue) as any;
return (args.find(a => a.name === name)?.value ?? fallbackValue) as any;
}

View file

@ -110,6 +110,7 @@ function registerSubCommands(cmd: Command, plugin: string) {
const subCmd = {
...cmd,
...o,
options: o.options !== undefined ? o.options : undefined,
type: ApplicationCommandType.CHAT_INPUT,
name: `${cmd.name} ${o.name}`,
id: `${o.name}-${cmd.id}`,

View file

@ -51,7 +51,7 @@ export default definePlugin({
{
find: "bitbucket.org",
replacement: {
match: /function \i\(\i\){(?=.{0,60}\.parse\(\i\))/,
match: /function \i\(\i\){(?=.{0,30}pathname:\i)/,
replace: "$&return null;"
},
predicate: () => settings.store.file

View file

@ -19,6 +19,7 @@
import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import { isNonNullish } from "@utils/guards";
import { Logger } from "@utils/Logger";
import definePlugin from "@utils/types";
import { findByPropsLazy, findComponentByCodeLazy } from "@webpack";
import { Avatar, ChannelStore, Clickable, IconUtils, RelationshipStore, ScrollerThin, useMemo, UserStore } from "@webpack/common";
@ -87,7 +88,7 @@ export default definePlugin({
replacement: [
{
match: /\i\.useEffect.{0,100}(\i)\[0\]\.section/,
replace: "$self.pushSection($1, arguments[0].user);$&"
replace: "$self.pushSection($1,arguments[0].user);$&"
},
{
match: /\(0,\i\.jsx\)\(\i,\{items:\i,section:(\i)/,
@ -97,14 +98,32 @@ export default definePlugin({
},
{
find: 'section:"MUTUAL_FRIENDS"',
replacement: {
match: /\.openUserProfileModal.+?\)}\)}\)(?<=(\(0,\i\.jsxs?\)\(\i\.\i,{className:(\i)\.divider}\)).+?)/,
replace: "$&,$self.renderDMPageList({user: arguments[0].user, Divider: $1, listStyle: $2.list})"
replacement: [
{
match: /\i\|\|\i(?=\?\(0,\i\.jsxs?\)\(\i\.\i\.Overlay,)/,
replace: "$&||$self.getMutualGroupDms(arguments[0].user.id).length>0"
},
{
match: /\.openUserProfileModal.+?\)}\)}\)(?<=,(\i)&&(\i)&&(\(0,\i\.jsxs?\)\(\i\.\i,{className:(\i)\.divider}\)).+?)/,
replace: (m, hasMutualGuilds, hasMutualFriends, Divider, classes) => "" +
`${m},$self.renderDMPageList({user:arguments[0].user,hasDivider:${hasMutualGuilds}||${hasMutualFriends},Divider:${Divider},listStyle:${classes}.list})`
}
]
}
],
getMutualGroupDms(userId: string) {
try {
return getMutualGroupDms(userId);
} catch (e) {
new Logger("MutualGroupDMs").error("Failed to get mutual group dms:", e);
}
return [];
},
pushSection(sections: any[], user: User) {
try {
if (isBotOrSelf(user) || sections[IS_PATCHED]) return;
sections[IS_PATCHED] = true;
@ -112,11 +131,13 @@ export default definePlugin({
section: "MUTUAL_GDMS",
text: getMutualGDMCountText(user)
});
} catch (e) {
new Logger("MutualGroupDMs").error("Failed to push mutual group dms section:", e);
}
},
renderMutualGDMs: ErrorBoundary.wrap(({ user, onClose }: { user: User, onClose: () => void; }) => {
const mutualGDms = useMemo(() => getMutualGroupDms(user.id), [user.id]);
const entries = renderClickableGDMs(mutualGDms, onClose);
return (
@ -138,14 +159,13 @@ export default definePlugin({
);
}),
renderDMPageList: ErrorBoundary.wrap(({ user, Divider, listStyle }: { user: User, Divider: JSX.Element, listStyle: string; }) => {
renderDMPageList: ErrorBoundary.wrap(({ user, hasDivider, Divider, listStyle }: { user: User, hasDivider: boolean, Divider: JSX.Element, listStyle: string; }) => {
const mutualGDms = getMutualGroupDms(user.id);
if (mutualGDms.length === 0) return null;
return (
<>
{Divider}
{hasDivider && Divider}
<ExpandableList
listClassName={listStyle}
header={"Mutual Groups"}

View file

@ -16,20 +16,23 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { Settings } from "@api/Settings";
import { getUserSettingLazy } from "@api/UserSettings";
import { Devs } from "@utils/constants";
import definePlugin from "@utils/types";
const DisableStreamPreviews = getUserSettingLazy<boolean>("voiceAndVideo", "disableStreamPreviews")!;
// @TODO: Delete this plugin in the future
export default definePlugin({
name: "NoScreensharePreview",
description: "Disables screenshare previews from being sent.",
authors: [Devs.Nuckyz],
patches: [
{
find: '"ApplicationStreamPreviewUploadManager"',
replacement: {
match: /await \i\.\i\.(makeChunkedRequest\(|post\(\{url:)\i\.\i\.STREAM_PREVIEW.+?\}\)/g,
replace: "0"
start() {
if (!DisableStreamPreviews.getSetting()) {
DisableStreamPreviews.updateSetting(true);
}
Settings.plugins.NoScreensharePreview.enabled = false;
}
]
});

View file

@ -20,9 +20,9 @@ import { addServerListElement, removeServerListElement, ServerListRenderPosition
import { Settings } from "@api/Settings";
import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import { useForceUpdater } from "@utils/react";
import definePlugin, { OptionType } from "@utils/types";
import { GuildStore, PresenceStore, RelationshipStore } from "@webpack/common";
import { findStoreLazy } from "@webpack";
import { GuildStore, PresenceStore, RelationshipStore, useStateFromStores } from "@webpack/common";
const enum IndicatorType {
SERVER = 1 << 0,
@ -30,13 +30,24 @@ const enum IndicatorType {
BOTH = SERVER | FRIEND,
}
let onlineFriends = 0;
let guildCount = 0;
let forceUpdateFriendCount: () => void;
let forceUpdateGuildCount: () => void;
const UserGuildJoinRequestStore = findStoreLazy("UserGuildJoinRequestStore");
function FriendsIndicator() {
forceUpdateFriendCount = useForceUpdater();
const onlineFriendsCount = useStateFromStores([RelationshipStore, PresenceStore], () => {
let count = 0;
const friendIds = RelationshipStore.getFriendIDs();
for (const id of friendIds) {
const status = PresenceStore.getStatus(id) ?? "offline";
if (status === "offline") {
continue;
}
count++;
}
return count;
});
return (
<span id="vc-friendcount" style={{
@ -48,13 +59,19 @@ function FriendsIndicator() {
textTransform: "uppercase",
textAlign: "center",
}}>
{onlineFriends} online
{onlineFriendsCount} online
</span>
);
}
function ServersIndicator() {
forceUpdateGuildCount = useForceUpdater();
const guildCount = useStateFromStores([GuildStore, UserGuildJoinRequestStore], () => {
const guildJoinRequests: string[] = UserGuildJoinRequestStore.computeGuildIds();
const guilds = GuildStore.getGuilds();
// Filter only pending guild join requests
return GuildStore.getGuildCount() + guildJoinRequests.filter(id => guilds[id] == null).length;
});
return (
<span id="vc-guildcount" style={{
@ -71,24 +88,6 @@ function ServersIndicator() {
);
}
function handlePresenceUpdate() {
onlineFriends = 0;
const relations = RelationshipStore.getRelationships();
for (const id of Object.keys(relations)) {
const type = relations[id];
// FRIEND relationship type
if (type === 1 && PresenceStore.getStatus(id) !== "offline") {
onlineFriends += 1;
}
}
forceUpdateFriendCount?.();
}
function handleGuildUpdate() {
guildCount = GuildStore.getGuildCount();
forceUpdateGuildCount?.();
}
export default definePlugin({
name: "ServerListIndicators",
description: "Add online friend count or server count in the server list",
@ -117,18 +116,8 @@ export default definePlugin({
</ErrorBoundary>;
},
flux: {
PRESENCE_UPDATES: handlePresenceUpdate,
GUILD_CREATE: handleGuildUpdate,
GUILD_DELETE: handleGuildUpdate,
},
start() {
addServerListElement(ServerListRenderPosition.Above, this.renderIndicator);
handlePresenceUpdate();
handleGuildUpdate();
},
stop() {

View file

@ -164,8 +164,8 @@ export default definePlugin({
find: 'getElementById("slate-toolbar"',
predicate: () => settings.store.addBack,
replacement: {
match: /(?<=handleContextMenu\(\i\)\{.{0,200}isPlatformEmbedded)\?/,
replace: "||true?"
match: /(?<=handleContextMenu\(\i\)\{.{0,200}isPlatformEmbedded)\)/,
replace: "||true)"
}
},
{