mirror of
https://github.com/Equicord/Equicord.git
synced 2025-01-31 03:33:36 -05:00
Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
commit
b691d21edc
8 changed files with 78 additions and 16 deletions
|
@ -95,10 +95,9 @@ export default definePlugin({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
find: 'console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");',
|
find: '"AppCrashedFatalReport: getLastCrash not supported."',
|
||||||
all: true,
|
|
||||||
replacement: {
|
replacement: {
|
||||||
match: /console\.warn\("\[DEPRECATED\] Please use `subscribeWithSelector` middleware"\);/,
|
match: /console\.log\("AppCrashedFatalReport: getLastCrash not supported\."\);/,
|
||||||
replace: ""
|
replace: ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -21,6 +21,7 @@ import { ImageInvisible, ImageVisible } from "@components/Icons";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
import definePlugin from "@utils/types";
|
import definePlugin from "@utils/types";
|
||||||
import { ChannelStore } from "@webpack/common";
|
import { ChannelStore } from "@webpack/common";
|
||||||
|
import { MessageSnapshot } from "@webpack/types";
|
||||||
|
|
||||||
let style: HTMLStyleElement;
|
let style: HTMLStyleElement;
|
||||||
|
|
||||||
|
@ -39,7 +40,12 @@ export default definePlugin({
|
||||||
authors: [Devs.Ven],
|
authors: [Devs.Ven],
|
||||||
|
|
||||||
renderMessagePopoverButton(msg) {
|
renderMessagePopoverButton(msg) {
|
||||||
if (!msg.attachments.length && !msg.embeds.length && !msg.stickerItems.length) return null;
|
// @ts-ignore - discord-types lags behind discord.
|
||||||
|
const hasAttachmentsInShapshots = msg.messageSnapshots.some(
|
||||||
|
(snapshot: MessageSnapshot) => snapshot?.message.attachments.length
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!msg.attachments.length && !msg.embeds.length && !msg.stickerItems.length && !hasAttachmentsInShapshots) return null;
|
||||||
|
|
||||||
const isHidden = hiddenMessages.has(msg.id);
|
const isHidden = hiddenMessages.has(msg.id);
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,12 @@ export const settings = definePluginSettings({
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
const imageContextMenuPatch: NavContextMenuPatchCallback = children => {
|
const imageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => {
|
||||||
|
// Discord re-uses the image context menu for links to for the copy and open buttons
|
||||||
|
if ("href" in props) return;
|
||||||
|
// emojis in user statuses
|
||||||
|
if (props.target?.classList?.contains("emoji")) return;
|
||||||
|
|
||||||
const { square, nearestNeighbour } = settings.use(["square", "nearestNeighbour"]);
|
const { square, nearestNeighbour } = settings.use(["square", "nearestNeighbour"]);
|
||||||
|
|
||||||
children.push(
|
children.push(
|
||||||
|
|
|
@ -215,9 +215,9 @@ export default definePlugin({
|
||||||
},
|
},
|
||||||
collapseDeleted: {
|
collapseDeleted: {
|
||||||
type: OptionType.BOOLEAN,
|
type: OptionType.BOOLEAN,
|
||||||
description:
|
description: "Whether to collapse deleted messages, similar to blocked messages",
|
||||||
"Whether to collapse deleted messages, similar to blocked messages",
|
|
||||||
default: false,
|
default: false,
|
||||||
|
restartNeeded: true,
|
||||||
},
|
},
|
||||||
logEdits: {
|
logEdits: {
|
||||||
type: OptionType.BOOLEAN,
|
type: OptionType.BOOLEAN,
|
||||||
|
|
|
@ -34,6 +34,7 @@ const enum Tabs {
|
||||||
ServerInfo,
|
ServerInfo,
|
||||||
Friends,
|
Friends,
|
||||||
BlockedUsers,
|
BlockedUsers,
|
||||||
|
IgnoredUsers,
|
||||||
MutualMembers
|
MutualMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +48,8 @@ interface RelationshipProps extends GuildProps {
|
||||||
|
|
||||||
const fetched = {
|
const fetched = {
|
||||||
friends: false,
|
friends: false,
|
||||||
blocked: false
|
blocked: false,
|
||||||
|
ignored: false
|
||||||
};
|
};
|
||||||
|
|
||||||
function renderTimestamp(timestamp: number) {
|
function renderTimestamp(timestamp: number) {
|
||||||
|
@ -59,11 +61,13 @@ function renderTimestamp(timestamp: number) {
|
||||||
function GuildInfoModal({ guild }: GuildProps) {
|
function GuildInfoModal({ guild }: GuildProps) {
|
||||||
const [friendCount, setFriendCount] = useState<number>();
|
const [friendCount, setFriendCount] = useState<number>();
|
||||||
const [blockedCount, setBlockedCount] = useState<number>();
|
const [blockedCount, setBlockedCount] = useState<number>();
|
||||||
|
const [ignoredCount, setIgnoredCount] = useState<number>();
|
||||||
const [mutualMembersCount, setMutualMembersCount] = useState<number>();
|
const [mutualMembersCount, setMutualMembersCount] = useState<number>();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetched.friends = false;
|
fetched.friends = false;
|
||||||
fetched.blocked = false;
|
fetched.blocked = false;
|
||||||
|
fetched.ignored = false;
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const [currentTab, setCurrentTab] = useState(Tabs.ServerInfo);
|
const [currentTab, setCurrentTab] = useState(Tabs.ServerInfo);
|
||||||
|
@ -122,25 +126,55 @@ function GuildInfoModal({ guild }: GuildProps) {
|
||||||
className={cl("tab", { selected: currentTab === Tabs.ServerInfo })}
|
className={cl("tab", { selected: currentTab === Tabs.ServerInfo })}
|
||||||
id={Tabs.ServerInfo}
|
id={Tabs.ServerInfo}
|
||||||
>
|
>
|
||||||
|
<div style={{ textAlign: "center" }}>
|
||||||
|
<div>
|
||||||
Server Info
|
Server Info
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</TabBar.Item>
|
</TabBar.Item>
|
||||||
<TabBar.Item
|
<TabBar.Item
|
||||||
className={cl("tab", { selected: currentTab === Tabs.Friends })}
|
className={cl("tab", { selected: currentTab === Tabs.Friends })}
|
||||||
id={Tabs.Friends}
|
id={Tabs.Friends}
|
||||||
>
|
>
|
||||||
Friends{friendCount !== undefined ? ` (${friendCount})` : ""}
|
<div style={{ textAlign: "center" }}>
|
||||||
|
<div>
|
||||||
|
Friends
|
||||||
|
</div>
|
||||||
|
{friendCount !== undefined ? ` (${friendCount})` : ""}
|
||||||
|
</div>
|
||||||
</TabBar.Item>
|
</TabBar.Item>
|
||||||
<TabBar.Item
|
<TabBar.Item
|
||||||
className={cl("tab", { selected: currentTab === Tabs.MutualMembers })}
|
className={cl("tab", { selected: currentTab === Tabs.MutualMembers })}
|
||||||
id={Tabs.MutualMembers}
|
id={Tabs.MutualMembers}
|
||||||
>
|
>
|
||||||
Mutual Server Members{mutualMembersCount !== undefined ? ` (${mutualMembersCount})` : ""}
|
<div style={{ textAlign: "center" }}>
|
||||||
|
<div>
|
||||||
|
Mutual Users
|
||||||
|
</div>{mutualMembersCount !== undefined ? ` (${mutualMembersCount})` : ""}
|
||||||
|
</div>
|
||||||
</TabBar.Item>
|
</TabBar.Item>
|
||||||
<TabBar.Item
|
<TabBar.Item
|
||||||
className={cl("tab", { selected: currentTab === Tabs.BlockedUsers })}
|
className={cl("tab", { selected: currentTab === Tabs.BlockedUsers })}
|
||||||
id={Tabs.BlockedUsers}
|
id={Tabs.BlockedUsers}
|
||||||
>
|
>
|
||||||
Blocked Users{blockedCount !== undefined ? ` (${blockedCount})` : ""}
|
<div style={{ textAlign: "center" }}>
|
||||||
|
<div>
|
||||||
|
Blocked Users
|
||||||
|
</div>
|
||||||
|
{blockedCount !== undefined ? ` (${blockedCount})` : ""}
|
||||||
|
</div>
|
||||||
|
</TabBar.Item>
|
||||||
|
<TabBar.Item
|
||||||
|
className={cl("tab", { selected: currentTab === Tabs.IgnoredUsers })}
|
||||||
|
id={Tabs.IgnoredUsers}
|
||||||
|
>
|
||||||
|
<div style={{ textAlign: "center" }}>
|
||||||
|
<div>
|
||||||
|
Ignored Users
|
||||||
|
</div>
|
||||||
|
{ignoredCount !== undefined ? `(${ignoredCount})` : ""}
|
||||||
|
|
||||||
|
</div>
|
||||||
</TabBar.Item>
|
</TabBar.Item>
|
||||||
</TabBar>
|
</TabBar>
|
||||||
|
|
||||||
|
@ -149,6 +183,7 @@ function GuildInfoModal({ guild }: GuildProps) {
|
||||||
{currentTab === Tabs.Friends && <FriendsTab guild={guild} setCount={setFriendCount} />}
|
{currentTab === Tabs.Friends && <FriendsTab guild={guild} setCount={setFriendCount} />}
|
||||||
{currentTab === Tabs.MutualMembers && <MutualMembersTab guild={guild} setCount={setMutualMembersCount} />}
|
{currentTab === Tabs.MutualMembers && <MutualMembersTab guild={guild} setCount={setMutualMembersCount} />}
|
||||||
{currentTab === Tabs.BlockedUsers && <BlockedUsersTab guild={guild} setCount={setBlockedCount} />}
|
{currentTab === Tabs.BlockedUsers && <BlockedUsersTab guild={guild} setCount={setBlockedCount} />}
|
||||||
|
{currentTab === Tabs.IgnoredUsers && <IgnoredUserTab guild={guild} setCount={setIgnoredCount} />}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -222,7 +257,13 @@ function BlockedUsersTab({ guild, setCount }: RelationshipProps) {
|
||||||
return UserList("blocked", guild, blockedIds, setCount);
|
return UserList("blocked", guild, blockedIds, setCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
function UserList(type: "friends" | "blocked", guild: Guild, ids: string[], setCount: (count: number) => void) {
|
function IgnoredUserTab({ guild, setCount }: RelationshipProps) {
|
||||||
|
const ignoredIds = Object.keys(RelationshipStore.getRelationships()).filter(id => RelationshipStore.isIgnored(id));
|
||||||
|
return UserList("ignored", guild, ignoredIds, setCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function UserList(type: "friends" | "blocked" | "ignored", guild: Guild, ids: string[], setCount: (count: number) => void) {
|
||||||
const missing = [] as string[];
|
const missing = [] as string[];
|
||||||
const members = [] as string[];
|
const members = [] as string[];
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,18 @@ import { ImageInvisible, ImageVisible } from "@components/Icons";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
import definePlugin from "@utils/types";
|
import definePlugin from "@utils/types";
|
||||||
import { Constants, Menu, PermissionsBits, PermissionStore, RestAPI, UserStore } from "@webpack/common";
|
import { Constants, Menu, PermissionsBits, PermissionStore, RestAPI, UserStore } from "@webpack/common";
|
||||||
|
import { MessageSnapshot } from "@webpack/types";
|
||||||
|
|
||||||
|
|
||||||
const EMBED_SUPPRESSED = 1 << 2;
|
const EMBED_SUPPRESSED = 1 << 2;
|
||||||
|
|
||||||
const messageContextMenuPatch: NavContextMenuPatchCallback = (children, { channel, message: { author, embeds, flags, id: messageId } }) => {
|
const messageContextMenuPatch: NavContextMenuPatchCallback = (children, { channel, message: { author, messageSnapshots, embeds, flags, id: messageId } }) => {
|
||||||
const isEmbedSuppressed = (flags & EMBED_SUPPRESSED) !== 0;
|
const isEmbedSuppressed = (flags & EMBED_SUPPRESSED) !== 0;
|
||||||
if (!isEmbedSuppressed && !embeds.length) return;
|
const hasEmbedsInSnapshots = messageSnapshots.some(
|
||||||
|
(snapshot: MessageSnapshot) => snapshot?.message.embeds.length
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isEmbedSuppressed && !embeds.length && !hasEmbedsInSnapshots) return;
|
||||||
|
|
||||||
const hasEmbedPerms = channel.isPrivate() || !!(PermissionStore.getChannelPermissions({ id: channel.id }) & PermissionsBits.EMBED_LINKS);
|
const hasEmbedPerms = channel.isPrivate() || !!(PermissionStore.getChannelPermissions({ id: channel.id }) & PermissionsBits.EMBED_LINKS);
|
||||||
if (author.id === UserStore.getCurrentUser().id && !hasEmbedPerms) return;
|
if (author.id === UserStore.getCurrentUser().id && !hasEmbedPerms) return;
|
||||||
|
|
|
@ -50,6 +50,7 @@ export let GuildMemberStore: Stores.GuildMemberStore & t.FluxStore;
|
||||||
export let RelationshipStore: Stores.RelationshipStore & t.FluxStore & {
|
export let RelationshipStore: Stores.RelationshipStore & t.FluxStore & {
|
||||||
/** Get the date (as a string) that the relationship was created */
|
/** Get the date (as a string) that the relationship was created */
|
||||||
getSince(userId: string): string;
|
getSince(userId: string): string;
|
||||||
|
isIgnored(userId: string): boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export let EmojiStore: t.EmojiStore;
|
export let EmojiStore: t.EmojiStore;
|
||||||
|
|
6
src/webpack/common/types/utils.d.ts
vendored
6
src/webpack/common/types/utils.d.ts
vendored
|
@ -16,7 +16,7 @@
|
||||||
* 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 { Channel, Guild, GuildMember, User } from "discord-types/general";
|
import { Channel, Guild, GuildMember, Message, User } from "discord-types/general";
|
||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
import { LiteralUnion } from "type-fest";
|
import { LiteralUnion } from "type-fest";
|
||||||
|
|
||||||
|
@ -135,6 +135,10 @@ export type Permissions = "CREATE_INSTANT_INVITE"
|
||||||
|
|
||||||
export type PermissionsBits = Record<Permissions, bigint>;
|
export type PermissionsBits = Record<Permissions, bigint>;
|
||||||
|
|
||||||
|
export interface MessageSnapshot {
|
||||||
|
message: Message;
|
||||||
|
}
|
||||||
|
|
||||||
export interface Locale {
|
export interface Locale {
|
||||||
name: string;
|
name: string;
|
||||||
value: string;
|
value: string;
|
||||||
|
|
Loading…
Reference in a new issue