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, serverConfig: any,
users: User[], users: User[],
channels: Channel[], channels: Channel[],
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: string,
} }
app.get('/dash/server/:server', requireAuth({ permission: 0 }), async (req: Request, res: Response) => { 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 = { type RequestBody = {
prefix?: string, prefix?: string,
spaceAfterPrefix?: boolean, spaceAfterPrefix?: boolean,
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: boolean,
} }
if (!validateField('prefix', ['string'], 2) || 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; ) return;
const body: RequestBody = req.body; 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 $set: JSON.parse(JSON.stringify({ // Get rid of undefined fields
prefix: body.prefix == '' ? null : body.prefix, prefix: body.prefix == '' ? null : body.prefix,
spaceAfterPrefix: body.spaceAfterPrefix, spaceAfterPrefix: body.spaceAfterPrefix,
dmOnKick: body.dmOnKick,
dmOnWarn: body.dmOnWarn,
contact: body.contact,
})), })),
}); });

View file

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

View file

@ -29,6 +29,9 @@ type Server = {
serverConfig?: { [key: string]: any }, serverConfig?: { [key: string]: any },
users: User[], users: User[],
channels: Channel[], channels: Channel[],
dmOnKick?: boolean,
dmOnWarn?: boolean,
contact?: string,
} }
type AntispamRule = { type AntispamRule = {
@ -51,10 +54,19 @@ const ServerDashboard: FunctionComponent = () => {
const [serverInfo, setServerInfo] = useState({} as Server); const [serverInfo, setServerInfo] = useState({} as Server);
const [status, setStatus] = useState(''); 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 [prefix, setPrefix] = useState('' as string|undefined);
const [prefixAllowSpace, setPrefixAllowSpace] = useState(false); 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 [botManagers, setBotManagers] = useState([] as string[]);
const [moderators, setModerators] = useState([] as string[]); const [moderators, setModerators] = useState([] as string[]);
@ -68,6 +80,9 @@ const ServerDashboard: FunctionComponent = () => {
const payload = { const payload = {
...(changed.prefix ? { prefix } : undefined), ...(changed.prefix ? { prefix } : undefined),
...(changed.prefixAllowSpace ? { spaceAfterPrefix: prefixAllowSpace } : 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( const res = await axios.put(
@ -91,6 +106,9 @@ const ServerDashboard: FunctionComponent = () => {
setPrefix(server.serverConfig?.prefix || ''); setPrefix(server.serverConfig?.prefix || '');
setPrefixAllowSpace(!!server.serverConfig?.spaceAfterPrefix); setPrefixAllowSpace(!!server.serverConfig?.spaceAfterPrefix);
setDmOnKick(!!server.serverConfig?.dmOnKick);
setDmOnWarn(!!server.serverConfig?.dmOnWarn);
setContact(server.serverConfig?.contact || '');
setBotManagers(server.serverConfig?.botManagers ?? []); setBotManagers(server.serverConfig?.botManagers ?? []);
setModerators(server.serverConfig?.moderators ?? []); setModerators(server.serverConfig?.moderators ?? []);
@ -190,10 +208,6 @@ const ServerDashboard: FunctionComponent = () => {
title="Allow space after prefix" 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.'} 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 /> <LineDivider />
@ -231,6 +245,47 @@ const ServerDashboard: FunctionComponent = () => {
</UserListContainer> </UserListContainer>
</UserListTypeContainer> </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> </div>
)} )}