|
|
|
@ -25,6 +25,7 @@ import { Logger } from "@utils/Logger";
|
|
|
|
|
import definePlugin, { OptionType } from "@utils/types";
|
|
|
|
|
import { findByPropsLazy, findStoreLazy, proxyLazyWebpack } from "@webpack";
|
|
|
|
|
import { Alerts, ChannelStore, EmojiStore, FluxDispatcher, Forms, lodash, Parser, PermissionsBits, PermissionStore, UploadHandler, UserSettingsActionCreators, UserStore } from "@webpack/common";
|
|
|
|
|
import type { CustomEmoji } from "@webpack/types";
|
|
|
|
|
import type { Message } from "discord-types/general";
|
|
|
|
|
import { applyPalette, GIFEncoder, quantize } from "gifenc";
|
|
|
|
|
import type { ReactElement, ReactNode } from "react";
|
|
|
|
@ -784,6 +785,16 @@ export default definePlugin({
|
|
|
|
|
UploadHandler.promptToUpload([file], ChannelStore.getChannel(channelId), DRAFT_TYPE);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
canUseEmote(e: CustomEmoji, channelId: string) {
|
|
|
|
|
if (e.require_colons === false) return true;
|
|
|
|
|
if (e.available === false) return false;
|
|
|
|
|
|
|
|
|
|
if (this.canUseEmotes)
|
|
|
|
|
return e.guildId === this.guildId || hasExternalEmojiPerms(channelId);
|
|
|
|
|
else
|
|
|
|
|
return !e.animated && e.guildId === this.guildId;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
start() {
|
|
|
|
|
const s = settings.store;
|
|
|
|
|
|
|
|
|
@ -882,12 +893,8 @@ export default definePlugin({
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (s.enableEmojiBypass) {
|
|
|
|
|
const canUseEmotes = this.canUseEmotes && hasExternalEmojiPerms(channelId);
|
|
|
|
|
|
|
|
|
|
for (const emoji of messageObj.validNonShortcutEmojis) {
|
|
|
|
|
if (!emoji.require_colons) continue;
|
|
|
|
|
if (emoji.available !== false && canUseEmotes) continue;
|
|
|
|
|
if (emoji.guildId === guildId && !emoji.animated) continue;
|
|
|
|
|
if (this.canUseEmote(emoji, channelId)) continue;
|
|
|
|
|
|
|
|
|
|
hasBypass = true;
|
|
|
|
|
|
|
|
|
@ -917,18 +924,12 @@ export default definePlugin({
|
|
|
|
|
this.preEdit = addPreEditListener(async (channelId, __, messageObj) => {
|
|
|
|
|
if (!s.enableEmojiBypass) return;
|
|
|
|
|
|
|
|
|
|
const { guildId } = this;
|
|
|
|
|
|
|
|
|
|
let hasBypass = false;
|
|
|
|
|
|
|
|
|
|
const canUseEmotes = this.canUseEmotes && hasExternalEmojiPerms(channelId);
|
|
|
|
|
|
|
|
|
|
messageObj.content = messageObj.content.replace(/(?<!\\)<a?:(?:\w+):(\d+)>/ig, (emojiStr, emojiId, offset, origStr) => {
|
|
|
|
|
const emoji = EmojiStore.getCustomEmojiById(emojiId);
|
|
|
|
|
if (emoji == null) return emojiStr;
|
|
|
|
|
if (!emoji.require_colons) return emojiStr;
|
|
|
|
|
if (emoji.available !== false && canUseEmotes) return emojiStr;
|
|
|
|
|
if (emoji.guildId === guildId && !emoji.animated) return emojiStr;
|
|
|
|
|
if (this.canUseEmote(emoji, channelId)) return emojiStr;
|
|
|
|
|
|
|
|
|
|
hasBypass = true;
|
|
|
|
|
|
|
|
|
|