allow configuring warn/kick/ban DMs + contact info

(someone needs to refactor the hot mess that is ServerDashboard.tsx aaa)
This commit is contained in:
JandereDev 2022-05-28 14:56:13 +02:00
parent 5546ec3c59
commit ad353463a6
No known key found for this signature in database
GPG key ID: 5D5E18ACB990F57A
3 changed files with 80 additions and 7 deletions

View file

@ -16,6 +16,9 @@ type ServerDetails = {
serverConfig: any,
users: User[],
channels: Channel[],
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: string,
}
app.get('/dash/server/:server', requireAuth({ permission: 0 }), async (req: Request, res: Response) => {
@ -118,10 +121,16 @@ app.put('/dash/server/:server/:option', async (req: Request, res: Response) => {
type RequestBody = {
prefix?: string,
spaceAfterPrefix?: boolean,
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: boolean,
}
if (!validateField('prefix', ['string'], 2) ||
!validateField('spaceAfterPrefix', ['boolean'], 2)
!validateField('spaceAfterPrefix', ['boolean'], 2) ||
!validateField('dmOnKick', ['boolean'], 2) ||
!validateField('dmOnWarn', ['boolean'], 2) ||
!validateField('contact', ['string'], 2)
) return;
const body: RequestBody = req.body;
@ -130,6 +139,9 @@ app.put('/dash/server/:server/:option', async (req: Request, res: Response) => {
$set: JSON.parse(JSON.stringify({ // Get rid of undefined fields
prefix: body.prefix == '' ? null : body.prefix,
spaceAfterPrefix: body.spaceAfterPrefix,
dmOnKick: body.dmOnKick,
dmOnWarn: body.dmOnWarn,
contact: body.contact,
})),
});

View file

@ -19,6 +19,9 @@ type ServerDetails = {
serverConfig?: ServerConfig,
users: APIUser[],
channels: APIChannel[],
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: string,
}
wsEvents.on('req:getUserServerDetails', async (data: ReqData, cb: (data: WSResponse) => void) => {
@ -80,6 +83,9 @@ wsEvents.on('req:getUserServerDetails', async (data: ReqData, cb: (data: WSRespo
type: c!.channel_type == 'VoiceChannel' ? 'VOICE' : 'TEXT',
icon: c!.generateIconURL(),
})),
dmOnKick: serverConfig?.dmOnKick,
dmOnWarn: serverConfig?.dmOnWarn,
contact: serverConfig?.contact,
}
cb({ success: true, server: response });

View file

@ -29,6 +29,9 @@ type Server = {
serverConfig?: { [key: string]: any },
users: User[],
channels: Channel[],
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: string,
}
type AntispamRule = {
@ -51,9 +54,18 @@ const ServerDashboard: FunctionComponent = () => {
const [serverInfo, setServerInfo] = useState({} as Server);
const [status, setStatus] = useState('');
const [changed, setChanged] = useState({} as { prefix?: boolean, prefixAllowSpace?: boolean });
const [changed, setChanged] = useState({} as {
prefix?: boolean,
prefixAllowSpace?: boolean,
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: boolean,
});
const [prefix, setPrefix] = useState('' as string|undefined);
const [prefixAllowSpace, setPrefixAllowSpace] = useState(false);
const [dmOnKick, setDmOnKick] = useState(false);
const [dmOnWarn, setDmOnWarn] = useState(false);
const [contact, setContact] = useState('');
const [botManagers, setBotManagers] = useState([] as string[]);
const [moderators, setModerators] = useState([] as string[]);
@ -68,6 +80,9 @@ const ServerDashboard: FunctionComponent = () => {
const payload = {
...(changed.prefix ? { prefix } : undefined),
...(changed.prefixAllowSpace ? { spaceAfterPrefix: prefixAllowSpace } : undefined),
...(changed.dmOnKick ? { dmOnKick } : undefined),
...(changed.dmOnWarn ? { dmOnWarn } : undefined),
...(changed.contact ? { contact: contact || null } : undefined),
}
const res = await axios.put(
@ -91,6 +106,9 @@ const ServerDashboard: FunctionComponent = () => {
setPrefix(server.serverConfig?.prefix || '');
setPrefixAllowSpace(!!server.serverConfig?.spaceAfterPrefix);
setDmOnKick(!!server.serverConfig?.dmOnKick);
setDmOnWarn(!!server.serverConfig?.dmOnWarn);
setContact(server.serverConfig?.contact || '');
setBotManagers(server.serverConfig?.botManagers ?? []);
setModerators(server.serverConfig?.moderators ?? []);
@ -190,10 +208,6 @@ const ServerDashboard: FunctionComponent = () => {
title="Allow space after prefix"
description={'Whether the bot recognizes a command if the prefix is followed by a space. Enable if your prefix is a word.'}
/>
<Button
style={{ marginTop: "16px" }}
onClick={saveConfig}
>Save</Button>
</>
<LineDivider />
@ -231,6 +245,47 @@ const ServerDashboard: FunctionComponent = () => {
</UserListContainer>
</UserListTypeContainer>
</>
<LineDivider />
<>
<H3>Infraction DMs</H3>
<Checkbox
title="DM on kick/ban"
description="If enabled, users will receive a DM when getting kicked or banned"
value={dmOnKick}
onChange={() => { setDmOnKick(!dmOnKick); setChanged({ ...changed, dmOnKick: true }) }}
/>
<Checkbox
title="DM on warn"
description="If enabled, users will receive a DM when getting warned"
value={dmOnWarn}
onChange={() => { setDmOnWarn(!dmOnWarn); setChanged({ ...changed, dmOnWarn: true }) }}
/>
<H3>Contact info</H3>
<H4>
Provide a link, email address or instructions for users on how to contact you.
If provided, this data will be sent along with warn/kick/ban DM messages.
</H4>
<InputBox
style={{ margin: '8px', width: 'calc(100% - 16px)' }}
title='Contact info'
placeholder='http/https URL, mailto link or custom text...'
value={contact}
onChange={e => { setContact(e.currentTarget.value); setChanged({ ...changed, contact: true }) }}
/>
<Button
style={{
position: "fixed",
right: '8px',
bottom: Object.values(changed).filter(i => i).length ? '8px' : '-40px',
}}
onClick={saveConfig}
>Save</Button>
</>
</div>
)}