feat(organize): plugins and change names of some

This commit is contained in:
Cortex 2024-11-13 19:17:20 -06:00
parent e8e6663874
commit 40fba9e172
4 changed files with 229 additions and 160 deletions

View file

@ -0,0 +1,150 @@
/*
* Vencord, a Discord client mod
* Copyright (c) 2024 Vendicated and contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { NavContextMenuPatchCallback } from "@api/ContextMenu";
import { migratePluginSettings } from "@api/Settings";
import { CodeBlock } from "@components/CodeBlock";
import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import { getIntlMessage } from "@utils/discord";
import { Margins } from "@utils/margins";
import {
closeModal,
ModalCloseButton,
ModalContent,
ModalHeader,
ModalRoot,
ModalSize,
openModal,
} from "@utils/modal";
import definePlugin from "@utils/types";
import { Forms, Menu, Text } from "@webpack/common";
import { Message } from "discord-types/general";
migratePluginSettings("ViewRawVariant", "ViewRaw2");
type CustomMessage = Message & {
editHistory?: any;
deleted?: any;
firstEditTimestamp?: any;
};
const CopyIcon = () => {
return (
<svg
viewBox="0 0 20 20"
fill="currentColor"
aria-hidden="true"
width="18"
height="18"
>
<path d="M12.9297 3.25007C12.7343 3.05261 12.4154 3.05226 12.2196 3.24928L11.5746 3.89824C11.3811 4.09297 11.3808 4.40733 11.5739 4.60245L16.5685 9.64824C16.7614 9.84309 16.7614 10.1569 16.5685 10.3517L11.5739 15.3975C11.3808 15.5927 11.3811 15.907 11.5746 16.1017L12.2196 16.7507C12.4154 16.9477 12.7343 16.9474 12.9297 16.7499L19.2604 10.3517C19.4532 10.1568 19.4532 9.84314 19.2604 9.64832L12.9297 3.25007Z" />
<path d="M8.42616 4.60245C8.6193 4.40733 8.61898 4.09297 8.42545 3.89824L7.78047 3.24928C7.58466 3.05226 7.26578 3.05261 7.07041 3.25007L0.739669 9.64832C0.5469 9.84314 0.546901 10.1568 0.739669 10.3517L7.07041 16.7499C7.26578 16.9474 7.58465 16.9477 7.78047 16.7507L8.42545 16.1017C8.61898 15.907 8.6193 15.5927 8.42616 15.3975L3.43155 10.3517C3.23869 10.1569 3.23869 9.84309 3.43155 9.64824L8.42616 4.60245Z" />
</svg>
);
};
function cleanMessage(msg: CustomMessage) {
const author = { ...msg.author } as any;
delete author.email;
delete author.phone;
delete author.mfaEnabled;
delete author.personalConnectionId;
delete msg.editHistory;
delete msg.deleted;
delete msg.firstEditTimestamp;
return { ...msg, author };
}
function openViewRawModal(obj: any, type: string, isMessage?: boolean) {
const key = openModal((props) => (
<ErrorBoundary>
<ModalRoot {...props} size={ModalSize.LARGE}>
<ModalHeader>
<Text variant="heading-lg/semibold" style={{ flexGrow: 1 }}>
View Raw {type}
</Text>
<ModalCloseButton onClick={() => closeModal(key)} />
</ModalHeader>
<ModalContent>
<div style={{ padding: "16px 0" }}>
{isMessage && (
<>
<Forms.FormTitle tag="h5">
Content
</Forms.FormTitle>
<CodeBlock
content={obj.content}
lang="markdown"
/>
<Forms.FormDivider
className={Margins.bottom20}
/>
</>
)}
<Forms.FormTitle tag="h5">{type} Data</Forms.FormTitle>
<CodeBlock
content={JSON.stringify(obj, null, 4)}
lang="json"
/>
</div>
</ModalContent>
</ModalRoot>
</ErrorBoundary>
));
}
function makeContextCallback(
name: string,
action: (any) => void,
): NavContextMenuPatchCallback {
return (children, props) => {
if (props.label === getIntlMessage("CHANNEL_ACTIONS_MENU_LABEL"))
return; // random shit like notification settings
const value = props[name];
if (!value) return;
const lastChild = children.at(-1);
if (lastChild?.key === "developer-actions") {
const p = lastChild.props;
if (!Array.isArray(p.children)) p.children = [p.children];
children = p.children;
}
children.push(
<Menu.MenuItem
id={`c98-view-${name}-raw`}
label="View Raw"
action={() => action(value)}
icon={CopyIcon}
/>,
);
};
}
export default definePlugin({
name: "ViewRawVariant",
description:
"Copy/View raw content of any message, channel, or guild, but show in the right click menu.",
authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna, Devs.Kyuuhachi],
contextMenus: {
"guild-context": makeContextCallback("guild", (val) =>
openViewRawModal(val, "Guild"),
),
"channel-context": makeContextCallback("channel", (val) =>
openViewRawModal(val, "Channel"),
),
"user-context": makeContextCallback("user", (val) =>
openViewRawModal(val, "User"),
),
message: makeContextCallback("message", (val) =>
openViewRawModal(cleanMessage(val), "Message", true),
),
},
});

View file

@ -13,57 +13,64 @@ import { definePluginSettings } from "@api/Settings";
import { EquicordDevs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
const settings = definePluginSettings(
{
autoCapitalization: {
type: OptionType.BOOLEAN,
description: "Auto Capitalization to the first letter"
},
autoPunctuation: {
type: OptionType.BOOLEAN,
description: "Auto Punctuation at the end of a sentence"
},
autoWordReplacement: {
type: OptionType.BOOLEAN,
description: "Auto Capitalizes the first letter"
}
}
);
const settings = definePluginSettings({
autoCapitalization: {
type: OptionType.BOOLEAN,
description: "Auto Capitalization to the first letter",
},
autoPunctuation: {
type: OptionType.BOOLEAN,
description: "Auto Punctuation at the end of a sentence",
},
autoWordReplacement: {
type: OptionType.BOOLEAN,
description: "Auto Capitalizes the first letter",
},
});
const getPresend = dictionary => {
const getPresend = (dictionary) => {
const presendObject: SendListener = (_, msg) => {
msg.content = msg.content.trim();
if (!msg.content.includes("```") && /\w/.test(msg.content.charAt(0))) {
if (settings.store.autoWordReplacement) {
const re = new RegExp(
`(^|(?<=[^A-Z0-9]+))(${Object.keys(dictionary)
.map(k => k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
.map((k) => k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
.join("|")})((?=[^A-Z0-9]+)|$)`,
"gi"
"gi",
);
if (re !== null) {
msg.content = msg.content.replace(re, match => {
msg.content = msg.content.replace(re, (match) => {
return dictionary[match.toLowerCase()] || match;
});
}
}
if (settings.store.autoPunctuation) {
if (/[A-Z0-9]/i.test(msg.content.charAt(msg.content.length - 1))) {
if (!msg.content.startsWith("http", msg.content.lastIndexOf(" ") + 1))
if (
/[A-Z0-9]/i.test(msg.content.charAt(msg.content.length - 1))
) {
if (
!msg.content.startsWith(
"http",
msg.content.lastIndexOf(" ") + 1,
)
)
msg.content += ".";
}
}
// Ensure sentences are capitalized after punctuation
if (settings.store.autoCapitalization) {
msg.content = msg.content.replace(/([.!?])\s*(\w)/g, match =>
match.toUpperCase()
msg.content = msg.content.replace(/([.!?])\s*(\w)/g, (match) =>
match.toUpperCase(),
);
// Ensure the first character of the entire message is capitalized
if (!msg.content.startsWith("http")) {
msg.content = msg.content.charAt(0).toUpperCase() + msg.content.slice(1);
msg.content =
msg.content.charAt(0).toUpperCase() +
msg.content.slice(1);
}
}
}
@ -79,7 +86,7 @@ export default definePlugin({
settings,
async start() {
let dictionary = await fetch(
"https://raw.githubusercontent.com/wont-stream/dictionary/3d52fecd9aca5dfee0fcde0df2c2af357f977df7/index.min.json"
"https://raw.githubusercontent.com/wont-stream/dictionary/3d52fecd9aca5dfee0fcde0df2c2af357f977df7/index.min.json",
);
dictionary = await dictionary.json();

View file

@ -4,8 +4,16 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { addPreSendListener, removePreSendListener, SendListener, } from "@api/MessageEvents";
import { definePluginSettings, Settings } from "@api/Settings";
import {
addPreSendListener,
removePreSendListener,
SendListener,
} from "@api/MessageEvents";
import {
definePluginSettings,
migratePluginSettings,
Settings,
} from "@api/Settings";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
@ -13,18 +21,20 @@ const presendObject: SendListener = (channelId, msg) => {
msg.content = textProcessing(msg.content);
};
const settings = definePluginSettings(
{
blockedWords: {
type: OptionType.STRING,
description: "Words that will not be capitalised",
default: ""
}
});
migratePluginSettings("PolishWording", "Grammar");
const settings = definePluginSettings({
blockedWords: {
type: OptionType.STRING,
description: "Words that will not be capitalised",
default: "",
},
});
export default definePlugin({
name: "Grammar",
description: "Tweaks your messages to make them look nicer and have better grammar",
name: "PolishWording",
description:
"Tweaks your messages to make them look nicer and have better grammar",
authors: [Devs.Samwich],
dependencies: ["MessageEventsAPI"],
start() {
@ -33,7 +43,7 @@ export default definePlugin({
stop() {
removePreSendListener(presendObject);
},
settings
settings,
});
function textProcessing(input: string) {
@ -44,14 +54,18 @@ function textProcessing(input: string) {
}
function apostrophe(textInput: string): string {
const corrected = "wasn't, can't, don't, won't, isn't, aren't, haven't, hasn't, hadn't, doesn't, didn't, shouldn't, wouldn't, couldn't, i'm, you're, he's, she's, it's, they're, that's, who's, what's, there's, here's, how's, where's, when's, why's, let's, you'll, I'll, they'll, it'll, I've, you've, we've, they've, you'd, he'd, she'd, it'd, we'd, they'd, y'all".toLowerCase();
const corrected =
"wasn't, can't, don't, won't, isn't, aren't, haven't, hasn't, hadn't, doesn't, didn't, shouldn't, wouldn't, couldn't, i'm, you're, he's, she's, it's, they're, that's, who's, what's, there's, here's, how's, where's, when's, why's, let's, you'll, I'll, they'll, it'll, I've, you've, we've, they've, you'd, he'd, she'd, it'd, we'd, they'd, y'all".toLowerCase();
const words: string[] = corrected.split(", ");
const wordsInputted = textInput.split(" ");
wordsInputted.forEach(element => {
words.forEach(wordelement => {
wordsInputted.forEach((element) => {
words.forEach((wordelement) => {
if (removeApostrophes(wordelement) === element.toLowerCase()) {
wordsInputted[wordsInputted.indexOf(element)] = restoreCap(wordelement, getCapData(element));
wordsInputted[wordsInputted.indexOf(element)] = restoreCap(
wordelement,
getCapData(element),
);
}
});
});
@ -64,7 +78,6 @@ function getCapData(str: string) {
booleanArray.push(char === char.toUpperCase());
}
return booleanArray;
}
function removeApostrophes(str: string): string {
@ -90,20 +103,22 @@ function restoreCap(str: string, data: boolean[]): string {
}
function cap(textInput: string): string {
const sentences = textInput.split(/(?<=\w\.)\s/);
const blockedWordsArray: string[] = Settings.plugins.Grammar.blockedWords.split(", ");
const blockedWordsArray: string[] =
Settings.plugins.PolishWording.blockedWords.split(", ");
return sentences.map(element => {
if (!blockedWordsArray.some(word => element.toLowerCase().startsWith(word.toLowerCase()))) {
return element.charAt(0).toUpperCase() + element.slice(1);
}
else {
return element;
}
}).join(" ");
return sentences
.map((element) => {
if (
!blockedWordsArray.some((word) =>
element.toLowerCase().startsWith(word.toLowerCase()),
)
) {
return element.charAt(0).toUpperCase() + element.slice(1);
} else {
return element;
}
})
.join(" ");
}

View file

@ -1,103 +0,0 @@
/*
* Vencord, a Discord client mod
* Copyright (c) 2024 Vendicated and contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { NavContextMenuPatchCallback } from "@api/ContextMenu";
import { CodeBlock } from "@components/CodeBlock";
import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import { getIntlMessage } from "@utils/discord";
import { Margins } from "@utils/margins";
import { closeModal, ModalCloseButton, ModalContent, ModalHeader, ModalRoot, ModalSize, openModal } from "@utils/modal";
import definePlugin from "@utils/types";
import { Forms, Menu, Text } from "@webpack/common";
import { Message } from "discord-types/general";
type CustomMessage = Message & { editHistory?: any; deleted?: any; firstEditTimestamp?: any; };
const CopyIcon = () => {
return <svg viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" width="18" height="18">
<path d="M12.9297 3.25007C12.7343 3.05261 12.4154 3.05226 12.2196 3.24928L11.5746 3.89824C11.3811 4.09297 11.3808 4.40733 11.5739 4.60245L16.5685 9.64824C16.7614 9.84309 16.7614 10.1569 16.5685 10.3517L11.5739 15.3975C11.3808 15.5927 11.3811 15.907 11.5746 16.1017L12.2196 16.7507C12.4154 16.9477 12.7343 16.9474 12.9297 16.7499L19.2604 10.3517C19.4532 10.1568 19.4532 9.84314 19.2604 9.64832L12.9297 3.25007Z" />
<path d="M8.42616 4.60245C8.6193 4.40733 8.61898 4.09297 8.42545 3.89824L7.78047 3.24928C7.58466 3.05226 7.26578 3.05261 7.07041 3.25007L0.739669 9.64832C0.5469 9.84314 0.546901 10.1568 0.739669 10.3517L7.07041 16.7499C7.26578 16.9474 7.58465 16.9477 7.78047 16.7507L8.42545 16.1017C8.61898 15.907 8.6193 15.5927 8.42616 15.3975L3.43155 10.3517C3.23869 10.1569 3.23869 9.84309 3.43155 9.64824L8.42616 4.60245Z" />
</svg>;
};
function cleanMessage(msg: CustomMessage) {
const author = { ...msg.author } as any;
delete author.email;
delete author.phone;
delete author.mfaEnabled;
delete author.personalConnectionId;
delete msg.editHistory;
delete msg.deleted;
delete msg.firstEditTimestamp;
return { ...msg, author };
}
function openViewRawModal(obj: any, type: string, isMessage?: boolean) {
const key = openModal(props => (
<ErrorBoundary>
<ModalRoot {...props} size={ModalSize.LARGE}>
<ModalHeader>
<Text variant="heading-lg/semibold" style={{ flexGrow: 1 }}>View Raw {type}</Text>
<ModalCloseButton onClick={() => closeModal(key)} />
</ModalHeader>
<ModalContent>
<div style={{ padding: "16px 0" }}>
{isMessage && (
<>
<Forms.FormTitle tag="h5">Content</Forms.FormTitle>
<CodeBlock content={obj.content} lang="markdown" />
<Forms.FormDivider className={Margins.bottom20} />
</>
)}
<Forms.FormTitle tag="h5">{type} Data</Forms.FormTitle>
<CodeBlock content={JSON.stringify(obj, null, 4)} lang="json" />
</div>
</ModalContent >
</ModalRoot >
</ErrorBoundary >
));
}
function makeContextCallback(name: string, action: (any) => void): NavContextMenuPatchCallback {
return (children, props) => {
if (props.label === getIntlMessage("CHANNEL_ACTIONS_MENU_LABEL")) return; // random shit like notification settings
const value = props[name];
if (!value) return;
const lastChild = children.at(-1);
if (lastChild?.key === "developer-actions") {
const p = lastChild.props;
if (!Array.isArray(p.children))
p.children = [p.children];
children = p.children;
}
children.push(
<Menu.MenuItem
id={`c98-view-${name}-raw`}
label="View Raw"
action={() => action(value)}
icon={CopyIcon}
/>
);
};
}
export default definePlugin({
name: "ViewRaw2",
description: "Copy and view the raw content/data of any message, channel or guild",
authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna, Devs.Kyuuhachi],
contextMenus: {
"guild-context": makeContextCallback("guild", val => openViewRawModal(val, "Guild")),
"channel-context": makeContextCallback("channel", val => openViewRawModal(val, "Channel")),
"user-context": makeContextCallback("user", val => openViewRawModal(val, "User")),
"message": makeContextCallback("message", val => openViewRawModal(cleanMessage(val), "Message", true)),
}
});