mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-10 15:13:02 -04:00
Merge branch 'dev'
This commit is contained in:
commit
5d43975ad9
18 changed files with 583 additions and 573 deletions
|
@ -66,7 +66,6 @@ function getMessageFlags(selfInChannel: boolean) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendVoiceStatusMessage(channelId: string, content: string, userId: string, selfInChannel: boolean): Message | null {
|
function sendVoiceStatusMessage(channelId: string, content: string, userId: string, selfInChannel: boolean): Message | null {
|
||||||
if (settings.store.mode === 1) return null;
|
|
||||||
if (!channelId) return null;
|
if (!channelId) return null;
|
||||||
|
|
||||||
const message: Message = createBotMessage({ channelId, content, embeds: [] });
|
const message: Message = createBotMessage({ channelId, content, embeds: [] });
|
||||||
|
@ -109,7 +108,7 @@ let clientOldChannelId: string | undefined;
|
||||||
export default definePlugin({
|
export default definePlugin({
|
||||||
name: "VoiceChannelLog",
|
name: "VoiceChannelLog",
|
||||||
description: "Logs who joins and leaves voice channels",
|
description: "Logs who joins and leaves voice channels",
|
||||||
authors: [Devs.Sqaaakoi, EquicordDevs.thororen],
|
authors: [Devs.Sqaaakoi, EquicordDevs.thororen, EquicordDevs.nyx],
|
||||||
contextMenus: {
|
contextMenus: {
|
||||||
"channel-context": patchChannelContextMenu
|
"channel-context": patchChannelContextMenu
|
||||||
},
|
},
|
||||||
|
@ -139,10 +138,14 @@ export default definePlugin({
|
||||||
timestamp: new Date()
|
timestamp: new Date()
|
||||||
};
|
};
|
||||||
|
|
||||||
addLogEntry(logEntry, oldChannelId);
|
|
||||||
addLogEntry(logEntry, channelId);
|
if (settings.store.mode !== 2) {
|
||||||
|
addLogEntry(logEntry, oldChannelId);
|
||||||
|
addLogEntry(logEntry, channelId);
|
||||||
|
}
|
||||||
|
|
||||||
if (!settings.store.voiceChannelChatSelf && userId === clientUserId) return;
|
if (!settings.store.voiceChannelChatSelf && userId === clientUserId) return;
|
||||||
|
if (settings.store.mode === 1) return;
|
||||||
// Join / Leave
|
// Join / Leave
|
||||||
if ((!oldChannelId && channelId) || (oldChannelId && !channelId)) {
|
if ((!oldChannelId && channelId) || (oldChannelId && !channelId)) {
|
||||||
// empty string is to make type checker shut up
|
// empty string is to make type checker shut up
|
||||||
|
|
24
src/plugins/_api/imageModal.ts
Normal file
24
src/plugins/_api/imageModal.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Vencord, a Discord client mod
|
||||||
|
* Copyright (c) 2024 Vendicated and contributors
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Devs } from "@utils/constants";
|
||||||
|
import definePlugin from "@utils/types";
|
||||||
|
|
||||||
|
|
||||||
|
export default definePlugin({
|
||||||
|
name: "ImageModalAPI",
|
||||||
|
authors: [Devs.sadan, Devs.Nuckyz],
|
||||||
|
description: "Allows you to open Image Modals",
|
||||||
|
patches: [
|
||||||
|
{
|
||||||
|
find: "SCALE_DOWN:",
|
||||||
|
replacement: {
|
||||||
|
match: /!\(null==(\i)\|\|0===\i\|\|null==(\i)\|\|0===\i\)/,
|
||||||
|
replace: (_, width, height) => `!((null == ${width} || 0 === ${width}) && (null == ${height} || 0 === ${height}))`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
|
@ -23,7 +23,7 @@ import ErrorBoundary from "@components/ErrorBoundary";
|
||||||
import { Flex } from "@components/Flex";
|
import { Flex } from "@components/Flex";
|
||||||
import { Link } from "@components/Link";
|
import { Link } from "@components/Link";
|
||||||
import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab";
|
import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab";
|
||||||
import { Devs, SUPPORT_CHANNEL_ID, SUPPORT_CHANNEL_IDS, VC_SUPPORT_CHANNEL_ID } from "@utils/constants";
|
import { Devs, GUILD_ID, SUPPORT_CHANNEL_ID, SUPPORT_CHANNEL_IDS, VC_GUILD_ID, VC_SUPPORT_CHANNEL_ID } from "@utils/constants";
|
||||||
import { sendMessage } from "@utils/discord";
|
import { sendMessage } from "@utils/discord";
|
||||||
import { Logger } from "@utils/Logger";
|
import { Logger } from "@utils/Logger";
|
||||||
import { Margins } from "@utils/margins";
|
import { Margins } from "@utils/margins";
|
||||||
|
@ -40,24 +40,17 @@ import plugins, { PluginMeta } from "~plugins";
|
||||||
|
|
||||||
import SettingsPlugin from "./settings";
|
import SettingsPlugin from "./settings";
|
||||||
|
|
||||||
const VENCORD_GUILD_ID = "1015060230222131221";
|
|
||||||
const EQUICORD_GUILD_ID = "1015060230222131221";
|
|
||||||
const VENBOT_USER_ID = "1017176847865352332";
|
const VENBOT_USER_ID = "1017176847865352332";
|
||||||
const KNOWN_ISSUES_CHANNEL_ID = "1222936386626129920";
|
const KNOWN_ISSUES_CHANNEL_ID = "1222936386626129920";
|
||||||
const CodeBlockRe = /```js\n(.+?)```/s;
|
const CodeBlockRe = /```js\n(.+?)```/s;
|
||||||
|
|
||||||
const AllowedChannelIds = [
|
|
||||||
SUPPORT_CHANNEL_ID,
|
|
||||||
"1173659827881390160", // Equicord > #dev
|
|
||||||
"1297590739911573585", // Equicord > #support
|
|
||||||
];
|
|
||||||
|
|
||||||
const TrustedRolesIds = [
|
const TrustedRolesIds = [
|
||||||
"1026534353167208489", // contributor
|
"1026534353167208489", // contributor
|
||||||
"1026504932959977532", // regular
|
"1026504932959977532", // regular
|
||||||
"1042507929485586532", // donor
|
"1042507929485586532", // donor
|
||||||
"1173520023239786538", // Equicord Team
|
"1173520023239786538", // Equicord Team
|
||||||
"1222677964760682556", // Equicord Contributor
|
"1222677964760682556", // Equicord Contributor
|
||||||
|
"1287079931645263968", // Equibop Contributor
|
||||||
"1173343399470964856", // Vencord Contributor
|
"1173343399470964856", // Vencord Contributor
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -165,13 +158,15 @@ export default definePlugin({
|
||||||
{
|
{
|
||||||
name: "equicord-debug",
|
name: "equicord-debug",
|
||||||
description: "Send Equicord debug info",
|
description: "Send Equicord debug info",
|
||||||
predicate: ctx => isPluginDev(UserStore.getCurrentUser()?.id) || isEquicordPluginDev(UserStore.getCurrentUser()?.id) || AllowedChannelIds.includes(ctx.channel.id),
|
// @ts-ignore
|
||||||
|
predicate: ctx => isPluginDev(UserStore.getCurrentUser()?.id) || isEquicordPluginDev(UserStore.getCurrentUser()?.id) || GUILD_ID === ctx?.guild?.id,
|
||||||
execute: async () => ({ content: await generateDebugInfoMessage() })
|
execute: async () => ({ content: await generateDebugInfoMessage() })
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "equicord-plugins",
|
name: "equicord-plugins",
|
||||||
description: "Send Equicord plugin list",
|
description: "Send Equicord plugin list",
|
||||||
predicate: ctx => isPluginDev(UserStore.getCurrentUser()?.id) || isEquicordPluginDev(UserStore.getCurrentUser()?.id) || AllowedChannelIds.includes(ctx.channel.id),
|
// @ts-ignore
|
||||||
|
predicate: ctx => isPluginDev(UserStore.getCurrentUser()?.id) || isEquicordPluginDev(UserStore.getCurrentUser()?.id) || GUILD_ID === ctx?.guild?.id,
|
||||||
execute: () => ({ content: generatePluginList() })
|
execute: () => ({ content: generatePluginList() })
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -223,7 +218,7 @@ export default definePlugin({
|
||||||
}
|
}
|
||||||
|
|
||||||
// @ts-ignore outdated type
|
// @ts-ignore outdated type
|
||||||
const roles = GuildMemberStore.getSelfMember(VENCORD_GUILD_ID)?.roles || GuildMemberStore.getSelfMember(EQUICORD_GUILD_ID)?.roles;
|
const roles = GuildMemberStore.getSelfMember(VC_GUILD_ID)?.roles || GuildMemberStore.getSelfMember(GUILD_ID)?.roles;
|
||||||
if (!roles || TrustedRolesIds.some(id => roles.includes(id))) return;
|
if (!roles || TrustedRolesIds.some(id => roles.includes(id))) return;
|
||||||
|
|
||||||
if (!IS_WEB && IS_UPDATER_DISABLED) {
|
if (!IS_WEB && IS_UPDATER_DISABLED) {
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { definePluginSettings } from "@api/Settings";
|
||||||
import { getUserSettingLazy } from "@api/UserSettings";
|
import { getUserSettingLazy } from "@api/UserSettings";
|
||||||
import { ImageIcon } from "@components/Icons";
|
import { ImageIcon } from "@components/Icons";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
import { getCurrentGuild, openMediaModal } from "@utils/discord";
|
import { getCurrentGuild, openImageModal } from "@utils/discord";
|
||||||
import definePlugin, { OptionType } from "@utils/types";
|
import definePlugin, { OptionType } from "@utils/types";
|
||||||
import { findByPropsLazy } from "@webpack";
|
import { findByPropsLazy } from "@webpack";
|
||||||
import { Clipboard, GuildStore, Menu, PermissionStore } from "@webpack/common";
|
import { Clipboard, GuildStore, Menu, PermissionStore } from "@webpack/common";
|
||||||
|
@ -65,7 +65,7 @@ export default definePlugin({
|
||||||
name: "BetterRoleContext",
|
name: "BetterRoleContext",
|
||||||
description: "Adds options to copy role color / edit role / view role icon when right clicking roles in the user profile",
|
description: "Adds options to copy role color / edit role / view role icon when right clicking roles in the user profile",
|
||||||
authors: [Devs.Ven, Devs.goodbee],
|
authors: [Devs.Ven, Devs.goodbee],
|
||||||
dependencies: ["UserSettingsAPI"],
|
dependencies: ["UserSettingsAPI", "ImageModalAPI"],
|
||||||
|
|
||||||
settings,
|
settings,
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ export default definePlugin({
|
||||||
id="vc-view-role-icon"
|
id="vc-view-role-icon"
|
||||||
label="View Role Icon"
|
label="View Role Icon"
|
||||||
action={() => {
|
action={() => {
|
||||||
openMediaModal(`${location.protocol}//${window.GLOBAL_ENV.CDN_HOST}/role-icons/${role.id}/${role.icon}.${settings.store.roleIconFileFormat}`);
|
openImageModal(`${location.protocol}//${window.GLOBAL_ENV.CDN_HOST}/role-icons/${role.id}/${role.icon}.${settings.store.roleIconFileFormat}`);
|
||||||
}}
|
}}
|
||||||
icon={ImageIcon}
|
icon={ImageIcon}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
import { NavContextMenuPatchCallback } from "@api/ContextMenu";
|
import { NavContextMenuPatchCallback } from "@api/ContextMenu";
|
||||||
import { ScreenshareIcon } from "@components/Icons";
|
import { ScreenshareIcon } from "@components/Icons";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
import { openMediaModal } from "@utils/discord";
|
import { openImageModal } from "@utils/discord";
|
||||||
import definePlugin from "@utils/types";
|
import definePlugin from "@utils/types";
|
||||||
import { Menu } from "@webpack/common";
|
import { Menu } from "@webpack/common";
|
||||||
import { Channel, User } from "discord-types/general";
|
import { Channel, User } from "discord-types/general";
|
||||||
|
@ -57,7 +57,7 @@ export const handleViewPreview = async ({ guildId, channelId, ownerId }: Applica
|
||||||
const previewUrl = await ApplicationStreamPreviewStore.getPreviewURL(guildId, channelId, ownerId);
|
const previewUrl = await ApplicationStreamPreviewStore.getPreviewURL(guildId, channelId, ownerId);
|
||||||
if (!previewUrl) return;
|
if (!previewUrl) return;
|
||||||
|
|
||||||
openMediaModal(previewUrl);
|
openImageModal(previewUrl);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const addViewStreamContext: NavContextMenuPatchCallback = (children, { userId }: { userId: string | bigint; }) => {
|
export const addViewStreamContext: NavContextMenuPatchCallback = (children, { userId }: { userId: string | bigint; }) => {
|
||||||
|
@ -89,6 +89,7 @@ export default definePlugin({
|
||||||
name: "BiggerStreamPreview",
|
name: "BiggerStreamPreview",
|
||||||
description: "This plugin allows you to enlarge stream previews",
|
description: "This plugin allows you to enlarge stream previews",
|
||||||
authors: [Devs.phil],
|
authors: [Devs.phil],
|
||||||
|
dependencies: ["ImageModalAPI"],
|
||||||
contextMenus: {
|
contextMenus: {
|
||||||
"user-context": userContextPatch,
|
"user-context": userContextPatch,
|
||||||
"stream-context": streamContextPatch
|
"stream-context": streamContextPatch
|
||||||
|
|
|
@ -158,10 +158,6 @@ export default definePlugin({
|
||||||
{
|
{
|
||||||
find: ".contain,SCALE_DOWN:",
|
find: ".contain,SCALE_DOWN:",
|
||||||
replacement: {
|
replacement: {
|
||||||
// there are 2 image thingies. one for carosuel and one for the single image.
|
|
||||||
// so thats why i added global flag.
|
|
||||||
// also idk if this patch is good, should it be more specific?
|
|
||||||
// https://regex101.com/r/xfvNvV/1
|
|
||||||
match: /\.slide,\i\),/g,
|
match: /\.slide,\i\),/g,
|
||||||
replace: `$&id:"${ELEMENT_ID}",`
|
replace: `$&id:"${ELEMENT_ID}",`
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -7,7 +7,7 @@
|
||||||
import "./styles.css";
|
import "./styles.css";
|
||||||
|
|
||||||
import { classNameFactory } from "@api/Styles";
|
import { classNameFactory } from "@api/Styles";
|
||||||
import { openMediaModal, openUserProfile } from "@utils/discord";
|
import { openImageModal, openUserProfile } from "@utils/discord";
|
||||||
import { classes } from "@utils/misc";
|
import { classes } from "@utils/misc";
|
||||||
import { ModalRoot, ModalSize, openModal } from "@utils/modal";
|
import { ModalRoot, ModalSize, openModal } from "@utils/modal";
|
||||||
import { useAwaiter } from "@utils/react";
|
import { useAwaiter } from "@utils/react";
|
||||||
|
@ -80,7 +80,7 @@ function GuildInfoModal({ guild }: GuildProps) {
|
||||||
className={cl("banner")}
|
className={cl("banner")}
|
||||||
src={bannerUrl}
|
src={bannerUrl}
|
||||||
alt=""
|
alt=""
|
||||||
onClick={() => openMediaModal(bannerUrl)}
|
onClick={() => openImageModal(bannerUrl)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
@ -89,7 +89,9 @@ function GuildInfoModal({ guild }: GuildProps) {
|
||||||
? <img
|
? <img
|
||||||
src={iconUrl}
|
src={iconUrl}
|
||||||
alt=""
|
alt=""
|
||||||
onClick={() => openMediaModal(iconUrl)}
|
onClick={() => openImageModal(iconUrl, {
|
||||||
|
width: 256
|
||||||
|
})}
|
||||||
/>
|
/>
|
||||||
: <div aria-hidden className={classes(IconClasses.childWrapper, IconClasses.acronym)}>{guild.acronym}</div>
|
: <div aria-hidden className={classes(IconClasses.childWrapper, IconClasses.acronym)}>{guild.acronym}</div>
|
||||||
}
|
}
|
||||||
|
@ -151,7 +153,7 @@ function Owner(guildId: string, owner: User) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={cl("owner")}>
|
<div className={cl("owner")}>
|
||||||
<img src={ownerAvatarUrl} alt="" onClick={() => openMediaModal(ownerAvatarUrl)} />
|
<img src={ownerAvatarUrl} alt="" onClick={() => openImageModal(ownerAvatarUrl)} />
|
||||||
{Parser.parse(`<@${owner.id}>`)}
|
{Parser.parse(`<@${owner.id}>`)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -31,6 +31,7 @@ export default definePlugin({
|
||||||
description: "Allows you to view info about a server",
|
description: "Allows you to view info about a server",
|
||||||
authors: [Devs.Ven, Devs.Nuckyz],
|
authors: [Devs.Ven, Devs.Nuckyz],
|
||||||
tags: ["guild", "info", "ServerProfile"],
|
tags: ["guild", "info", "ServerProfile"],
|
||||||
|
dependencies: ["ImageModalAPI"],
|
||||||
contextMenus: {
|
contextMenus: {
|
||||||
"guild-context": Patch,
|
"guild-context": Patch,
|
||||||
"guild-header-popout": Patch
|
"guild-header-popout": Patch
|
||||||
|
|
|
@ -21,7 +21,7 @@ import "./spotifyStyles.css";
|
||||||
import { Flex } from "@components/Flex";
|
import { Flex } from "@components/Flex";
|
||||||
import { ImageIcon, LinkIcon, OpenExternalIcon } from "@components/Icons";
|
import { ImageIcon, LinkIcon, OpenExternalIcon } from "@components/Icons";
|
||||||
import { debounce } from "@shared/debounce";
|
import { debounce } from "@shared/debounce";
|
||||||
import { openMediaModal } from "@utils/discord";
|
import { openImageModal } from "@utils/discord";
|
||||||
import { classes, copyWithToast } from "@utils/misc";
|
import { classes, copyWithToast } from "@utils/misc";
|
||||||
import { ContextMenuApi, FluxDispatcher, Forms, Menu, React, useEffect, useState, useStateFromStores } from "@webpack/common";
|
import { ContextMenuApi, FluxDispatcher, Forms, Menu, React, useEffect, useState, useStateFromStores } from "@webpack/common";
|
||||||
|
|
||||||
|
@ -229,7 +229,7 @@ function AlbumContextMenu({ track }: { track: Track; }) {
|
||||||
id="view-cover"
|
id="view-cover"
|
||||||
label="View Album Cover"
|
label="View Album Cover"
|
||||||
// trolley
|
// trolley
|
||||||
action={() => openMediaModal(track.album.image.url)}
|
action={() => openImageModal(track.album.image.url)}
|
||||||
icon={ImageIcon}
|
icon={ImageIcon}
|
||||||
/>
|
/>
|
||||||
<Menu.MenuControlItem
|
<Menu.MenuControlItem
|
||||||
|
|
|
@ -33,6 +33,7 @@ export default definePlugin({
|
||||||
name: "SpotifyControls",
|
name: "SpotifyControls",
|
||||||
description: "Adds a Spotify player above the account panel",
|
description: "Adds a Spotify player above the account panel",
|
||||||
authors: [Devs.Ven, Devs.afn, Devs.KraXen72, Devs.Av32000],
|
authors: [Devs.Ven, Devs.afn, Devs.KraXen72, Devs.Av32000],
|
||||||
|
dependencies: ["ImageModalAPI"],
|
||||||
options: {
|
options: {
|
||||||
hoverControls: {
|
hoverControls: {
|
||||||
description: "Show controls on hover",
|
description: "Show controls on hover",
|
||||||
|
|
|
@ -20,7 +20,7 @@ import { NavContextMenuPatchCallback } from "@api/ContextMenu";
|
||||||
import { definePluginSettings } from "@api/Settings";
|
import { definePluginSettings } from "@api/Settings";
|
||||||
import { ImageIcon } from "@components/Icons";
|
import { ImageIcon } from "@components/Icons";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
import { openMediaModal } from "@utils/discord";
|
import { openImageModal } from "@utils/discord";
|
||||||
import definePlugin, { OptionType } from "@utils/types";
|
import definePlugin, { OptionType } from "@utils/types";
|
||||||
import { GuildMemberStore, IconUtils, Menu } from "@webpack/common";
|
import { GuildMemberStore, IconUtils, Menu } from "@webpack/common";
|
||||||
import type { Channel, Guild, User } from "discord-types/general";
|
import type { Channel, Guild, User } from "discord-types/general";
|
||||||
|
@ -78,10 +78,9 @@ function openImage(url: string) {
|
||||||
u.searchParams.set("size", "4096");
|
u.searchParams.set("size", "4096");
|
||||||
const originalUrl = u.toString();
|
const originalUrl = u.toString();
|
||||||
|
|
||||||
openMediaModal({
|
openImageModal(url, {
|
||||||
url,
|
|
||||||
original: originalUrl,
|
original: originalUrl,
|
||||||
maxHeight: 256
|
height: 256
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,6 +170,7 @@ export default definePlugin({
|
||||||
name: "ViewIcons",
|
name: "ViewIcons",
|
||||||
authors: [Devs.Ven, Devs.TheKodeToad, Devs.Nuckyz, Devs.nyx],
|
authors: [Devs.Ven, Devs.TheKodeToad, Devs.Nuckyz, Devs.nyx],
|
||||||
description: "Makes avatars and banners in user profiles clickable, adds View Icon/Banner entries in the user, server and group channel context menu.",
|
description: "Makes avatars and banners in user profiles clickable, adds View Icon/Banner entries in the user, server and group channel context menu.",
|
||||||
|
dependencies: ["ImageModalAPI"],
|
||||||
tags: ["ImageUtilities"],
|
tags: ["ImageUtilities"],
|
||||||
|
|
||||||
settings,
|
settings,
|
||||||
|
|
|
@ -18,9 +18,12 @@
|
||||||
|
|
||||||
export const WEBPACK_CHUNK = "webpackChunkdiscord_app";
|
export const WEBPACK_CHUNK = "webpackChunkdiscord_app";
|
||||||
export const REACT_GLOBAL = "Vencord.Webpack.Common.React";
|
export const REACT_GLOBAL = "Vencord.Webpack.Common.React";
|
||||||
export const SUPPORT_CHANNEL_ID = "1173342942858055721";
|
export const SUPPORT_CHANNEL_ID = "1297590739911573585";
|
||||||
export const SUPPORT_CHANNEL_IDS = ["1173342942858055721", "1026515880080842772"];
|
|
||||||
export const VC_SUPPORT_CHANNEL_ID = "1026515880080842772";
|
export const VC_SUPPORT_CHANNEL_ID = "1026515880080842772";
|
||||||
|
export const SUPPORT_CHANNEL_IDS = [SUPPORT_CHANNEL_ID, VC_SUPPORT_CHANNEL_ID];
|
||||||
|
export const GUILD_ID = "1173279886065029291";
|
||||||
|
export const VC_GUILD_ID = "1015060230222131221";
|
||||||
|
export const GUILD_IDS = [GUILD_ID, VC_GUILD_ID];
|
||||||
|
|
||||||
export interface Dev {
|
export interface Dev {
|
||||||
name: string;
|
name: string;
|
||||||
|
|
3
src/utils/discord.css
Normal file
3
src/utils/discord.css
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
.vc-imagemodal-fix {
|
||||||
|
position: inherit;
|
||||||
|
}
|
|
@ -16,11 +16,13 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import "./discord.css";
|
||||||
|
|
||||||
import { MessageObject } from "@api/MessageEvents";
|
import { MessageObject } from "@api/MessageEvents";
|
||||||
import { ChannelStore, ComponentDispatch, Constants, FluxDispatcher, GuildStore, InviteActions, MessageActions, PrivateChannelsStore, RestAPI, SelectedChannelStore, SelectedGuildStore, UserProfileActions, UserProfileStore, UserSettingsActionCreators, UserUtils } from "@webpack/common";
|
import { ChannelStore, ComponentDispatch, Constants, FluxDispatcher, GuildStore, InviteActions, MaskedLink, MessageActions, PrivateChannelsStore, RestAPI, SelectedChannelStore, SelectedGuildStore, UserProfileActions, UserProfileStore, UserSettingsActionCreators, UserUtils } from "@webpack/common";
|
||||||
import { Channel, Guild, Message, User } from "discord-types/general";
|
import { Channel, Guild, Message, User } from "discord-types/general";
|
||||||
|
|
||||||
import { MediaData, MediaModal, openModal } from "./modal";
|
import { ImageModal, openModal } from "./modal";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open the invite modal
|
* Open the invite modal
|
||||||
|
@ -108,21 +110,23 @@ export function sendMessage(
|
||||||
return MessageActions.sendMessage(channelId, messageData, waitForChannelReady, extra);
|
return MessageActions.sendMessage(channelId, messageData, waitForChannelReady, extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
const FIX_CLASS_NAME = "vc-imagemodal-fix";
|
||||||
*
|
|
||||||
* @param media The url of the media or its data
|
export function openImageModal(url: string, props?: Partial<React.ComponentProps<ImageModal>>): string {
|
||||||
* @param mediaModalProps Additional props for the image modal
|
|
||||||
*/
|
|
||||||
export function openMediaModal(media: string | MediaData, mediaModalProps?: Partial<React.ComponentProps<MediaModal>>): string {
|
|
||||||
media = typeof media === "string" ? { url: media } : media;
|
|
||||||
media.original ??= media.url;
|
|
||||||
media.type ??= "IMAGE";
|
|
||||||
return openModal(modalProps => (
|
return openModal(modalProps => (
|
||||||
<MediaModal
|
<ImageModal
|
||||||
{...modalProps}
|
{...modalProps}
|
||||||
{...mediaModalProps}
|
renderLinkComponent={props => <MaskedLink {...props} />}
|
||||||
shouldAnimateCarousel
|
// Don't render forward message button scaleDown_f97a12 contain_f97a12
|
||||||
items={[media]}
|
renderForwardComponent={() => null}
|
||||||
|
shouldHideMediaOptions={false}
|
||||||
|
shouldAnimate={true}
|
||||||
|
fit={FIX_CLASS_NAME}
|
||||||
|
items={[{
|
||||||
|
...props,
|
||||||
|
type: "IMAGE",
|
||||||
|
url,
|
||||||
|
}]}
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,31 +101,26 @@ export const Modals = findByPropsLazy("ModalRoot", "ModalCloseButton") as {
|
||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
|
|
||||||
// @TODO Type this
|
// FIXME: type this
|
||||||
export type MediaData = {
|
export type ImageModal = any & ComponentType<{
|
||||||
url: string;
|
className?: string;
|
||||||
original?: string;
|
src: string;
|
||||||
type?: string;
|
placeholder: string;
|
||||||
alt?: string;
|
original: string;
|
||||||
width?: number;
|
width?: number;
|
||||||
height?: number;
|
height?: number;
|
||||||
|
animated?: boolean;
|
||||||
|
responsive?: boolean;
|
||||||
|
renderLinkComponent(props: any): ReactNode;
|
||||||
|
renderForwardComponent(props: any): ReactNode;
|
||||||
maxWidth?: number;
|
maxWidth?: number;
|
||||||
maxHeight?: number;
|
maxHeight?: number;
|
||||||
} & Record<PropertyKey, any>;
|
shouldAnimate?: boolean;
|
||||||
|
onClose?(): void;
|
||||||
export type MediaModal = ComponentType<{
|
|
||||||
onClose?: () => void;
|
|
||||||
items: MediaData[];
|
|
||||||
startingIndex?: number;
|
|
||||||
onIndexChange?: (...args: any[]) => void;
|
|
||||||
fit?: any;
|
|
||||||
shouldRedactExplicitContent?: boolean;
|
|
||||||
shouldHideMediaOptions?: boolean;
|
shouldHideMediaOptions?: boolean;
|
||||||
shouldAnimateCarousel?: boolean;
|
|
||||||
className?: string;
|
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export const MediaModal = findComponentByCodeLazy(".MEDIA_MODAL_CLOSE") as MediaModal;
|
export const ImageModal = findComponentByCodeLazy(".MEDIA_MODAL_CLOSE") as ImageModal;
|
||||||
|
|
||||||
export const ModalRoot = LazyComponent(() => Modals.ModalRoot);
|
export const ModalRoot = LazyComponent(() => Modals.ModalRoot);
|
||||||
export const ModalHeader = LazyComponent(() => Modals.ModalHeader);
|
export const ModalHeader = LazyComponent(() => Modals.ModalHeader);
|
||||||
|
|
|
@ -16,9 +16,8 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { findByPropsLazy, findLazy } from "@webpack";
|
import { findByPropsLazy } from "@webpack";
|
||||||
|
|
||||||
import * as t from "./types/classes";
|
import * as t from "./types/classes";
|
||||||
|
|
||||||
export const ModalImageClasses: t.ImageModalClasses = findLazy(m => m.image && m.modal && !m.applicationIcon);
|
|
||||||
export const ButtonWrapperClasses: t.ButtonWrapperClasses = findByPropsLazy("buttonWrapper", "buttonContent");
|
export const ButtonWrapperClasses: t.ButtonWrapperClasses = findByPropsLazy("buttonWrapper", "buttonContent");
|
||||||
|
|
5
src/webpack/common/types/classes.d.ts
vendored
5
src/webpack/common/types/classes.d.ts
vendored
|
@ -16,11 +16,6 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export interface ImageModalClasses {
|
|
||||||
image: string,
|
|
||||||
modal: string,
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ButtonWrapperClasses {
|
export interface ButtonWrapperClasses {
|
||||||
hoverScale: string;
|
hoverScale: string;
|
||||||
buttonWrapper: string;
|
buttonWrapper: string;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue