mirror of
https://github.com/janderedev/automod.git
synced 2025-07-07 11:10:37 +00:00
temp commit
This commit is contained in:
parent
41630149b3
commit
359226229d
|
@ -100,6 +100,27 @@ app.put('/dash/server/:server/:option', async (req: Request, res: Response) => {
|
||||||
return;
|
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': {
|
case 'config': {
|
||||||
function validateField(field: string, type: string[], level: 0|1|2|3): boolean {
|
function validateField(field: string, type: string[], level: 0|1|2|3): boolean {
|
||||||
if (permissionLevel < level) {
|
if (permissionLevel < level) {
|
||||||
|
|
|
@ -19,6 +19,16 @@ type ServerDetails = {
|
||||||
serverConfig?: ServerConfig,
|
serverConfig?: ServerConfig,
|
||||||
users: APIUser[],
|
users: APIUser[],
|
||||||
channels: APIChannel[],
|
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) => {
|
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',
|
type: c!.channel_type == 'VoiceChannel' ? 'VOICE' : 'TEXT',
|
||||||
icon: c!.generateIconURL(),
|
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 });
|
cb({ success: true, server: response });
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
a:hover {
|
a:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fgtext {
|
||||||
|
color: var(--foreground);
|
||||||
|
}
|
||||||
|
|
|
@ -46,10 +46,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,
|
||||||
|
votekickEnabled?: boolean,
|
||||||
|
votekickRequired?: number,
|
||||||
|
votekickDuration?: number,
|
||||||
|
});
|
||||||
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 [votekickEnabled, setVotekickEnabled] = useState(false);
|
||||||
|
const [votekickRequired, setVotekickRequired] = useState(0);
|
||||||
|
const [votekickDuration, setVotekickDuration] = useState(0);
|
||||||
|
|
||||||
const [botManagers, setBotManagers] = useState([] as string[]);
|
const [botManagers, setBotManagers] = useState([] as string[]);
|
||||||
const [moderators, setModerators] = useState([] as string[]);
|
const [moderators, setModerators] = useState([] as string[]);
|
||||||
|
|
||||||
|
@ -86,6 +95,9 @@ const ServerDashboard: FunctionComponent = () => {
|
||||||
|
|
||||||
setPrefix(server.serverConfig?.prefix || '');
|
setPrefix(server.serverConfig?.prefix || '');
|
||||||
setPrefixAllowSpace(!!server.serverConfig?.spaceAfterPrefix);
|
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 ?? []);
|
setBotManagers(server.serverConfig?.botManagers ?? []);
|
||||||
setModerators(server.serverConfig?.moderators ?? []);
|
setModerators(server.serverConfig?.moderators ?? []);
|
||||||
|
@ -160,7 +172,7 @@ const ServerDashboard: FunctionComponent = () => {
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div hidden={Object.keys(serverInfo).length == 0}>
|
<div hidden={Object.keys(serverInfo).length == 0}>
|
||||||
<div style={{ paddingLeft: '10px', paddingRight: '10px' }}>
|
<div style={{ paddingLeft: '10px', paddingRight: '10px', paddingBottom: '20px' }}>
|
||||||
|
|
||||||
{category == 'home' && (
|
{category == 'home' && (
|
||||||
<>
|
<>
|
||||||
|
@ -226,6 +238,67 @@ const ServerDashboard: FunctionComponent = () => {
|
||||||
</UserListContainer>
|
</UserListContainer>
|
||||||
</UserListTypeContainer>
|
</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 [content, setContent] = useState('');
|
||||||
|
|
||||||
const onConfirm = useCallback(async () => {0
|
const onConfirm = useCallback(async () => {
|
||||||
if (content.length) {
|
if (content.length) {
|
||||||
const res = await axios.put(
|
const res = await axios.put(
|
||||||
`${API_URL}/dash/server/${serverid}/${props.type == 'MANAGER' ? 'managers' : 'mods'}`,
|
`${API_URL}/dash/server/${serverid}/${props.type == 'MANAGER' ? 'managers' : 'mods'}`,
|
||||||
|
|
Loading…
Reference in a new issue