h
This commit is contained in:
commit
562e8065c2
3 changed files with 177 additions and 0 deletions
59
Modals.tsx
Normal file
59
Modals.tsx
Normal file
|
@ -0,0 +1,59 @@
|
|||
import ErrorBoundary from "@components/ErrorBoundary";
|
||||
import { openModal, ModalRoot, ModalSize, ModalHeader, ModalCloseButton, ModalContent, closeModal, closeAllModals } from "@utils/modal";
|
||||
import { Button, Forms, Parser, TextInput } from "@webpack/common";
|
||||
import { cl } from "plugins/memberCount";
|
||||
import { SelectedChannelStore, useState } from "@webpack/common";
|
||||
import "./style.css";
|
||||
import { sendMessage } from "@utils/discord";
|
||||
|
||||
export function showPrefefinedDurationModal(duration: string, id: string) {
|
||||
let reason = "";
|
||||
openModal(props =>
|
||||
<>
|
||||
<ErrorBoundary>
|
||||
<ModalRoot {...props} size={ModalSize.DYNAMIC} fullscreenOnMobile={true} >
|
||||
<ModalHeader className={cl("header")}>
|
||||
<Forms.FormText style={{ fontSize: "1.2rem", fontWeight: "bold", marginRight: "7px" }}>Mute user</Forms.FormText>
|
||||
</ModalHeader>
|
||||
<ModalContent>
|
||||
<TextInput onChange={v => { reason = v; }} placeholder="Reason" className="vc-punishcommands-reason" />
|
||||
<div className="vc-punishcommands-button-container">
|
||||
<Button color={Button.Colors.RED} onClick={() => {
|
||||
sendMessage(SelectedChannelStore.getChannelId(), { content: `+Cg ${id} ${duration} ${reason}` });
|
||||
closeAllModals();
|
||||
}}>Mute</Button>
|
||||
</div>
|
||||
</ModalContent>
|
||||
</ModalRoot>
|
||||
</ErrorBoundary>
|
||||
</>
|
||||
);
|
||||
}
|
||||
export function showCustomDurationModal(id: string) {
|
||||
let duration = "";
|
||||
let reason = "";
|
||||
let pendingSend = false;
|
||||
openModal(props =>
|
||||
<>
|
||||
<ErrorBoundary>
|
||||
<ModalRoot {...props} size={ModalSize.DYNAMIC} fullscreenOnMobile={true} >
|
||||
<ModalHeader className={cl("header")}>
|
||||
<Forms.FormText style={{ fontSize: "1.2rem", fontWeight: "bold", marginRight: "7px" }}>Mute user</Forms.FormText>
|
||||
</ModalHeader>
|
||||
<ModalContent>
|
||||
<TextInput onChange={v => { duration = v; }} placeholder="Duration (as written in the command)" className="vc-punishcommands-duration-c" />
|
||||
<TextInput onChange={v => { reason = v; }} placeholder="Reason" className="vc-punishcommands-reason-c" />
|
||||
<div className="vc-punishcommands-button-container">
|
||||
<Button color={Button.Colors.RED} onClick={() => {
|
||||
if (pendingSend) return;
|
||||
pendingSend = true;
|
||||
sendMessage(SelectedChannelStore.getChannelId(), { content: `+Cg ${id} ${duration} ${reason}` });
|
||||
closeAllModals();
|
||||
}}>Mute</Button>
|
||||
</div>
|
||||
</ModalContent>
|
||||
</ModalRoot>
|
||||
</ErrorBoundary>
|
||||
</>
|
||||
);
|
||||
}
|
63
index.tsx
Normal file
63
index.tsx
Normal file
|
@ -0,0 +1,63 @@
|
|||
import { NavContextMenuPatchCallback } from "@api/ContextMenu";
|
||||
import { ImageIcon, SafetyIcon } from "@components/Icons";
|
||||
import { Devs } from "@utils/constants";
|
||||
import definePlugin from "@utils/types";
|
||||
import { showCustomDurationModal, showPrefefinedDurationModal } from "./Modals";
|
||||
import { GuildMemberStore, i18n, IconUtils, Menu, SelectedGuildStore } from "@webpack/common";
|
||||
import { UserContextProps } from "plugins/biggerStreamPreview";
|
||||
|
||||
/**** BEGIN CONFIG ****/
|
||||
const GUILD_ID = "1274790619146879108"; // SERVER ID
|
||||
/**** END CONFIG ****/
|
||||
|
||||
const UserContext: NavContextMenuPatchCallback = (children, { user }: UserContextProps) => {
|
||||
if (!user) return;
|
||||
children.splice(-3, 0,
|
||||
(
|
||||
<>
|
||||
{SelectedGuildStore.getGuildId() === GUILD_ID &&
|
||||
<>
|
||||
<Menu.MenuItem id="vc-staff" label="Staff">
|
||||
<Menu.MenuItem
|
||||
id="mute-1h"
|
||||
color="#ff0000"
|
||||
label="Mute for 1 hour"
|
||||
action={() => {
|
||||
showPrefefinedDurationModal("1h", user.id);
|
||||
}}
|
||||
icon={SafetyIcon}
|
||||
/>
|
||||
<Menu.MenuItem
|
||||
id="mute-2h"
|
||||
color="#ff0000"
|
||||
label="Mute for 2 hours"
|
||||
action={() => {
|
||||
showPrefefinedDurationModal("2h", user.id);
|
||||
}}
|
||||
icon={SafetyIcon}
|
||||
/>
|
||||
<Menu.MenuItem
|
||||
id="mute-custom"
|
||||
color="#ff0000"
|
||||
label="Mute (custom duration)"
|
||||
action={() => {
|
||||
showCustomDurationModal(user.id);
|
||||
}}
|
||||
icon={SafetyIcon}
|
||||
/>
|
||||
</Menu.MenuItem>
|
||||
</>
|
||||
}
|
||||
</>
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
export default definePlugin({
|
||||
name: "PunishmentCommands",
|
||||
description: "Allows you to send a command in chat to punish someone, right from the context menu",
|
||||
authors: [Devs.nin0dev],
|
||||
contextMenus: {
|
||||
"user-context": UserContext
|
||||
}
|
||||
});
|
55
style.css
Normal file
55
style.css
Normal file
|
@ -0,0 +1,55 @@
|
|||
/* stylelint-disable selector-id-pattern */
|
||||
/* stylelint-disable declaration-block-no-redundant-longhand-properties */
|
||||
#user-context-vc-staff--mute-1h {
|
||||
color: var(--status-danger);
|
||||
}
|
||||
|
||||
#user-context-vc-staff--mute-1h[class*="focused"] {
|
||||
background-color: var(--menu-item-danger-hover-bg);
|
||||
color: white;
|
||||
}
|
||||
|
||||
#user-context-vc-staff--mute-2h {
|
||||
color: var(--status-danger);
|
||||
}
|
||||
|
||||
#user-context-vc-staff--mute-2h[class*="focused"] {
|
||||
background-color: var(--menu-item-danger-hover-bg);
|
||||
color: white;
|
||||
}
|
||||
|
||||
#user-context-vc-staff--mute-custom {
|
||||
color: var(--status-danger);
|
||||
}
|
||||
|
||||
#user-context-vc-staff--mute-custom[class*="focused"] {
|
||||
background-color: var(--menu-item-danger-hover-bg);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.vc-punishcommands-reason {
|
||||
margin: 20px;
|
||||
min-width: 500px;
|
||||
}
|
||||
|
||||
.vc-punishcommands-button-container * {
|
||||
margin-left: auto;
|
||||
margin-right: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.vc-punishcommands-duration-c {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
min-width: 500px;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.vc-punishcommands-reason-c {
|
||||
margin-bottom: 20px;
|
||||
min-width: 500px;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
Loading…
Reference in a new issue