dyno-bot/Dyno-web-premium-before-reset/react/dashboard/automod/Settings.jsx
2020-09-12 19:08:48 +01:00

272 lines
9.5 KiB
JavaScript

import React from 'react';
import SettingSelector from './SettingSelector.jsx';
import SettingCheckbox from '../common/SettingCheckbox.jsx';
import RichSettingSelect from '../common/RichSettingSelect.jsx';
import RichMultiSelect from '../common/RichMultiSelect.jsx';
import RichNumber from '../common/RichNumber.jsx';
import { updateModuleSetting } from '../service/dashboardService.js';
export default class SettingsTab extends React.Component {
state = {
automod: {},
channels: [],
ignoredChannels: [],
roles: [],
ignoredRoles: [],
selectedValue: null,
channel: false,
}
componentDidMount() {
this.updateStateWithProps(this.props);
}
componentWillReceiveProps(props) {
this.updateStateWithProps(props);
}
updateStateWithProps(props) {
let { automod, channels, roles } = props;
automod = automod || {};
this.setState({
automod,
channels: channels || false,
channel: automod.channel || false,
ignoredChannels: automod.ignoredChannels || [],
roles: roles || false,
ignoredRoles: automod.ignoredRoles || [],
});
}
handleLogChannel = (selectedOption) => {
this.setState({ channel: selectedOption.value || false });
}
handleIgnoredChannels = (props, selectedOptions) => {
const ignoredChannels = selectedOptions.map(o => ({ id: o.value, name: o.label }));
updateModuleSetting(props.module, 'ignoredChannels', ignoredChannels, 'Ignored Channels');
this.setState({ ignoredChannels });
}
handleAllowedRoles = (props, selectedOptions) => {
const ignoredRoles = selectedOptions.map(o => ({ id: o.value, name: o.label }));
updateModuleSetting(props.module, 'ignoredRoles', ignoredRoles, 'Allowed Roles');
this.setState({ ignoredRoles });
}
getDefaultValue(setting) {
let value = false;
const options = [
{ value: 'delete', label: 'Delete' },
{ value: 'warn', label: 'Warn' },
{ value: 'automute', label: 'Auto Mute' },
{ value: 'instantban', label: 'Instant Ban' },
];
if (typeof this.props.automod[setting] === 'object') {
value = options.filter(o => this.props.automod[setting][o.value]);
}
return value;
}
updateNumber = (type, friendlyName, number) => {
updateModuleSetting(this.props.data.module, type, number, friendlyName);
}
render() {
const { automod } = this.state;
const module = this.props.data.module;
const roles = this.state.roles;
const channels = this.state.channels.filter(c => (c.type === 0 || c.type === 4));
const defaultChannel = channels.find(c => c.id === this.state.channel);
const channelOptions = channels.map(c => ({ value: c.id, label: c.name }));
const ignoredChannels = channels.filter(c => this.state.ignoredChannels.find(i => i.id === c.id));
const ignoredRoles = roles.filter(r => this.state.ignoredRoles.find(i => i.id === r.id));
const roleOptions = roles.map(r => ({ value: r.id, label: r.name }));
return (<div id="automod-settings" className='settings-panel'>
<div className='settings-group'>
<div className='settings-content is-half is-flex'>
{/* <h3 className='title is-5'>Settings</h3> */}
<SettingCheckbox
module={module}
setting='muteAfter'
friendlyName='Enable Automute'
defaultValue={automod.muteAfter || false}
text='Enable Automute'
helpText='Automute mutes users when they violate all filters except banned words and all caps.' />
<SettingCheckbox
module={module}
setting='disableGlobal'
friendlyName='Default Words'
defaultValue={automod.disableGlobal || false}
text='Disable Default Banned Words'
helpText='Automod includes a small list of default banned words, if you want to disable these, check this box.' />
</div>
<div className='settings-content is-half'>
<h3 className='title is-5'>Log Channel</h3>
<RichSettingSelect
module={module}
setting='channel'
friendlyName='Log Channel'
text='Log Channel'
defaultValue={defaultChannel}
defaultOption='Select Channel'
options={channels}
onChange={this.handleLogChannel} />
</div>
</div>
<div className='automod-toggles'>
<h3 className='title is-5'>Filter Options</h3>
<SettingSelector module={module} {...this.props}
id='select-badEnabled'
setting='badEnabled'
label='Banned Words'
multi={true}
value={this.getDefaultValue('badEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-capsEnabled'
setting='capsEnabled'
label='All Caps'
multi={true}
value={this.getDefaultValue('capsEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-dupEnabled'
setting='dupEnabled'
label='Duplicate Text'
multi={true}
helpText='Duplicate Text detects a message that contains repeated text.'
value={this.getDefaultValue('dupEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-rateEnabled'
setting='rateEnabled'
label='Fast Message Spam'
multi={true}
helpText='Fast Message Spam detects when a user sends 5 messages during a 5 second timespan. '
value={this.getDefaultValue('rateEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-invitesEnabled'
setting='invitesEnabled'
label='Discord Invites'
multi={true}
value={this.getDefaultValue('invitesEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-linksEnabled'
setting='linksEnabled'
label='All Links'
multi={true}
helpText='All Links detects any message that contains a link.'
value={this.getDefaultValue('linksEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-mentionsEnabled'
setting='mentionsEnabled'
label='Mass Mentions'
multi={true}
instantBan={true}
helpText='Mass Mentions detects when a single message contains a certain number of mentions (different user per mention). You could change the number of mentions below.'
value={this.getDefaultValue('mentionsEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-cooldownEnabled'
setting='cooldownEnabled'
label='Link Cooldown'
multi={true}
helpText='Link Cooldown is violated when links are sent within a period of time after posting a link. Set the cooldown time below.'
value={this.getDefaultValue('cooldownEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-attachmentsEnabled'
setting='attachmentsEnabled'
label='Image Spam'
multi={true}
helpText='Image spam detects multiple images sent at once or within a time span of 10 seconds.'
value={this.getDefaultValue('attachmentsEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-emojisEnabled'
setting='emojisEnabled'
label='Emoji Spam'
multi={true}
value={this.getDefaultValue('emojisEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-spoilersEnabled'
setting='spoilersEnabled'
label='Spoilers'
multi={true}
helpText='Delete text or image spoilers.'
value={this.getDefaultValue('spoilersEnabled')} />
<SettingSelector module={module} {...this.props}
id='select-selfbotEnabled'
setting='selfbotEnabled'
label='Selfbot Detection'
multi={true}
helpText='Selfbot Detection will detect messages sent by users containing rich embeds.'
value={this.getDefaultValue('selfbotEnabled')} />
{/* <SettingSelector module={module} {...this.props}
id='select-regionalEnabled'
setting='regionalEnabled'
label='Regional Indicator Spam'
multi={true}
value={this.getDefaultValue('regionalEnabled')} /> */}
<RichNumber
min={1}
max={1440}
label='Automute Time (minutes)'
defaultValue={automod.muteTime || 10}
onClick={this.updateNumber.bind(this, 'muteTime', 'Mute Time')} />
<RichNumber
min={1}
max={10}
label='Mute Violations (count)'
defaultValue={automod.muteCount || 3}
onClick={this.updateNumber.bind(this, 'muteCount', 'Mute Violations')} />
<RichNumber
min={3}
max={300}
label='Link Cooldown (seconds)'
defaultValue={automod.linkCooldown || 10}
onClick={this.updateNumber.bind(this, 'linkCooldown', 'Link Cooldown')} />
<RichNumber
min={3}
max={10}
label='Max Emoji Count'
defaultValue={automod.emojiCount || 4}
onClick={this.updateNumber.bind(this, 'emojiCount', 'Emoji Count')} />
<RichNumber
min={4}
max={20}
label='Mass Mention Count'
defaultValue={automod.mentionCount || 10}
onClick={this.updateNumber.bind(this, 'mentionCount', 'Mention Count')} />
</div>
<div className='settings-group'>
<div className='settings-content is-half'>
<h3 className='title is-5'>Ignored Channels</h3>
<p>Message sent in these channels will not trigger Automod.</p>
<RichMultiSelect
module={module}
setting='ignoredChannels'
friendlyName='Ignored Channel'
text='Ignored Channels'
defaultValue={ignoredChannels}
defaultOption='Select Channel'
options={channelOptions}
onChange={this.handleIgnoredChannels} />
</div>
<div className='settings-content is-half'>
<h3 className='title is-5'>Allowed Roles</h3>
<p>Members in these roles will not trigger Automod.</p>
<RichMultiSelect
module={module}
setting='ignoredRoles'
friendlyName='Ignored Role'
text='Ignored Roles'
defaultValue={ignoredRoles}
defaultOption='Select Role'
options={roleOptions}
onChange={this.handleAllowedRoles} />
</div>
</div>
</div>);
}
}