temp commit

This commit is contained in:
janderedev 2022-03-20 22:00:57 +01:00
parent 41630149b3
commit 359226229d
Signed by: Lea
GPG key ID: 5D5E18ACB990F57A
4 changed files with 126 additions and 6 deletions

View file

@ -100,6 +100,27 @@ app.put('/dash/server/:server/:option', async (req: Request, res: Response) => {
return;
}
case 'votekickTrusted': {
if (!item || typeof item != 'string') return badRequest(res);
if (permissionLevel < 1) return res.status(403).send({ error: 'You are not allowed to mark roles as trusted.' });
const serverRes = await botReq('getUserServerDetails', { user: user, server: server });
if (!serverRes.success) {
return res.status(serverRes.statusCode ?? 500).send({ error: serverRes.error });
}
if (!serverRes.roles.find((r: any) => r.id == item)) {
return res.status(404).send({ error: 'The specified role does not appear to exist' });
}
const newRoles = [ ...(settings.votekick.trustedRoles ?? []), item.toUpperCase() ];
await servers.update({ id: server }, { $set: { 'votekick.trustedRoles': newRoles } });
res.send({
success: true,
roles: newRoles,
});
}
case 'config': {
function validateField(field: string, type: string[], level: 0|1|2|3): boolean {
if (permissionLevel < level) {

View file

@ -19,6 +19,16 @@ type ServerDetails = {
serverConfig?: ServerConfig,
users: APIUser[],
channels: APIChannel[],
roles: {
id: string,
name: string,
color?: string,
rank?: number,
perms: {
server: number,
channel: number,
}
}[],
}
wsEvents.on('req:getUserServerDetails', async (data: ReqData, cb: (data: WSResponse) => void) => {
@ -80,6 +90,18 @@ wsEvents.on('req:getUserServerDetails', async (data: ReqData, cb: (data: WSRespo
type: c!.channel_type == 'VoiceChannel' ? 'VOICE' : 'TEXT',
icon: c!.generateIconURL(),
})),
roles: server.roles
? Object.entries(server.roles).map(r => ({
id: r[0],
name: r[1].name,
color: r[1].colour,
rank: r[1].rank,
perms: {
server: r[1].permissions[0],
channel: r[1].permissions[1],
},
}))
: [],
}
cb({ success: true, server: response });

View file

@ -1,3 +1,7 @@
a:hover {
text-decoration: underline;
}
}
.fgtext {
color: var(--foreground);
}

View file

@ -46,10 +46,19 @@ 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,
votekickEnabled?: boolean,
votekickRequired?: number,
votekickDuration?: number,
});
const [prefix, setPrefix] = useState('' as string|undefined);
const [prefixAllowSpace, setPrefixAllowSpace] = useState(false);
const [votekickEnabled, setVotekickEnabled] = useState(false);
const [votekickRequired, setVotekickRequired] = useState(0);
const [votekickDuration, setVotekickDuration] = useState(0);
const [botManagers, setBotManagers] = useState([] as string[]);
const [moderators, setModerators] = useState([] as string[]);
@ -86,6 +95,9 @@ const ServerDashboard: FunctionComponent = () => {
setPrefix(server.serverConfig?.prefix || '');
setPrefixAllowSpace(!!server.serverConfig?.spaceAfterPrefix);
setVotekickEnabled(!!server.serverConfig?.votekick?.enabled);
setVotekickRequired(server.serverConfig?.votekick?.votesRequired ?? 0);
setVotekickDuration(server.serverConfig?.votekick?.banDuration ?? 0);
setBotManagers(server.serverConfig?.botManagers ?? []);
setModerators(server.serverConfig?.moderators ?? []);
@ -160,7 +172,7 @@ const ServerDashboard: FunctionComponent = () => {
/>
<div hidden={Object.keys(serverInfo).length == 0}>
<div style={{ paddingLeft: '10px', paddingRight: '10px' }}>
<div style={{ paddingLeft: '10px', paddingRight: '10px', paddingBottom: '20px' }}>
{category == 'home' && (
<>
@ -226,6 +238,67 @@ const ServerDashboard: FunctionComponent = () => {
</UserListContainer>
</UserListTypeContainer>
</>
<LineDivider />
<H3>Votekick</H3>
<H4>
Votekick allows trusted members to temporarily remove members
while no moderator is online.
</H4>
<Checkbox
value={votekickEnabled}
onChange={() => {
setVotekickEnabled(!votekickEnabled);
setChanged({ ...changed, votekickEnabled: true });
}}
title="Enabled"
description="Whether users are allowed to votekick"
style={{ marginBottom: '12px' }}
/>
<H3>Votes required</H3>
<H4>How many trusted members need to vote in order for the user to be removed.</H4>
<InputBox
style={{
width: '150px',
margin: '16px 0 0 0',
}}
onChange={e => {
if (e.currentTarget.value != '' && !isNaN(Number(e.currentTarget.value))) {
if (Number(e.currentTarget.value) < 0) return;
setVotekickRequired(Number(e.currentTarget.value));
setChanged({ ...changed, votekickRequired: Number(e.currentTarget.value) })
}
}}
placeholder='3'
value={votekickRequired}
/>
<H3>Ban duration</H3>
<H4>How long the user will be banned for. Set to 0 for permanent or -1 to kick the user without banning.</H4>
<InputBox
style={{
width: '150px',
margin: '16px 0 0 0',
}}
onChange={e => {
if (e.currentTarget.value == '-') e.currentTarget.value = '-1';
if (e.currentTarget.value != '' && !isNaN(Number(e.currentTarget.value))) {
if (Number(e.currentTarget.value) < -1) return;
setVotekickDuration(Number(e.currentTarget.value));
setChanged({ ...changed, votekickDuration: Number(e.currentTarget.value) })
}
}}
placeholder='3'
value={votekickDuration}
/>
<UserListTypeContainer>
<UserListContainer disabled={!serverInfo.perms} >
<InputBox />
</UserListContainer>
</UserListTypeContainer>
</>
)}
@ -392,10 +465,10 @@ const ServerDashboard: FunctionComponent = () => {
);
}
function UserListAddField(props: { type: 'MANAGER'|'MOD' }) {
function UserListAddField(props: { type: 'MANAGER'|'MOD'|'TRUSTED' }) {
const [content, setContent] = useState('');
const onConfirm = useCallback(async () => {0
const onConfirm = useCallback(async () => {
if (content.length) {
const res = await axios.put(
`${API_URL}/dash/server/${serverid}/${props.type == 'MANAGER' ? 'managers' : 'mods'}`,