user settings and language file changes

This commit is contained in:
nolan 2020-08-17 13:26:57 -07:00
parent 566c73e35a
commit 8b98f551bc
41 changed files with 2567 additions and 2651 deletions

View File

@ -26,6 +26,7 @@
"mongodb": "^3.5.9", "mongodb": "^3.5.9",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"node-fetch": "^2.6.0", "node-fetch": "^2.6.0",
"request": "^2.88.2",
"similarity": "^1.2.1", "similarity": "^1.2.1",
"timestring": "^6.0.0", "timestring": "^6.0.0",
"winston": "^3.2.1", "winston": "^3.2.1",

View File

@ -15,7 +15,7 @@ const ModerationManager = require('../moderation/ModerationManager.js');
const { Guild, GuildMember, User, Message, TextChannel, Role } = require('../../structure/extensions/'); //eslint-disable-line no-unused-vars const { Guild, GuildMember, User, Message, TextChannel, Role } = require('../../structure/extensions/'); //eslint-disable-line no-unused-vars
const { Command, Observer, Inhibitor, Setting } = require('../../structure/interfaces/'); const { Command, Observer, Inhibitor, Setting } = require('../../structure/interfaces/');
const { DefaultGuild } = require('../../util/defaults/'); const { DefaultGuild, DefaultUser } = require('../../util/defaults/');
class DiscordClient extends Client { class DiscordClient extends Client {
@ -38,7 +38,7 @@ class DiscordClient extends Client {
this._built = false; this._built = false;
//TODO: Default config for users and guilds. //TODO: Default config for users and guilds.
this._defaultConfig = null; this._defaultConfig = {};
this._permissionCheck = null; this._permissionCheck = null;
this._evals = new Map(); this._evals = new Map();
@ -110,10 +110,10 @@ class DiscordClient extends Client {
} }
get defaultConfig() { defaultConfig(type) {
if(this._defaultConfig) return this._defaultConfig; if(this._defaultConfig[type]) return this._defaultConfig[type];
const settings = this.registry.components.filter((c) => c.type === 'setting' && c.resolve === 'GUILD'); const settings = this.registry.components.filter((c) => c.type === 'setting' && c.resolve === type);
let def = DefaultGuild; let def = type === 'GUILD' ? DefaultGuild : DefaultUser;
for(const setting of settings.values()) { for(const setting of settings.values()) {
if(setting.default !== null) { if(setting.default !== null) {
def = { def = {
@ -122,7 +122,7 @@ class DiscordClient extends Client {
}; };
} }
} }
this._defaultConfig = def; this._defaultConfig[type] = def;
return def; return def;
} }

View File

@ -155,9 +155,9 @@ class SettingsCommand extends Command {
for(const setting of module.components.values()) { for(const setting of module.components.values()) {
if(setting.type !== 'setting' if(setting.type !== 'setting'
|| setting.resolve !== type && !all || type !== setting.resolve
|| !setting.archivable && !all) continue; || !setting.archivable && !all) continue;
field.value += `\`${setting.display}\`\n`; field.value += `\`${message.author._settings.camelCase ? setting.name : setting.name.toLowerCase()}\`\n`;
} }
if(field.value) fields.push(field); if(field.value) fields.push(field);
} }

View File

@ -0,0 +1,40 @@
const { Command } = require('../../../../interfaces/');
class PrivacyPolicyCommand extends Command {
constructor(client) {
super(client, {
name: 'privacyPolicy',
module: 'information',
aliases: ['privacy']
});
}
async execute(message) {
const embed = {
author: {
name: 'Privacy Policy',
icon_url: this.client.user.displayAvatarURL() //eslint-disable-line camelcase
},
description: message.format('C_PRIVACYPOLICY_PRIVACYDESCRIPTION', { invite: this.client._options.bot.invite }),
fields: [
{
name: 'Data We Collect',
value: message.format('C_PRIVACYPOLICY_DATA', { invite: this.client._options.bot.invite }),
inline: true
},
{
name: 'Opt-Out Features',
value: message.format('C_PRIVACYPOLICY_OPTOUT'),
inline: true
}
]
};
return message.embed(embed);
}
}
module.exports = PrivacyPolicyCommand;

View File

@ -6,7 +6,10 @@ class PingCommand extends Command {
super(client, { super(client, {
name: 'ping', name: 'ping',
module: 'utility' module: 'utility',
aliases: [
'pong'
]
}); });
this.client = client; this.client = client;
@ -18,7 +21,7 @@ class PingCommand extends Command {
const ping = this.client.ws.ping.toFixed(0); const ping = this.client.ws.ping.toFixed(0);
const number = (ping/40).toFixed(0); const number = (ping/40).toFixed(0);
const repeat = number > 1 ? number : 1; const repeat = number > 1 ? number : 1;
return message.respond(`P${'o'.repeat(repeat)}ng! \`${ping}ms\``, { emoji: 'success' }); return message.respond(`P${`${message._caller === 'ping' ? 'o' : 'i'}`.repeat(repeat)}ng! \`${ping}ms\``, { emoji: 'success' });
} }
} }

View File

@ -6,18 +6,17 @@ class TestCommand extends Command {
super(client, { super(client, {
name: 'test', name: 'test',
module: 'utility' module: 'developer',
archivable: false,
restricted: true
}); });
this.client = client; this.client = client;
} }
execute(message) { async execute(message) {
for(const blah of message) {
console.log(blah);
}
} }

View File

@ -348,6 +348,7 @@ class CommandHandler extends Observer {
const [ arg1, arg2, ...args ] = message.content.split(' '); const [ arg1, arg2, ...args ] = message.content.split(' ');
if(message.guild) await message.guild.settings(); if(message.guild) await message.guild.settings();
await message.author.settings();
const { prefix } = message; const { prefix } = message;
let command = null, let command = null,

View File

@ -350,8 +350,8 @@ class GuildLogger extends Observer {
.replace(/\{mention\}/gu, `<@${member.id}>`) .replace(/\{mention\}/gu, `<@${member.id}>`)
.replace(/\{tag\}/gu, Util.escapeMarkdown(user.tag)) .replace(/\{tag\}/gu, Util.escapeMarkdown(user.tag))
.replace(/\{user\}/gu, Util.escapeMarkdown(user.username)) .replace(/\{user\}/gu, Util.escapeMarkdown(user.username))
.replace(/\{guildsize\}/gu, guild.memberCount) .replace(/\{serversize\}/gu, guild.memberCount)
.replace(/\{guildname\}/gu, guild.name) .replace(/\{servername\}/gu, guild.name)
.replace(/\{accage\}/gu, this.client.resolver.timeAgo(Date.now()/1000 - user.createdTimestamp/1000)) //.replace(/a/, '1') .replace(/\{accage\}/gu, this.client.resolver.timeAgo(Date.now()/1000 - user.createdTimestamp/1000)) //.replace(/a/, '1')
.replace(/\{id\}/gu, user.id) .replace(/\{id\}/gu, user.id)
.trim(); .trim();

View File

@ -178,7 +178,7 @@ class MessageCache extends Observer {
const messageCount = deleteMessages.deletedCount; const messageCount = deleteMessages.deletedCount;
const attachmentCount = deleteAttachments.deletedCount; const attachmentCount = deleteAttachments.deletedCount;
this.client.logger.info(`${chalk.bold('[IMAGE]')} Trashed ${messageCount} messages${messageCount === 1 ? '' : 's'} and ${attachmentCount} attachment${attachmentCount === 1 ? '' : 's'}.`); this.client.logger.info(`${chalk.bold('[IMAGE]')} Trashed ${messageCount} message${messageCount === 1 ? '' : 's'} and ${attachmentCount} attachment${attachmentCount === 1 ? '' : 's'}.`);
} }

View File

@ -128,8 +128,8 @@ class UtilityHook extends Observer {
.replace(/\{mention\}/gu, `<@${member.id}>`) .replace(/\{mention\}/gu, `<@${member.id}>`)
.replace(/\{tag\}/gu, Util.escapeMarkdown(user.tag)) .replace(/\{tag\}/gu, Util.escapeMarkdown(user.tag))
.replace(/\{user\}/gu, Util.escapeMarkdown(user.username)) .replace(/\{user\}/gu, Util.escapeMarkdown(user.username))
.replace(/\{guildsize\}/gu, guild.memberCount) .replace(/\{serversize\}/gu, guild.memberCount)
.replace(/\{guildname\}/gu, guild.name) .replace(/\{servername\}/gu, guild.name)
.replace(/\{accage\}/gu, this.client.resolver.timeAgo(Date.now()/1000 - user.createdTimestamp/1000)) //.replace(/a/, '1') .replace(/\{accage\}/gu, this.client.resolver.timeAgo(Date.now()/1000 - user.createdTimestamp/1000)) //.replace(/a/, '1')
.replace(/\{id\}/gu, user.id) .replace(/\{id\}/gu, user.id)
.trim(); .trim();

View File

@ -0,0 +1,45 @@
const { Setting } = require('../../../../interfaces/');
class CamelCaseSetting extends Setting {
constructor(client) {
super(client, {
name: 'camelCase',
module: 'developer',
resolve: 'USER',
default: {
camelCase: false
},
restricted: true,
archivable: false
});
}
async handle(message, params) {
const boolean = this.client.resolver.resolveBoolean(params.join(' '));
if(boolean === null) {
return {
msg: `Unable to parse boolean value.`,
error: true
};
}
await message.author._updateSettings({ [this.index]: boolean });
return {
msg: `Successfully set camelCase to \`${boolean}\`.`,
error: false
};
}
fields(user) {
return {
name: "》 Status",
value: user.format('SETTING_STATUS', { bool: Boolean(user._settings.camelcase) }, true)
};
}
}
module.exports = CamelCaseSetting;

View File

@ -19,12 +19,12 @@ class MemberLogsSetting extends Setting {
'leaveMsg' 'leaveMsg'
], ],
tags: ['log', 'logs', 'logging'], tags: ['log', 'logs', 'logging'],
usage: '<method|value> [value]', usage: "<text-channel|'join'|'leave'> <value..>",
resolve: 'GUILD', resolve: 'GUILD',
examples: [ examples: [
'memberlogs #channel', 'memberlogs #channel',
'memberlogs join|leave <message>', 'memberlogs join {mention} joined the server!',
'memberlogs reset', 'memberlogs leave **{tag}** ({id}) left the server.',
'memberlogs off' 'memberlogs off'
], ],
default: { default: {

View File

@ -1,6 +1,37 @@
const { Setting } = require('../../../../interfaces/'); const { Setting } = require('../../../../interfaces/');
const emojis = require('../../../../../util/emojis.json'); const { Emojis } = require('../../../../../util/');
const maxCharacters = 98;
const { PermissionNames, EmbedLimits } = require('../../../../../util/Constants.js');
const Constants = {
Types: {
role: [
'muteRole',
'mutedRole'
],
create: [
'createMute',
'createMuted',
'createMuteRole',
'createMutedRole'
],
type: [
'muteType',
'mutedType'
],
permanent: [
'permaMute',
'permanentMute'
],
duration: [
'defaultMuteDuration',
'muteDuration'
]
},
MuteTypes: [0, 1, 2],
MaxCharacters: 98,
MaxIssues: 6
};
const { stripIndents } = require('common-tags'); const { stripIndents } = require('common-tags');
@ -25,52 +56,27 @@ class MuteSetting extends Setting {
'permanentMute', 'permanentMute',
'defaultMuteDuration' 'defaultMuteDuration'
], ],
arguments: [ // arguments: [
{ // {
name: 'create', // name: 'text',
type: 'BOOLEAN', // type: 'BOOLEAN',
types: ['VERBAL'], // types: ['FLAG'],
default: true // default: true
}, // },
{ // {
name: 'type', // name: 'voice',
type: 'BOOLEAN', // type: 'BOOLEAN',
types: ['VERBAL'], // types: ['FLAG'],
default: true // default: true
}, // }
{ // ],
name: 'permanent', usage: "<'create'|'type'|'permanent'|'default'|role> <value..>",
aliases: ['perm', 'perma'],
type: 'BOOLEAN',
types: ['VERBAL'],
default: true
},
{
name: 'defaultDuration',
aliases: ['duration'],
type: 'BOOLEAN',
types: ['VERBAL'],
default: true
},
{
name: 'text',
type: 'BOOLEAN',
types: ['FLAG'],
default: true
},
{
name: 'voice',
type: 'BOOLEAN',
types: ['FLAG'],
default: true
}
],
usage: '[type|role|create|permanent|duration] [value]',
examples: [ examples: [
'createmute Muted', "mute muted-role",
'mutetype 1', "mute create Muted",
'permamute true', "mute type 1",
'mute default 1 day' "mute permanent true",
"mute default 1 day"
], ],
resolve: 'GUILD', resolve: 'GUILD',
default: { default: {
@ -85,6 +91,237 @@ class MuteSetting extends Setting {
} }
async handle(message, args) {
const { params, parsedArguments } = await this._parseArguments(args, message.guild);
if(params.length === 0) {
return {
msg: message.format('S_MUTE_MISSINGARGUMENTS'),
error: true
};
}
let type = 'role';
let parameters = params.join(' ');
if(!['mute', 'muted'].includes(message._settingCaller)) {
for(const [ key, values ] of Object.entries(Constants.Types)) {
if(values.map((v) => v.toLowerCase()).includes(message._settingCaller.toLowerCase())) {
type = key;
break;
}
}
} else {
const key = params[0].toLowerCase();
if(['create', 'createrole'].includes(key)) type = 'create', parameters = params.splice(1).join(' '); //eslint-disable-line no-unused-expressions, no-sequences
if(['type'].includes(key)) type = 'type', parameters = params.splice(1).join(' '); //eslint-disable-line no-unused-expressions, no-sequences
if(['duration', 'defaultduration'].includes(key)) type = 'duration', parameters = params.splice(1).join(' '); //eslint-disable-line no-unused-expressions, no-sequences
if(['perma', 'permamute', 'permanent'].includes(key)) type = 'permanent', parameters = params.splice(1).join(' '); //eslint-disable-line no-unused-expressions, no-sequences
}
if(type === 'role') {
const role = await this.client.resolver.resolveRole(parameters, true, message.guild);
if(!role) return {
msg: message.format('S_MUTE_ROLEMISSING'),
error: true
};
await message.guild._updateSettings({
[this.index]: {
...message.guild._settings[this.index],
role: role.id
}
});
message.respond(message.format('S_MUTE_ROLESUCCESS'), {
emoji: 'success'
});
} else if(type === 'create') {
const response = await this._createRole(message, parameters, parsedArguments);
if(response.error) return response;
const { role, issues, created, updatedPermissions } = response;
await message.guild._updateSettings({
[this.index]: {
...message.guild._settings[this.index],
role: role.id
}
});
const sorted = issues ? issues.sort((a, b) => a.position - b.position) : [];
const embed = {
author: {
name: `${Emojis.warning} Warning`
},
color: 0xffe15c,
description: message.format('S_MUTE_CREATESUCCESSWARNING'),
fields: []
};
const addField = (array, type) => {
const field = {
name: type === 'text' ? 'Text Channels' : 'Voice Channels',
value: ''
};
const sorted = array.sort((a, b) => a.position - b.position) || [];
for(const i of sorted) {
const text = `${Emojis.role} **${i.role}** has ${i.permissions.map((p) => `\`${PermissionNames[p]}\``).join(', ')} in ${Emojis[i.type === 'text' ? 'text-channel' : 'voice-channel']} **${i.channel}**\n`;
if(field.value.length+text.length <= EmbedLimits.fieldValue) field.value += text;
}
return field;
};
const textIssues = issues.filter((i) => i.type === 'text');
if(textIssues.length > 0) embed.fields.push(addField(textIssues, 'text'));
const voiceIssues = issues.filter((i) => i.type === 'voice');
if(voiceIssues.length > 0) embed.fields.push(addField(voiceIssues, 'voice'));
message.respond(message.format('S_MUTE_CREATESUCCESS', {
created: created ? message.format('S_MUTE_CREATESUCCESSALT') : ' ',
permissions: message.format(updatedPermissions ? 'S_MUTE_GENERATEDPERMISSIONS' : 'S_MUTE_UNGENERATEDPERMISSIONS'),
role: role.name
}), {
emoji: 'success',
embed: issues.length > 0 ? embed : null
});
} else if(type === 'type') {
const number = parseInt(num);
if(Number.isNaN(number)) return {
msg: message.format('S_MUTE_TYPENAN'),
error: true
};
if(!Constants.MuteTypes.includes(number)) return {
msg: message.format('S_MUTE_TYPEINVALID'),
error: true
};
await message.guild._updateSettings({
[this.index]: {
...message.guild._settings[this.index],
type: number
}
});
return {
msg: `${message.format('S_MUTE_TYPESUCCESS', { type: number })} ${message.format('S_MUTE_TYPESWITCH', { type: number }, true)}`,
error: false
};
} else if(type === 'duration') {
} else if(type === 'permanent') {
}
return {
error: false,
ignore: true
};
}
async _createRole(message, name = 'Muted', args) {
const createRole = async (name) => {
let role = null;
if(name.length > Constants.MaxCharacters) name = name.slice(0, Constants.MaxCharacters);
try {
role = await message.guild.roles.create({
data: {
name
},
reason: super.reason(message.author)
});
} catch(error) {
return {
msg: message.format('S_MUTE_ROLECREATEERROR'),
error: true
};
}
return role;
};
const hasPermission = message.guild.me.hasPermission('MANAGE_ROLES');
if(!hasPermission) return {
msg: message.format('S_MUTE_ROLEMISSINGPERMISSION'),
error: true
};
let role = null;
const existing = await this.client.resolver.resolveRole(name, true, message.guild);
if(existing) {
const prompt = await message.prompt(message.format('S_MUTE_ROLEPROMPT', {
name: existing.name,
id: existing.id
}), { emoji: 'loading' });
const boolean = this.client.resolver.resolveBoolean(prompt.content.toLowerCase());
if(boolean === null) return {
msg: message.format('S_MUTE_ROLEPROMPTERROR'),
error: true
};
if(boolean) {
role = existing;
}
}
let created = false;
if(!role) {
role = await createRole(name);
if(role.error) return role;
created = true;
}
const issues = [];
let updatedPermissions = false;
for(const channel of message.guild.channels.cache.values()) {
const configuration = channel.type === 'text'
? { permissions: { SEND_MESSAGES: false, ADD_REACTIONS: false }, bitwise: 0x800 }
: { permissions: { CONNECT: false }, bitwise: 0x100000 };
try {
if(channel.type === 'text' || channel.type === 'voice') {
await channel.createOverwrite(role, configuration.permissions, super.reason(message.author));
for(const permission of channel.permissionOverwrites.values()) {
if(permission.type !== 'role') continue;
const permissionRole = await this.client.resolver.resolveRole(permission.id, true, message.guild);
if((permission.allow & configuration.bitwise) === configuration.bitwise) { //eslint-disable-line no-bitwise
const issue = {
role: permissionRole.name,
permissions: Object.keys(configuration.permissions),
channel: channel.name,
type: channel.type,
position: permissionRole.rawPosition
};
issues.push(issue);
}
}
}
updatedPermissions = true;
} catch(error) {} //eslint-disable-line no-empty
}
return {
error: false,
updatedPermissions,
created,
issues,
role
};
}
/*
async handle(message, args) { async handle(message, args) {
let { params, parsedArguments } = await this._parseArguments(args, message.guild); //eslint-disable-line prefer-const let { params, parsedArguments } = await this._parseArguments(args, message.guild); //eslint-disable-line prefer-const
@ -250,6 +487,9 @@ class MuteSetting extends Setting {
} }
*/
/*
async _createRole(message, args) { async _createRole(message, args) {
let role = null; let role = null;
let name = args.join(' ') || 'Muted'; let name = args.join(' ') || 'Muted';
@ -269,6 +509,7 @@ class MuteSetting extends Setting {
} }
return role; return role;
} }
*/
fields(guild) { fields(guild) {
const setting = guild._settings[this.index]; const setting = guild._settings[this.index];

View File

@ -201,7 +201,7 @@ const Guild = Structures.extend('Guild', (Guild) => {
/* Lazy Developer Getters */ /* Lazy Developer Getters */
get defaultConfig() { get defaultConfig() {
return JSON.parse(JSON.stringify(this.client.defaultConfig)); return JSON.parse(JSON.stringify(this.client.defaultConfig('GUILD')));
} }
get prefix() { get prefix() {

View File

@ -21,6 +21,8 @@ const User = Structures.extend('User', (User) => {
async settings() { async settings() {
if (!this._settings) this._settings = this.client.storageManager.mongodb.users.findOne({ userId: this.id }); if (!this._settings) this._settings = this.client.storageManager.mongodb.users.findOne({ userId: this.id });
if (this._settings instanceof Promise) this._settings = await this._settings || {}; if (this._settings instanceof Promise) this._settings = await this._settings || {};
if(!this._settings) this._settings = { userId: this.id, ...this.defaultConfig };
else this._settings = { ...this.defaultConfig, ...this._settings };
return this._settings; return this._settings;
} }
@ -56,6 +58,42 @@ const User = Structures.extend('User', (User) => {
return points.reduce((p, v) => p+v) + this._points.points; return points.reduce((p, v) => p+v) + this._points.points;
} }
/* Settings Wrapper */
async _updateSettings(data) { //Update property (upsert true) - updateOne
if(!this._settings) await this.settings();
try {
await this.client.storageManager.mongodb.users.updateOne(
{ guildId: this.id },
data
);
this._settings = {
...this._settings,
...data
};
this._storageLog(`Database Update (guild:${this.id}).`);
} catch(error) {
this._storageError(error);
}
return true;
}
/* Logging */
_storageLog(log) {
this.client.logger.debug(log);
}
_storageError(error) {
this.client.logger.error(`Database Error (user:${this.id}) : \n${error.stack || error}`);
}
/* Lazy Getters */
get defaultConfig() {
return JSON.parse(JSON.stringify(this.client.defaultConfig('USER')));
}
get developer() { get developer() {
return this.client._options.bot.owners.includes(this.id); return this.client._options.bot.owners.includes(this.id);
} }

View File

@ -0,0 +1,230 @@
//Command Arguments
//Administration Module
//Settings Command
[A_EXPORT_SETTINGS_DESCRIPTION]
Export a JSON file of all of the settings for the server or user.
[A_USER_SETTINGS_DESCRIPTION]
View or edit user-only settings.
//Grant Command
[A_CHANNEL_GRANT_DESCRIPTION]
Specify channels to grant specific permissions to.
//Revoke Command
[A_CHANNEL_REVOKE_DESCRIPTION]
Specify channels to revoke permissions from.
//Permissions Command
[A_EXPORT_PERMISSIONS_DESCRIPTION]
Export a JSON file of all of the permissions in the server.
//Developer Module
//Evaluate Command
[A_LOG_EVALUATE_DESCRIPTION]
Prints the evaluation to the console.
[A_HIDE_EVALUATE_DESCRIPTION]
Hides the evaluation from public view.
//Moderation Module
//Note Command
[A_SILENT_NOTE_DESCRIPTION]
Deletes the command message and the execution message.
//Warn Command
[A_SILENT_WARN_DESCRIPTION]
Deletes the command message and the execution message.
[A_POINTS_WARN_DESCRIPTION]
Assign moderation points to the user.
[A_EXPIRATION_WARN_DESCRIPTION]
Assign a duration for the moderation points to expire.
[A_FORCE_WARN_DESCRIPTION]
Bypasses the moderation point escalation.
[A_PRUNE_WARN_DESCRIPTION]
Removes messages from the user.
//Unmute Command
[A_SILENT_UNMUTE_DESCRIPTION]
Deletes the command message and the execution message.
//Mute Command
[A_SILENT_MUTE_DESCRIPTION]
Deletes the command message and the execution message.
[A_POINTS_MUTE_DESCRIPTION]
Assign moderation points to the user.
[A_EXPIRATION_MUTE_DESCRIPTION]
Assign a duration for the moderation points to expire.
[A_FORCE_MUTE_DESCRIPTION]
Bypasses the moderation point escalation.
[A_PRUNE_MUTE_DESCRIPTION]
Removes messages from the user.
//Kick Command
[A_SILENT_KICK_DESCRIPTION]
Deletes the command message and the execution message.
[A_POINTS_KICK_DESCRIPTION]
Assign moderation points to the user.
[A_EXPIRATION_KICK_DESCRIPTION]
Assign a duration for the moderation points to expire.
[A_FORCE_KICK_DESCRIPTION]
Bypasses the moderation point escalation.
[A_PRUNE_KICK_DESCRIPTION]
Removes messages from the user.
//Softban Command
[A_SILENT_SOFTBAN_DESCRIPTION]
Deletes the command message and the execution message.
[A_POINTS_SOFTBAN_DESCRIPTION]
Assign moderation points to the user.
[A_EXPIRATION_SOFTBAN_DESCRIPTION]
Assign a duration for the moderation points to expire.
[A_FORCE_SOFTBAN_DESCRIPTION]
Bypasses the moderation point escalation.
[A_DAYS_SOFTBAN_DESCRIPTION]
Specify an amount of days to remove messages from.
//Ban Command
[A_SILENT_BAN_DESCRIPTION]
Deletes the command message and the execution message.
[A_POINTS_BAN_DESCRIPTION]
Assign moderation points to the user.
[A_EXPIRATION_BAN_DESCRIPTION]
Assign a duration for the moderation points to expire.
[A_FORCE_BAN_DESCRIPTION]
Bypasses the moderation point escalation.
[A_DAYS_BAN_DESCRIPTION]
Specify an amount of days to remove messages from.
//Unban Command
[A_SILENT_UNBAN_DESCRIPTION]
Deletes the command message and the execution message.
//Prune Command
[A_USERS_PRUNE_DESCRIPTION]
Filter messages sent by specified users.
[A_BOTS_PRUNE_DESCRIPTION]
Filter messages sent by bots.
[A_HUMANS_PRUNE_DESCRIPTION]
Filter messages sent by non-bots.
[A_CONTAINS_PRUNE_DESCRIPTION]
Filter messages containing specified text.
[A_STARTSWITH_PRUNE_DESCRIPTION]
Filter messages starting with specified text.
[A_ENDSWITH_PRUNE_DESCRIPTION]
Filter messages ending with specified text.
[A_TEXT_PRUNE_DESCRIPTION]
Filter messages containing text.
[A_INVITES_PRUNE_DESCRIPTION]
Filter messages containing discord invites.
[A_LINKS_PRUNE_DESCRIPTION]
Filter messages containing links.
[A_EMOJIS_PRUNE_DESCRIPTION]
Filter messages containing emojis.
[A_REACTIONS_PRUNE_DESCRIPTION]
Filter messages containing reactions.
[A_IMAGES_PRUNE_DESCRIPTION]
Filter messages containing images.
[A_ATTACHMENTS_PRUNE_DESCRIPTION]
Filter messages containing any attachment.
[A_AFTER_PRUNE_DESCRIPTION]
Filter messages after a specified message.
[A_BEFORE_PRUNE_DESCRIPTION]
Filter messages before a specified message.
[A_AND_PRUNE_DESCRIPTION]
Use a logical AND for checks.
[A_NOT_PRUNE_DESCRIPTION]
Use a logical NOT for checks.
[A_SILENT_PRUNE_DESCRIPTION]
Deletes the command message and the execution message.
//History Arguments
[A_BEFORE_HISTORY_DESCRIPTION]
Search history before a certain date.
[A_AFTER_HISTORY_DESCRIPTION]
Search history after a certain date.
[A_TYPE_HISTORY_DESCRIPTION]
Search history only containing certain infraction types.
[A_OLDEST_HISTORY_DESCRIPTION]
Sort history by oldest.
[A_VERBOSE_HISTORY_DESCRIPTION]
Display user IDs.
//Settings Arguments
//Mute Setting
[A_CREATE_MUTE_SETTINGS]
Create a new muted role instead of using an existing one.
[A_TYPE_MUTE_SETTINGS]
Select a mute type functionality.
[A_PERMANENT_MUTE_SETTINGS]
Determine if you would like to allow permanent mutes if no duration is provided.
[A_DEFAULTDURATION_MUTE_SETTINGS]
Determine the default duration chosen if no duration is provided.
[A_TEXT_MUTE_SETTINGS]
Only creates permissions for text-channels.
[A_VOICE_MUTE_SETTINGS]
Only creates permissions for voice-channels.
//Utility Module

View File

@ -0,0 +1,970 @@
// Administration Module
//Settings Command
[C_SETTINGS_DESCRIPTION]
Configure your server and user settings.
[C_SETTINGS_MISSINGPERMISSIONS]
You must have `Administrator` or `Manage Server` permissions to change/view server settings.
[C_SETTINGS_RESETPROMPT]
Are you sure you want to reset **all** of your {type} settings to the default values? This cannot be undone. *(__y__es, __n__o)*
This prompt will time out in __30 seconds__.
[C_SETTINGS_RESETINVALID]
You provided an invalid input, please try again.
[C_SETTINGS_RESETABORT]
Successfully aborted the operation.
[C_SETTINGS_RESETSUCCESS]
All {type} settings were successfully deleted and set to default.
[C_SETTINGS_EXPORT]
Attached the JSON-formatted {type} settings file in the file below.
You may want to format this file for your viewing pleasure.
[C_SETTINGS_SETTINGNOTFOUND]
That setting does not exist!
[C_SETTINGS_FORMATTYPE]
switch("{type}") {
case "GUILD":
"server";
break;
case "USER":
"user";
break;
}
//Grant Command
[C_GRANT_DESCRIPTION]
Grant roles or users permissions to use commands or modules.
To view all grantable permissions, use the command `{prefix}perms list`.
[C_GRANT_MISSINGRESOLVEABLES]
Unable to find any roles or members, view `{prefix}cmd grant` for more information.
[C_GRANT_MISSINGPERMISSIONNODES]
Unable to find any grantable permissions, view `{prefix}cmd grant` for more information.
[C_GRANT_DATABASEERROR]
There was an issue pushing the permissions to the database. Contact a bot developer.
[C_GRANT_SUCCESS]
Successfully granted targets {targets} the following permissions: {permissions}{channel}.
[C_GRANT_SUCCESSCHANNELS]
in channel{plural} {channels}
[C_GRANT_WARNING]
You granted a command from the **Administration** module. This is potentially dangerous, as whoever you granted the administration commands to could have access to vital parts of the server. Only grant administration commands to people you trust.
//Revoke Command
[C_REVOKE_DESCRIPTION]
Revoke permissions granted to roles or users.
NOTE: If a user left the server, you must use the ID to revoke the permissions.
[C_REVOKE_MISSINGRESOLVEABLES]
Unable to find any roles or users, view `{prefix}cmd revoke` for more information.
[C_REVOKE_DATABASEERROR]
There was an issue pushing the permissions to the database. Contact a bot developer.
[C_REVOKE_SUCCESS]
Successfully revoked targets {targets} the following permissions: {permissions}{channel}.
[C_REVOKE_SUCCESSCHANNELS]
in channel{plural} {channels}
//Permissions Command
[C_PERMISSIONS_DESCRIPTION]
View permissions granted to roles or users.
[C_PERMISSIONS_LIST]
You can **grant**/**revoke** the following permissions: {permissions}.
[C_PERMISSIONS_SHOWTITLE]
switch({user}) {
case true:
"User Permissions"
break;
case false:
"Role Permissions"
break;
}
[C_PERMISSIONS_SHOWDESCRIPTION]
An overview of all {resolve}'s permissions in the server. If you would like to see an in-depth view of the role or user's permissions, use `{prefix}perms [user|role]`.
[C_PERMISSIONS_MAXFIELDS]
:warning: **You have met the max amount of fields and you will need to use `{prefix}perms --json` to view them.** :warning:
[C_PERMISSIONS_NOTFOUND]
Unable to find any roles or users with those arguments.
[C_PERMISSIONS_JSON]
Attached the JSON-formatted permission file in the file below.
You may want to format this file for your viewing pleasure.
[C_PERMISSIONS_GLOBAL]
**Global Permissions:** {permissions}
Global permissions can be used in all channels, but you can add specific channels if needed.
[C_PERMISSIONS_GLOBALALT]
Channel-specific permissions are listed below.
[C_PERMISSIONS_NOPERMISSIONS]
**No permissions found!** Try granting some permissions by using:
`{prefix}grant <roles..|users..> <permissions..>}`
[C_PERMISSIONS_PERMISSIONSNOTFOUND]
Found {type} **{resolveable}** but {they}had no permissions.
[C_PERMISSIONS_NOPERMISSIONS]
Your server has no granted permissions to any roles or users.
If you would like to grant permissions, use the command `{prefix}grant` for more information.
//Disable Command
[C_DISABLE_DESCRIPTION]
Disable commands in your server to prevent usage.
[C_DISABLE_LIST]
The command{plural} currently disabled in your server are: {commands}
[C_DISABLE_LISTFAIL]
There are no disabled commands in your server.
[C_DISABLE_MISSINGCOMMANDS]
You must provide commands to disable.
[C_DISABLE_SUCCESS]
Successfully **disabled** command{plural} {commands} in your server.
[C_DISABLE_FAIL]
Failed to disable command{plural} {commands}. You are unable to disable the **command:enable** and **command:disable** commands.
[C_DISABLE_WARNING]
You disabled a command inside of the **Administration** module. It is dangerous to do so, as it may disable configurability of your server. Note you are unable to disable the `command:enable` and `command:disable` commands.
[C_DISABLE_SUCCESSGLOBAL]
Successfully **disabled** command{plural} {commands} globally. **`[{amount}/{total}]`**
These changes will be reverted if a shard restarts; edit the file{plural} for sustainability.
[C_DISABLE_FAILGLOBAL]
Failed to globally disable command{plural} {commands}. **`[0/{total}]`**
//Enable Command
[C_ENABLE_DESCRIPTION]
Enable commands in your server.
[C_ENABLE_MISSINGCOMMANDS]
You must provide commands to enable.
[C_ENABLE_SUCCESS]
Successfully **enabled** command{plural} {commands} in your server.
[C_ENABLE_FAIL]
Failed to enable command{plural} {commands}, they likely were not disabled.
[C_ENABLE_SUCCESSGLOBAL]
Successfully **enabled** command{plural} {commands} globally. **`[{amount}/{total}]`**
These changes will be reverted if a shard restarts; edit the file{plural} for sustainability.
[C_ENABLE_FAILGLOBAL]
Failed to globally enable command{plural} {commands}. **`[0/{total}]`**
// Moderation Module
//Note Command
[C_NOTE_DESCRIPTION]
Note members with a description, will not be logged.
The only way to view notes is through moderation history.
[C_NOTE_MISSINGMEMBERS]
You must provide members to assign notes to.
[C_NOTE_MISSINGMEMBERPERMISSIONS]
//Warn Command
[C_WARN_DESCRIPTION]
Warn members for a particular reason.
[C_WARN_MISSINGMEMBERS]
You must provide members to warn.
[C_WARN_INSUFFICIENTPERMISSIONS]
you don't have permission to run this command.
//Unmute Command
[C_UNMUTE_DESCRIPTION]
Unmute members from the server.
[C_UNMUTE_MISSINGMEMBERS]
You must provide members to unmute.
[C_UNMUTE_INSUFFICIENTPERMISSIONS]
I don't have permission to manage roles
[C_UNMUTE_CANNOTFINDMUTE]
they were not previously muted
[C_UNMUTE_ROLEDOESNOTEXIST]
the mute role does not exist anymore
[C_UNMUTE_1FAIL]
I had an issue removing the role
[C_UNMUTE_2FAIL]
I had issues assigning roles to them
[C_UNMUTE_3FAIL]
I had issues granting roles to them
//Mute Command
[C_MUTE_DESCRIPTION]
Assign members to be muted from the server for a specified amount of time.
[C_MUTE_MISSINGMEMBERS]
You must provide members to mute.
[C_MUTE_DURATIONEXCEPTION]
The duration must be more than `1 minute` and less than `1 month`.
[C_MUTE_INSUFFICIENTPERMISSIONS]
I don't have permission to manage roles
[C_MUTE_NOMUTEROLE]
You don't have a mute role set in your server, use the command `-set mute` for more information.
[C_MUTE_INVALIDMUTEROLE]
It seems like the mute role was deleted, use the command `-set mute` for more information.
[C_MUTE_1FAIL]
I had an issue adding the role
[C_MUTE_2FAIL]
I had issues assigning roles to them
[C_MUTE_3FAIL]
I had issues revoking roles from them
//Kick Command
[C_KICK_DESCRIPTION]
Kick provided members from the server.
[C_KICK_MISSINGMEMBERS]
You must provide members to kick.
[C_KICK_INSUFFICIENTPERMISSIONS]
I don't have permission to kick members
[C_KICK_CANNOTBEKICKED]
they are unable to be kicked
//Softban Command
[C_SOFTBAN_DESCRIPTION]
Bans and then unbans the member from the server.
Primarily used to prune the member's messages in all channels.
[C_SOFTBAN_MISSINGMEMBERS]
You must provide members to softban.
[C_SOFTBAN_INSUFFICIENTPERMISSIONS]
I don't have permission to ban members
[C_SOFTBAN_CANNOTBESOFTBANNED]
they are unable to be softbanned
//Ban Command
[C_BAN_DESCRIPTION]
Ban provided members or users from the server. Works with users not in the server.
Optionally assign a time to ban them for.
[C_BAN_MISSINGMEMBERS]
You must provide members to ban.
[C_BAN_DURATIONREQUIRED]
You must provide a duration while using the **tempban** alias.
[C_BAN_DURATIONEXCEPTION]
The duration must be more than `1 minute` and less than `3 months`.
[C_BAN_INSUFFICIENTPERMISSIONS]
I don't have permission to ban members
[C_BAN_CANNOTBEBANNED]
they are unable to be banned
[C_BAN_ALREADYBANNED]
they are already banned
//Unban Command
[C_UNBAN_DESCRIPTION]
Unban provided users from the server.
[C_UNBAN_MISSINGMEMBERS]
You must provide users to unban.
[C_UNBAN_INSUFFICIENTPERMISSIONS]
I don't have permission to unban members
[C_UNBAN_NOTBANNED]
they are not banned
//Prune Command
[C_PRUNE_DESCRIPTION]
Mass delete messages from provided channels. The amount provided is the amount of messages it searches, not deletes. Filters messages using a logical OR by default. **You cannot prune messages older than 2 weeks.**
[C_PRUNE_CHANNELEXCEPTION]
You are only able to prune up to `3` channels at a time.
[C_PRUNE_INTEGERINVALID]
You must provide an amount to prune.
[C_PRUNE_INTEGEREXCEPTION]
The amount must be more than `1` and less than `300`.
[C_PRUNE_INSUFFICIENTPERMISSIONS]
I don't have permission to manage messages
[C_PRUNE_NOTFETCHED]
I was unable to fetch any messages
[C_PRUNE_NOTDELETABLE]
I could not delete those messages
[C_PRUNE_NOFILTERRESULTS]
I could not find any messages with those arguments
[C_PRUNE_NODELETE]
I had issues deleting those messages
//Vckick Command
[C_VCKICK_DESCRIPTION]
Kick provided members from their connected voice-channel.
[C_VCKICK_INSUFFICIENTPERMISSIONS]
I don't have permission to move members
[C_VCKICK_NOCHANNEL]
they are not in a voice-channel
//Slowmode Command
[C_SLOWMODE_DESCRIPTION]
Set the slowmode in provided channels. Primarily used for setting the slowmode in smaller increments, while Discord will not let you.
[C_SLOWMODE_SECONDREQUIRED]
You must provide a duration to set the slowmode to.
[C_SLOWMODE_SECONDEXCEPTION]
The duration must be `0 seconds` or more, and less than `6 hours`.
[C_SLOWMODE_INSUFFICIENTPERMISSIONS]
I don't have permission to manage channels
[C_SLOWMODE_NOCHANGE]
the slowmode was already set to that
//Nickname Command
[C_NICKNAME_DESCRIPTION]
Change the nickname of provided members or dehoist them. You will have to put the nickname in quotes in order to allow for spaced nicknames.
[C_NICKNAME_MISSINGMEMBERS]
You must provide members to nickname.
[C_NICKNAME_MISSINGNAME]
You must provide arguments to change their nickname to.
[C_NICKNAME_NOCHARACTERS]
they had no hoisted characters in their nickname
[C_NICKNAME_INSUFFICIENTPERMISSIONS]
I don't have permission to manage nicknames
[C_NICKNAME_MISSINGPERMSSIONS]
they have a higher role than I do
//Addrole Command
[C_ADDROLE_DESCRIPTION]
Add roles to provided members. The added roles cannot be a higher position than the executor's highest role.
[C_ADDROLE_MISSINGMEMBERS]
You must provide members to add roles to.
[C_ADDROLE_MISSINGROLES]
You must provide roles to add to members.
[C_ADDROLE_INSUFFICIENTPERMISSIONS]
I don't have permission to manage roles
[C_ADDROLE_ROLEHIERARCHY]
the provided role(s) have a higher position than yours
[C_ADDROLE_ROLEHIERARCHYBOT]
the provided role(s) are higher than the bot, I cannot add them
//Removerole Command
[C_REMOVEROLE_DESCRIPTION]
Remove roles to provided members. The removes roles cannot be a higher position than the executor's highest role.
[C_REMOVEROLE_MISSINGMEMBERS]
You must provide members to remove roles from.
[C_REMOVEROLE_MISSINGROLES]
You must provide roles to remove from members.
[C_REMOVEROLE_INSUFFICIENTPERMISSIONS]
I don't have permission to manage roles
[C_REMOVEROLE_ROLEHIERARCHY]
the provided role(s) have a higher position than yours
//History Command
[C_HISTORY_DESCRIPTION]
Display moderation history for the server or for certain users.
[C_HISTORY_ERROR]
I had issues finding moderation history in your server.
[C_HISTORY_NORESULTS]
There are no results for that search query.
[C_HISTORY_SUCCESSTYPE]
switch({old}) {
case true:
'oldest';
break;
case false:
'newest';
break;
}
[C_HISTORY_SUCCESS]
Fetched the {type} moderation cases{targets}.
[C_HISTORY_SUCCESSTARGETS]
for target{plural}: {targets}
[C_HISTORY_SUCCESSEXPORT]
Attached the JSON-formatted moderation file in the file below.
You may want to format this file for your viewing pleasure.
[C_HISTORY_FAILEXPORT]
Unable to upload JSON file, the file is too large to upload here. **\`[amount/max]\`**
If you absolutely need this, contact a bot developer in our support server.
//Case Command
[C_CASE_DESCRIPTION]
View a specific case
[C_CASE_INVALID]
Case ID `{caseID}` is invalid! Make sure it's an integer above 0.
[C_CASE_NOTFOUND]
No case matching ID `{caseID}` was found.
[C_CASE_TITLE]
{emoji_book} Case **#{caseID}**
[C_CASE_TITLE_VERBOSE]
{emoji_book} Case **#{caseID} (verbose)**
[C_CASE_CHANGES_TITLE]
{emoji_note} Changes to case **#{case}**
[C_CASE_CHANGES_NONE]
No changes have been made to the case.
[C_CASE_CHANGE_BASE]
**Timestamp:** {date} | {timeAgo} ago
**Staff:** {staff}
[C_CASE_CHANGES_RESOLVE]
**Reason:** {reason}
[C_CASE_CHANGES_REASON]
**Old reason:** {reason}
[C_CASE_CHANGES_DURATION]
**Old duration:** {duration}
[C_CASE_CHANGE_NOREASON]
`No reason given`
[C_CASE_TEMPLATE]
**[Jump to message (if available)](https://discord.com/channels/{guild}/{channel}/{message})**
**Unique ID:** {uniqueID}
**Type:** {type}
**Timestamp:** {date} | {relativeTime} ago
{target}
**Staff:** {staff}
**Changes:** {nrChanges}
[C_CASE_TEMPLATE_VERBOSE]
**[Jump to message (if available)](https://discord.com/channels/{guild}/{channel}/{message})**
**Unique ID:** {uniqueID}
**Type:** {type}
**Timestamp:** {date} | {relativeTime} ago
**UNIX timestamp:** {unix} | {relativeTimeSeconds} seconds ago
{target}
**Staff:** {staff} ({staffID})
**Amount of changes:** {nrChanges}
**Changes:** {changes}
[C_CASE_MODPOINTS]
**Points:** {points}
**Expires:** {expires}
[C_CASE_REASON]
**Reason:**
```{reason}```
[C_CASE_SLOWMODE]
**Slowmode:** {readable}
[C_CASE_SLOWMODE_VERBOSE]
**Slowmode:** {readable} ({seconds}) seconds
[C_CASE_TARGET_USER]
**User:** {target}
[C_CASE_TARGET_CHANNEL]
**Channel:** #{target}
[C_CASE_TARGET_USER_VERBOSE]
**User:** {target} ({targetID})
[C_CASE_TARGET_CHANNEL_VERBOSE]
**Channel:** #{target} ({targetID})
[C_CASE_LENGTH]
**Length:** {time}
[C_CASE_LENGTH_VERBOSE]
**Length:** {time} ({inSeconds} seconds)
// Utility Module
//Ping Command
[C_PING_DESCRIPTION]
Shows the millisecond delay between the bot and the discord server.
//Settings Command
[C_SETTINGS_DESCRIPTION]
Configure your guild and user settings.
[C_SETTINGS_ADMINISTRATORERROR]
You must have the `ADMINISTRATOR` permission to run this.
[C_SETTINGS_CLIENTPERMISSIONERROR]
The setting **{setting}** requires __the bot__ to have permissions to use.
*Missing: {missing}*
[C_SETTINGS_MEMBERPERMISSIONERROR]
The setting **{setting}** requires __you__ to have permissions to use.
*Missing: {missing}*
[C_SETTINGS_RESET]
Are you sure you want to reset **all** of your {type} settings to the default values? This cannot be undone. *(__y__es, __n__o)*
This prompt will time out in __30 seconds__.
[C_SETTINGS_RESETERROR]
You provided an invalid input, please try again.
[C_SETTINGS_RESETABORT]
Successfully aborted the operation.
[C_SETTINGS_RESETSUCCESS]
All {type} settings were successfully deleted and set to default.
[C_SETTINGS_USERSETTINGSTITLE]
User Settings
[C_SETTINGS_GUILDSETTINGSTITLE]
Guild Settings
[C_SETTINGS_LISTSETTINGS]
Use `{prefix}setting [setting-name]` to view a description on the setting. Each setting is unique, so make sure to read carefully.
[C_SETTINGS_LISTSETTINGSALT]
Alternatively, you can view user settings by using the command `{prefix}settings -u`
[C_SETTINGS_NONEXISTANT]
That setting does not exist!
[C_SETTINGS_JSON]
Attached the JSON-formatted settings file in the file below.
You may want to format this file for your viewing pleasure.
//Avatar Command
[C_AVATAR_DESCRIPTION]
Fetches avatars for various users in different formats and sizes.
[C_AVATAR_FORMATERROR]
Unable to find an avatar with those arguments, try a different size or format.
//Lookup Command
[C_LOOKUP_DESCRIPTION]
Looks up a discord invite code and returns the information of the invite.
[C_LOOKUP_FAILEDMATCH]
Couldn't find a discord invite code, try again.
[C_LOOKUP_NONEXISTANT]
Unable to find any data about that invite code.
// Information Module
//Help Command
[C_HELP_DESCRIPTION]
Shows helpful information for commands, settings, and moderation.
[C_HELP]
**__HELP MENU__**
For a list of all available commands, use `{prefix}commands [ group ]`.
** Arguments**
The bot splits arguments by space unless specified otherwise. To pass an argument that contains spaces you have to encapsulate it in quotes, some exceptions exist.
**Ex:**
`{prefix}grant "rolename that contains spaces" < permission >` - quotes are necessary
`{prefix}user some user` - quotes not necessary
**Typically** if the argument is at the end of a command it won't require quotes.
** Documentation notation**
**Optional** arguments are denoted by being encapsulated in brackets `[ ]` - means that the command will run either with default values or show usage prompt.
**Required** arguments are denoted by less and greater than `< >` - means that the command will not run and return an error.
**Infinite** arguments (ones you can list several) are denoted by `..` after the argument. Ex `< argument.. >` - means you can pass more than one argument.
**Alternatives** are denoted by being separated by a `|`.
**Actual values** that you can use in a command are denoted by being surrounded by single quotes `' '`.
** Moderation**
For help with moderation, see `{prefix}help modhelp`.
__**Warning:** This is a long embed.__
** Command aliases**
Most commands and settings have some kind of aliases associated with them, some of which change the behaviour of the command or setting.
For instance the mute setting has a `createmute` (`{prefix}settings createmute <rolename>`) alias, which changes the behaviour to be identical to `{prefix}settings mute create <rolename>`.
** Detailed usage of commands**
`{prefix}help [ command / setting ]`
** Links**
[Support & Info server](https://discord.gg/SvJgtEj)
[@BotGalactic Twitter](https://twitter.com/BotGalactic)
[GalacticBot Patreon](https://www.patreon.com/galacticbot)
[C_HELP_TEMPLATE]
__**{component} HELP**__
{desc}
**Example usage**
{text}
[C_HELP_HELP]
Shows information about the bot and component usage.
To show help for commands `{prefix}help [command]`
[C_HELP_404]
Dude stop, {component} doesn't exist!
[C_HELP_TAGS]
**TAG SEARCH**
Commands and settings matching tag `{keyword}`.
For further help on how to use them, see `{prefix}help <component>`.
[MODHELP_TITLE]
**Moderation help menu**
[MODHELP_DESC]
**Galactic Bot** offers extensive moderation tools for servers, small and large, ranging from simple warnings and notes to mutes and tempbans. One of our more recent additions is automod. While not necessarily being a true automod, it'll keep track of moderation escalation for you with some configuration. Automod utilizes configurable modpoints and thresholds, for more information about automod see `{prefix}settings modpoints` and `{prefix}settings automod`.
**Galactic's** moderation commands can be viewed by using `{prefix}commands moderation`. The moderation utility follows a specific syntax for moderation, some parts allow for variation, while others require the arguments to be in specific locations in the command.
**The general syntax is:** `{prefix}<command> @user [time] [reason]`
Arguments that don't follow a strict pattern can be put anywhere **in the reason**. Such arguments are flags (and points, though they don't follow the same syntax as flags, more on that in a bit). For now there aren't many flags used by the moderation utility, though more may come in the future. The flags currently in use are `--force` and `--expires:<time>`, which are used to guide the automod.
[MODHELP_FIELD_1_NAME]
** Moderation flags**
[MODHELP_FIELD_1_VALUE]
`--force` is the flag used to bypass automod, i.e. if you think automod will change your infraction due to a threshold being exceeded pass the `--force` flag to override.
**Ex:** `{prefix}warn @user 2pts obnoxious --force` - this would force the infraction to be a warning even if the points issued would cause the total amount of points to exceed a threshold.
`--expire <time>` is the flag used to tell the automod that a custom infraction expiration time should be used instead of the defined modpoints expiration value.
**Ex:** `{prefix}warn @user 2pts obnoxious --expires 2d` - This tells the system that the infraction will expire in 2 days, instead of whatever was configured in the setting.
`--silent` is the flag used to tell the bot not to DM the infraction the user if the bot otherwise was configured to do so.
**Ex:** `{prefix}ban @user really obnoxious --silent` - with default configuration the bot would DM the user when removed from the server, passing the `--silent` flag will stop the bot from doing so.
[MODHELP_FIELD_2_NAME]
** Points**
[MODHELP_FIELD_2_VALUE]
Points are the point values defined either when running the command or in the modpoints setting. Issuing points is fairly simple, as they get picked up from anywhere in the **reason**, so long they follow the correct format. Points follow this pattern: `integer value points|point|pts|pt|p`. Any point values that exceed 100 will default to 100, and any point values that go below 0 will default to 0.
**Ex:** `{prefix}warn @user obnoxious 2 points`
[MODHELP_FIELD_3_NAME]
** Infraction history**
[MODHELP_FIELD_3_VALUE]
Infraction history will always be logged to the bot's database regardless of text channel output. As such GalacticBot provides tools to search logs and filter them to some extent with flags, such as `--filter:warn` or `--exclude:mute`.
When viewing a user's infraction history, the total amount on **unresolved infractions** is shown, and if modpoints are enabled, their unexpired points as well. This does **not** mean that they are not displayed in their history!
[MODHELP_FIELD_4_NAME]
** NOTE**
[MODHELP_FIELD_4_VALUE]
All flags and points will be parsed **out of the reason**, meaning that when issuing them they will not show up in the reason for the infraction. Points will be displayed in the infraction if the modpoints system is enabled and flags don't need to be displayed anywhere.
//Guild command
[C_GUILD_DESCRIPTION]
View data about the server.
[C_GUILD_TEMPLATE]
__Server information for **{name}**__
{description}
{emoji_owner} **Owner:** <@{owner}>
{emoji_booster4} **Boost tier:** {tier}
{emoji_booster3} **Boosters:** {boosters}
{emoji_calendar} **Date created:** {createdAt}
{emoji_region} **Voice region:** {region}
[C_GUILD_MEMBERS_NAME]
__Members__
[C_GUILD_MEMBERS]
{emoji_members} **Count:**
{memberCount}/{maxMembers}
{emoji_online} **Online:**
{approxPresences}/{maxPresences}
[C_GUILD_CHANNELS_NAME]
__Channels__
[C_GUILD_CHANNELS]
**Total:** {totalChannels}/500
{emoji_category-channel} **Categories:** {cat}
{emoji_text-channel} **Text:** {tc}
{emoji_voice-channel} **Voice:** {vc}
{news}
{store}
[C_GUILD_NEWS]
{emoji_news-channel} **News:** {news}
[C_GUILD_STORE]
{emoji_store-channel} **Store:** {store}
[C_GUILD_OTHER_NAME]
__Other__
[C_GUILD_OTHER]
{emoji_role} **Roles:**
{roleCount}/250
{emoji_sunglasses} **Emojis:**
{emojiCount}/{emojiTotal}
{emoji_flushed-awkward} **Gif emojis:**
{gifEmojiCount}/{emojiTotal}
[C_GUILD_FEATURES_NAME]
__Server features__
[C_GUILD_FEATURES]
{features}
[C_GUILD_NODESC]
No description set for guild, set one with `{prefix}set description <description here>`, alternatively the description of a community enabled server is shown here.
//User Command
[C_USER_DESCRIPTION]
Search for users or view user information.
[C_USER_DATA_NAME]
__User Data__
[C_USER_DATA]
**User:** <@{id}>{bot}
**Account created:** {created}
**Status:** {status}
**Activity:** {activity}
**Last global activity:** {globalActivity}
[C_USER_BADGES]
**Badges:** {badges}
[C_USER_MEMBER_NAME]
__Member Data__
[C_USER_MEMBER]
**Nickname:** {nickname}
**Server join date:** {joined}
**Last server activity:** {serverActivity}
[C_USER_MEMBER_ROLES]
**Roles:** {roles}
[C_USER_SEARCH_TITLE]
Search result for: `{key}`
[C_USER_SEARCH_FOOTER]
Found {matches} matches, displaying {count}
[C_USER_404]
{emoji_failure} No user found.
[C_USER_SEARCH_404]
{emoji_failure} No results found.
[C_USER_HELP]
To search server members with similar names use `{prefix}user search <arguments..>`
[C_USER_ROLES_TITLE]
__Member Roles__
//Commands Command
[C_COMMANDS_DESCRIPTION]
Displays all commands and help.
[C_COMMANDS_TITLE]
Commands
[C_COMMANDS_TEMPLATE]
Displaying commands for module `{mod}`.
{text}
[C_COMMANDS_FOOTER]
Commands that are struck through are disabled.
[C_COMMANDS]
To search by specific module, use `{prefix}commands [ module ]`.
You can also use `{prefix}commands [ command ]` for more information about the command.
//Prefix Command
[C_PREFIX_DESCRIPTION]
Displays the prefix that the server uses.
[C_PREFIX_SHOWPREFIX]
The guild's current prefix is **`{prefix}`**. You can also execute commands by mentioning me.
//privacyPolicy Command
[C_PRIVACYPOLICY_DESCRIPTION]
Displays the bot's privacy policy.
[C_PRIVACYPOLICY_PRIVACYDESCRIPTION]
Galactic (stable) and Galactic Canary (testing) bots only collect Discord user ID and message attachments (if applicable) data. We need your Discord user ID for remembering who you are, and your message attachments for logging tools for Discord server moderators. We use message attachments in order to view what users post after they're deleted by Discord, this ensures a safe place for users and a useful tool for moderators. This data is not shared with anyone. If you have questions or concerns about the bot, contact the developers in the Discord server [here]({invite}).
[C_PRIVACYPOLICY_DATA]
• Discord User IDs
• Message Attachments
To request removal of this data, reach out to the Developers [here]({invite}).
[C_PRIVACYPOLICY_OPTOUT]
You can opt-out of attachment storing by using the command `-set attachmentCache false`.
// Miscellaneous Module
//musicTaste Command
[C_MUSICTASTE_COMMAND]
See how many people are listening to what you're listening to, or view the most popular songs, albums, and artists in the user base.
// Developer Module
//Evaluate Command
[C_EVALUATE_DESCRIPTION]
Evaluates javascript code.
[C_RELOAD_DESCRIPTION]
Reloads components and language files.
//Statistics Command
[C_STATS_TITLE]
Statistics for {client} ({version})
[C_STATS_MAIN]
__**Main Process**__
[C_STATS_SYSTEM_VALUE]
**Developers:** {devs}
**Hostname:** {hostname}
**CPU:** {cpu}
**Threads:** {cores}
**Memory:** {memoryUsed}/{memoryTotal}GB
**OS Type:** {osType}
**System Uptime:** {uptime}
[C_STATS_MAIN_VALUE]
**Library:** Discord.js
**Library Version:** {library}
**Manager Uptime:** {uptime}
**Managed Shards:** {shards}
**Manager Memory Consumption:** {memory}MB
[C_STATS_CURRENT_SHARD]
__**Current shard**__ [{shard}]
[C_STATS_CURRENT_SHARDS_VALUE]
**Cached users:** {cachedUsers}
**Guilds:** {guilds}
**Channels:** {channels}
**Uptime:** {uptime}
**Memory Consumption:** {memory}MB
[C_STATS_TOTAL]
__**All shards**__
[C_STATS_TOTAL_VALUE]
**Cached users:** {users}
**Guilds:** {guilds}
**Channels:** {channels}
**Average Uptime:** {uptime}
**Total Memory Consumption:** {memory}MB
[C_STATS_COMMANDS]
__**Command usage since start**__
[C_STATS_COMMANDS_VALUE]
**Invokes:** {invokes}
**Succeeds:** {success}
**Fails:** {fail}
[C_STATS_MONGODB]
__**MongoDB**__
[C_STATS_MONGODB_VALUE]
**Database:** {db}
**Collections:** {collections}
**Entries:** {objects}
**Average Entry Size:** {avgObjSize}MB
**Total DB Size:** {totalSize}GB
[C_STATS_CACHE]
__**Cache**__
[C_STATS_CACHE_VALUE]
**Messages:** {cachedMessages}
**Average caches messages per shard:** {messageAvg}
**Members:** {cachedMembers}
**Average cached members per shard:** {memberAvg}

View File

@ -0,0 +1,108 @@
// Inhibitors
//Client Permissions
[I_CLIENTPERMISSIONS_ERROR]
The command **{command}** requires the bot to have permissions to use.
*Missing: {missing}.*
//Disabled
[I_DISABLED_ERROR]
The command **{command}** is disabled {modifier}.
[I_DISABLED_ERRORMODIFIER]
switch("{globally}") {
case true:
'globally';
break;
case false:
'in this server';
break;
}
//Guild Only
[I_GUILDONLY_ERROR]
The command **{command}** can only be run in servers.
//Member Permissions
[I_PERMISSIONS_ERROR]
The command **{command}** requires you to have permissions to use.
*Missing: {missing}.*
//Restricted
[I_RESTRICTED_ERROR]
The command **{command}** can only be run by developers.
//Throttle
[I_THROTTLE_ERROR]
The command **{command}** is currently throttled.
*You can use this command again in `{remaining}` seconds.*
//Channel Ignore
[I_CHANNELIGNORE_ERROR]
This channel is ignored by the bot, this should not be sending.
// Message Logging
[MSGLOG_DELETE_TITLE]
{emoji_trash} {author}'s message was deleted in #{channel}
[MSGLOG_DELETE_FOOTER]
Message ID: {msgID} | User ID: {userID}
[MSGLOG_EDIT_TITLE]
{emoji_note} {author} edited their message in #{channel}
[MSGLOG_EDIT_FOOTER]
Message ID: {msgID} | User ID: {userID}
[MSGLOG_EDIT_OLD]
Old message
[MSGLOG_EDIT_NEW]
New message
[MSGLOG_EDIT_OLD_CUTOFF]
The original message was cut off at 1024 characters.
[MSGLOG_EDIT_NEW_CUTOFF]
The new message is cut off at 1024 characters.
[MSGLOG_EDIT_JUMP]
**[Jump to message](https://discordapp.com/channels/{guild}/{channel}/{message})**
[MSGLOG_PINNED_TITLE]
{emoji_pin} {author}'s message was {pinned} in #{channel}
[PIN_TOGGLE]
switch({toggle}) {
case true:
'pinned';
break;
default:
'unpinned';
break;
}
//VOICE LOGGING
[VCLOG_JOIN]
{nickname} **{tag}** ({id}) joined channel {emoji_voice-channel} **{newChannel}**.
[VCLOG_SWITCH]
{nickname} **{tag}** ({id}) switched from {emoji_voice-channel} **{oldChannel}** to {emoji_voice-channel} **{newChannel}**.
[VCLOG_LEAVE]
{nickname} **{tag}** ({id}) left channel {emoji_voice-channel} **{oldChannel}**
//NICKNAME LOGGING
[NICKLOG_TITLE]
{user} updated their nickname
[NICKLOG_DESCRIPTION]
**Old nickname:** `{oldNick}`
**New nickname:** `{newNick}`
[NICKLOG_FOOTER]
User ID: {id}

View File

@ -0,0 +1,436 @@
// Administration Module
//permissionType Setting
[S_PERMISSIONTYPE_DESCRIPTION]
Changes how permissions will be regarded for bot commands. For all modes except for the "discord" mode, you can use the `{prefix}grant` and the `{prefix}revoke` commands to configure permissions.
__Permission Types__
**`discord`:** Only discord-based permissions work with bot commands.
**`grant`:** Only grantable permissions from the bot work with bot commands. *(requires you to set everything up yourself)*
**`both`:** Both discord-based and grantable permissions work with bot commands. *(default)*
[S_PERMISSIONTYPE_INVALIDTYPE]
The provided value is not a valid permission type; try: `discord`, `grant`, or `both`.
Use the command `{prefix}setting permissiontype` for more information.
[S_PERMISSIONTYPE_SUCCESS]
Successfully set permission type to `{type}`.
**{description}**
[S_PERMISSIONTYPE_DESCRIPTIONS]
switch('{type}') {
case 'discord':
"Only discord-based permissions will work with bot commands."
break;
case 'grant':
"Only grantable permissions from the bot will work with bot commands."
break;
case 'both':
"Both discord-based and grantable permissions work with bot commands."
break;
}
[S_PERMISSIONTYPE_GRANTWARNING]
You enabled the **discord** permission type, which means **nobody can use commands until Administrators grants roles/users the permission to use them**. For more information, refer to the `{prefix}grant` and `{prefix}revoke` commands.
// Moderation Module
//Protection Setting
[S_PROTECTION_DESCRIPTION]
Configure how moderation immunity works. Can be specific roles or role position based.
__Protection Types__
**`position`:** Users cannot infract others with a higher role than them. *(default)*
**`role`:** Users cannot infract others with specified protection roles.
[S_PROTECTION_INVALID_ARGS]
Invalid argument, must be either `role` or `position`.
[S_PROTECTION_TYPE]
Successfully set protection type to `{type}`.
[S_PROTECTION_ADD]
Added `{changes}` to the protected list.
[S_PROTECTION_REMOVE]
Removed `{changes}` from the protected list.
[S_PROTECTION_SET]
Set the protected list to `{changes}`.
[S_PROTECTION_LIST]
The following roles are protected.
{list}
//moderationPoints Setting
[S_MODPOINTS_DESCRIPTION]
Configure points and point expirations for infractions. Used by automod
[S_MODPOINTS_NAN]
Invalid points: `{arg}`
[S_MODPOINTS_TOOSMALL]
The provided integer is too small: `{arg}`
[S_MODPOINTS_TOOBIG]
The provided integer is too big: `{arg}`
[S_MODPOINTS_INVALID_TIMESTRING]
Could not parse a valid timestring from arguments!
Make sure you're using the right format!
**(int unit)**
s, sec, secs, second, seconds - will parse to seconds
m, min, mins, minute, minutes - will parse to minutes
h, hr, hrs, hour, hours - will parse to hours
d, day, days - will parse to days
w, week, weeks - will parse to weeks
mon, mth, mths, month, months - will parse to months
y, yr, yrs, year, years - will parse to years
[S_MODPOINTS_ASSOCIATE]
Successfully associated `{word}` to `{points}` points.
[S_MODPOINTS_ASSOCIATE_REMOVE]
Successfully removed the following associations: {words}
[S_MODPOINTS_ASSOCIATE_RESET]
Successfully cleared all point associations.
[S_MODPOINTS_EXPIRE]
Successfully set {type} to expire in `{time}` time.
[S_MODPOINTS_TOGGLE]
Successfully toggled modpoints {toggle}.
//IGNORE SETTING
[S_IGNORE_DESCRIPTION]
Define the channels that the bot will ignore commands in from non-bypassed users.
[S_IGNORE_ADD]
Successfully added the following channels to the ignore list:
`{changes}`
[S_IGNORE_REMOVE]
Successfully removed the following channels from the ignore list:
`{changes}`
[S_IGNORE_LIST]
The following channels are being ignored by the bot:
`{channels}`
The following roles have ignore bypass enabled:
`{roles}`
[S_IGNORE_BYPASS_ADD]
Successfully added the following roles to the ignore bypass:
`{changes}`
[S_IGNORE_BYPASS_REMOVE]
Successfully removed the following roles from the ignore bypass:
`{changes}`
//moderationLog Setting
[S_MODERATIONLOG_DESCRIPTION]
Define the channel to which moderation logs are sent. The setting also allows you to exclude types of actions from being logged in the channel.
[S_MODERATIONLOG_CHANNEL404]
{val} does not resolve into a channel.
[S_MODERATIONLOG_CHANNEL_SUCCESS]
Successfully set the modlogs channel to {channel}.
[S_MODERATIONLOG_OFF]
Successfully disabled moderation logs.
[S_MODERATIONLOG_LIST]
The following infractions are set to be logged:
`{list}`
[S_MODERATIONLOG_REMOVE]
The following infraction types will no longer be logged:
`{list}`
[S_MODERATIONLOG_ADD]
The following infraction types will now be logged:
`{list}`
//nicknameLog Setting
[S_NICKNAMELOG_DESCRIPTION]
Configure member nickname logging for your server.
[S_NICKNAMELOG_TOGGLE]
Successfully toggled member nickname logging **{changed}**.
[S_NICKNAMELOG_CHANNEL]
Successfully set member nicknames to log to {emoji_text-channel}**{changed}**.
//memberLog Setting
[S_MEMBERLOG_DESCRIPTION]
Configure member join and leave logging for your server.
__Available Tags__
**`{mention}`**: user mention
**`{tag}`:** username#discriminator
**`{user}`:** username
**`{serversize}`:** server member count
**`{servername}`:** server name
**`{accage}`:** user age
**`{id}`:** user ID
[S_MEMBERLOGS_TOGGLE]
Successfully turned member logging **{changed}**.
[S_MEMBERLOGS_CHANNEL]
Successfully set member joins and leaves to log to {emoji_text-channel}**{changed}**.
[S_MEMBERLOGS_JOIN]
Successfully **{action}** the member join message to
`{changed}`
[S_MEMBERLOGS_LEAVE]
Successfully **{action}** the member leave message to
`{changed}`
//voiceLog Setting
[S_VOICELOG_DESCRIPTION]
Configure logging of voice joins and leaves for your server.
[S_VOICELOG_TOGGLE]
Successfully turned voice join and leave logging **{changed}**.
[S_VOICELOG_CHANNEL]
Successfully set voice joins and leaves to log to {emoji_text-channel}**{changed}**.
//messageLog Setting
[S_MESSAGELOG_DESCRIPTION]
Configure message logging for your server.
Message logging utilizes webhooks for bulk message deletions, so if you wish to log those, make sure the bot has the `MANAGE_WEBHOOKS` permission in the logging channel!
If you've given the permission retroactively, make sure to reconfigure the channel to ensure the bot creates the webhook.
[S_MESSAGELOG_ROLES_LIST]
The following roles are ignored by chatlogs:
{roles}
[S_MESSAGELOG_CHANNELS_LIST]
The following channels are ignored by chatlogs:
{channels}
[S_MESSAGELOG_ROLES]
Successfully {action} the following roles:
{changed}
[S_MESSAGELOG_CHANNELS]
Successfully {action} the following channels:
{changed}
[S_MESSAGELOG_ATTACHMENTS]
Successfully turned attachment logging **{changed}**.
[S_MESSAGELOG_RESET]
Successfully reset the chatlogs setting.
[S_MESSAGELOG_TOGGLE]
Successfully turned message logging **{changed}**.
[S_MESSAGELOG_TOGGLE_PERM]
Successfully turned message logging **{changed}**.
**Note:** The bot lacks the `MANAGE_WEBHOOKS` permission and is as such unable to configure the webhook for message logging.
[S_MESSAGELOG_CHANNEL]
Successfully set messages to log to {emoji_text-channel}**{changed}**.
//mute Setting
[S_MUTE_DESCRIPTION]
**Assign/create a muted role, choose mute functionality, define a default mute duration, or enable permanent mutes.** If creating a new muted role, creating permissions could take some time. Default mute durations will only be assigned if permanent mutes are off and a duration is not passed to the mute command.
__Mute Types__
**`0`:** Mutes only add/remove the muted role. *(default)*
**`1`:** Mutes remove all roles except for the muted role.
**`2`:** Mutes remove all roles, does not require a muted role.
[S_MUTE_TYPENAN]
The argument provided is not a number! The available types are: `0`, `1`, or `2`.
View `{prefix}setting mute` for more help.
[S_MUTE_TYPEINVALID]
The argument provided is not a valid type! The available types are: `0`, `1`, or `2`.
View `{prefix}setting mute` for more help.
[S_MUTE_TYPESUCCESS]
Successfully set the **mute type** to `{type}`.
[S_MUTE_TYPESWITCH]
switch({type}) {
case 0:
"Mutes will now *only add/remove* the muted role.";
break;
case 1:
"Mutes will now *remove all roles except for the muted role*, and then add them back once done.";
break;
case 2:
"Mutes will now *remove all roles* and then add them back once done.";
break;
}
[S_MUTE_PERMANENTINVALID]
The argument provided is not a boolean value. *(__t__rue, __f__alse)*
[S_MUTE_PERMANENTSUCCESS]
Successfully set **permanent mutes** to `{boolean}`.
[S_MUTE_DEFAULTINVALID]
The argument provided is not a time value. *(1hr, 3d, etc.)*
[S_MUTE_DEFAULTSUCCESS]
Successfully set the **default duration** to `{time} seconds`.
[S_MUTE_ROLEMISSINGPERMISSION]
The bot *must have* the `MANAGE_ROLES` permission to create a new mute role.
[S_MUTE_ROLEPROMPT]
Found an existing role named **{name}** `({id})`, would you like to use it and update these roles permissions?
Answering no will create a new role with updated permissions. *(__y__es, __n__o)*
This prompt will time out in __30 seconds__.
[S_MUTE_ROLEPROMPTERROR]
You provided an invalid input, please try again.
[S_MUTE_ROLECREATEERROR]
The bot encountered an issue while creating a role for the guild.
[S_MUTE_ROLEMISSING]
Cannot find a specified role with those arguments.
To create a new role, try `{prefix}setting createmute Muted`
[S_MUTE_CREATESUCCESS]
Successfully{created}set the **mute role** to `{role}`.
{permissions}
[S_MUTE_CREATESUCCESSALT]
created and
[S_MUTE_CREATESUCCESSWARNING]
Some issues were found while creating permissions.
[S_MUTE_GENERATEDPERMISSIONS]
**Permissions have been applied to all possible channels.**
[S_MUTE_UNGENERATEDPERMISSIONS]
**None of the permissions have been changed.**
//Silent Setting
[S_SILENT_DESCRIPTION]
Configure if all moderation commands will execute silently. Silent executions will delete the exeuctor's message and will not respond unless encountering an error.
[S_SILENT_INVALID]
The argument provided is not a boolean value. *(__t__rue, __f__alse)*
[S_SILENT_SUCCESS]
Successfully set **silent** to `{value}`.
// Utility Module
//stickyRole Setting
[S_STICKYROLE_DESCRIPTION]
Configure the role persistence when users leave and rejoin (roles get automatically reassigned upon rejoin).
[S_STICKYROLE_TOGGLE]
Successfully toggled role persistence `{toggle}`.
[S_STICKYROLE_ADD]
Successfully made `{changes}` sticky.
[S_STICKYROLE_REMOVE]
Successfully made `{changes}` unsticky.
[S_STICKYROLE_SET]
Successfully set sticky roles to `{changes}`.
[S_STICKYROLE_LIST]
The following roles persist when a user leaves and rejoins:
{list}
//guildIndex setting
[S_INDEX_DESCRIPTION]
Configure guild indexing and description for your guild.
[S_INDEX_DESCRIPTION_SET]
Successfully set the guild description to
```
{changes}
```
[S_INDEX_TOGGLE]
Successfully toggled guild indexing `{toggle}`.
//welcomer Setting
[S_WELCOMER_DESCRIPTION]
Configure a message that is sent to new members upon join.
**Usable tags:**
{mention} - mentions the user
{tag} - username#discriminator
{user} - username
{guildsize} - member count of the server
{guildname} - name of the server
{accage} - age of the account
{id} - ID of the account
[S_WELCOMER_TOGGLE]
Successfully toggled the welcomer `{toggle}`.
[S_WELCOMER_SET]
Successfully set the welcomer message to
`{change}`
//guildPrefix Setting
[S_GUILDPREFIX_DESCRIPTION]
Customizes your prefix in the guild.
[S_GUILDPREFIX_SUCCESS]
Successfully set the guild prefix to `{prefix}`.
[S_GUILDPREFIX_LENGTH]
The guild prefix cannot exceed {max} characters. `[{length}/{max}]`.
[S_GUILDPREFIX_SPACES]
The guild prefix cannot include spaces.
[S_GUILDPREFIX_RESET]
Successfully reset the guild prefix to `{prefix}`.
//autorole setting
[S_AUTOROLE_DESCRIPTION]
Configure automatic role assignment in your guild.
[S_AUTOROLE_ADD]
Successfully added the following roles to autorole:
`{changes}`
[S_AUTOROLE_REMOVE]
Successfully removed the following roles from autorole:
`{changes}`
[S_AUTOROLE_LIST]
The following roles are added to users upon join.
{list}
// Developer Module
//Premium Setting
[S_PREMIUM_DESCRIPTION]
View the server's current premium subscription tier.

View File

@ -1,13 +0,0 @@
[PING_COMMAND_RESPONSE]
Pong! {number}
[C_USER]
**Nimimerkki:** {nickname}
**Käyttäjä:** <@{id}>
**Liittyi serveriin:** {joined}
**Liittyi Discordiin:** {created}
**Tila:** {status}
**Aktiviteetti:** {activity}
**Viimeisin viesti serverissä:** {serverActivity}
**Viimeisin viesti:** {globalActivity}
**Roolit:** {roles}

View File

@ -38,3 +38,14 @@ exports.PermissionNames = {
MANAGE_WEBHOOKS: "Manage Webhooks", MANAGE_WEBHOOKS: "Manage Webhooks",
MANAGE_EMOJIS: "Manage Emojis" MANAGE_EMOJIS: "Manage Emojis"
}; };
exports.EmbedLimits = {
embed: 6000,
title: 256,
description: 2048,
fieldObjects: 25,
fieldName: 256,
fieldValue: 1024,
footerText: 2048,
authorName: 256
};

View File

@ -1,9 +1,11 @@
//Evaluate Command
[C_EVALUATE_DESCRIPTION] [C_EVALUATE_DESCRIPTION]
Evaluates javascript code. Evaluates javascript code.
[C_RELOAD_DESCRIPTION] [C_RELOAD_DESCRIPTION]
Reloads components and language files. Reloads components and language files.
//Statistics Command
[C_STATS_TITLE] [C_STATS_TITLE]
Statistics for {client} ({version}) Statistics for {client} ({version})

View File

@ -1,5 +1,4 @@
//Help Command //Help Command
[C_HELP_DESCRIPTION] [C_HELP_DESCRIPTION]
Shows helpful information for commands, settings, and moderation. Shows helpful information for commands, settings, and moderation.
@ -76,8 +75,8 @@ Arguments that don't follow a strict pattern can be put anywhere **in the reason
`--force` is the flag used to bypass automod, i.e. if you think automod will change your infraction due to a threshold being exceeded pass the `--force` flag to override. `--force` is the flag used to bypass automod, i.e. if you think automod will change your infraction due to a threshold being exceeded pass the `--force` flag to override.
**Ex:** `{prefix}warn @user 2pts obnoxious --force` - this would force the infraction to be a warning even if the points issued would cause the total amount of points to exceed a threshold. **Ex:** `{prefix}warn @user 2pts obnoxious --force` - this would force the infraction to be a warning even if the points issued would cause the total amount of points to exceed a threshold.
`--expires:<time>` is the flag used to tell the automod that a custom infraction expiration time should be used instead of the defined modpoints expiration value. `--expire <time>` is the flag used to tell the automod that a custom infraction expiration time should be used instead of the defined modpoints expiration value.
**Ex:** `{prefix}warn @user 2pts obnoxious --expires:2 days` - This tells the system that the infraction will expire in 2 days, instead of whatever was configured in the setting. **Ex:** `{prefix}warn @user 2pts obnoxious --expires 2d` - This tells the system that the infraction will expire in 2 days, instead of whatever was configured in the setting.
`--silent` is the flag used to tell the bot not to DM the infraction the user if the bot otherwise was configured to do so. `--silent` is the flag used to tell the bot not to DM the infraction the user if the bot otherwise was configured to do so.
**Ex:** `{prefix}ban @user really obnoxious --silent` - with default configuration the bot would DM the user when removed from the server, passing the `--silent` flag will stop the bot from doing so. **Ex:** `{prefix}ban @user really obnoxious --silent` - with default configuration the bot would DM the user when removed from the server, passing the `--silent` flag will stop the bot from doing so.
@ -104,7 +103,6 @@ When viewing a user's infraction history, the total amount on **unresolved infra
All flags and points will be parsed **out of the reason**, meaning that when issuing them they will not show up in the reason for the infraction. Points will be displayed in the infraction if the modpoints system is enabled and flags don't need to be displayed anywhere. All flags and points will be parsed **out of the reason**, meaning that when issuing them they will not show up in the reason for the infraction. Points will be displayed in the infraction if the modpoints system is enabled and flags don't need to be displayed anywhere.
//Guild command //Guild command
[C_GUILD_DESCRIPTION] [C_GUILD_DESCRIPTION]
View data about the server. View data about the server.
@ -236,3 +234,19 @@ Displays the prefix that the server uses.
[C_PREFIX_SHOWPREFIX] [C_PREFIX_SHOWPREFIX]
The guild's current prefix is **`{prefix}`**. You can also execute commands by mentioning me. The guild's current prefix is **`{prefix}`**. You can also execute commands by mentioning me.
//Privacy Policy Command
[C_PRIVACYPOLICY_DESCRIPTION]
Displays the bot's privacy policy.
[C_PRIVACYPOLICY_PRIVACYDESCRIPTION]
Galactic (stable) and Galactic Canary (testing) bots only collect Discord user ID and message attachments (if applicable) data. We need your Discord user ID for remembering who you are, and your message attachments for logging tools for Discord server moderators. We use message attachments in order to view what users post after they're deleted by Discord, this ensures a safe place for users and a useful tool for moderators. This data is not shared with anyone. If you have questions or concerns about the bot, contact the developers in the Discord server [here]({invite}).
[C_PRIVACYPOLICY_DATA]
• Discord User IDs
• Message Attachments
To request removal of this data, reach out to the Developers [here]({invite}).
[C_PRIVACYPOLICY_OPTOUT]
You can opt-out of attachment storing by using the command `-set attachmentCache false`.

View File

@ -1,93 +1,3 @@
//Case command
[C_CASE_DESCRIPTION]
View a specific case
[C_CASE_INVALID]
Case ID `{caseID}` is invalid! Make sure it's an integer above 0.
[C_CASE_NOTFOUND]
No case matching ID `{caseID}` was found.
[C_CASE_TITLE]
{emoji_book} Case **#{caseID}**
[C_CASE_TITLE_VERBOSE]
{emoji_book} Case **#{caseID} (verbose)**
[C_CASE_CHANGES_TITLE]
{emoji_note} Changes to case **#{case}**
[C_CASE_CHANGES_NONE]
No changes have been made to the case.
[C_CASE_CHANGE_BASE]
**Timestamp:** {date} | {timeAgo} ago
**Staff:** {staff}
[C_CASE_CHANGES_RESOLVE]
**Reason:** {reason}
[C_CASE_CHANGES_REASON]
**Old reason:** {reason}
[C_CASE_CHANGES_DURATION]
**Old duration:** {duration}
[C_CASE_CHANGE_NOREASON]
`No reason given`
[C_CASE_TEMPLATE]
**[Jump to message (if available)](https://discord.com/channels/{guild}/{channel}/{message})**
**Unique ID:** {uniqueID}
**Type:** {type}
**Timestamp:** {date} | {relativeTime} ago
{target}
**Staff:** {staff}
**Changes:** {nrChanges}
[C_CASE_TEMPLATE_VERBOSE]
**[Jump to message (if available)](https://discord.com/channels/{guild}/{channel}/{message})**
**Unique ID:** {uniqueID}
**Type:** {type}
**Timestamp:** {date} | {relativeTime} ago
**UNIX timestamp:** {unix} | {relativeTimeSeconds} seconds ago
{target}
**Staff:** {staff} ({staffID})
**Amount of changes:** {nrChanges}
**Changes:** {changes}
[C_CASE_MODPOINTS]
**Points:** {points}
**Expires:** {expires}
[C_CASE_REASON]
**Reason:**
```{reason}```
[C_CASE_SLOWMODE]
**Slowmode:** {readable}
[C_CASE_SLOWMODE_VERBOSE]
**Slowmode:** {readable} ({seconds}) seconds
[C_CASE_TARGET_USER]
**User:** {target}
[C_CASE_TARGET_CHANNEL]
**Channel:** #{target}
[C_CASE_TARGET_USER_VERBOSE]
**User:** {target} ({targetID})
[C_CASE_TARGET_CHANNEL_VERBOSE]
**Channel:** #{target} ({targetID})
[C_CASE_LENGTH]
**Length:** {time}
[C_CASE_LENGTH_VERBOSE]
**Length:** {time} ({inSeconds} seconds)
//Note Command //Note Command
[C_NOTE_DESCRIPTION] [C_NOTE_DESCRIPTION]
Note members with a description, will not be logged. Note members with a description, will not be logged.
@ -365,3 +275,93 @@ You may want to format this file for your viewing pleasure.
[C_HISTORY_FAILEXPORT] [C_HISTORY_FAILEXPORT]
Unable to upload JSON file, the file is too large to upload here. **\`[amount/max]\`** Unable to upload JSON file, the file is too large to upload here. **\`[amount/max]\`**
If you absolutely need this, contact a bot developer in our support server. If you absolutely need this, contact a bot developer in our support server.
//Case Command
[C_CASE_DESCRIPTION]
View a specific case
[C_CASE_INVALID]
Case ID `{caseID}` is invalid! Make sure it's an integer above 0.
[C_CASE_NOTFOUND]
No case matching ID `{caseID}` was found.
[C_CASE_TITLE]
{emoji_book} Case **#{caseID}**
[C_CASE_TITLE_VERBOSE]
{emoji_book} Case **#{caseID} (verbose)**
[C_CASE_CHANGES_TITLE]
{emoji_note} Changes to case **#{case}**
[C_CASE_CHANGES_NONE]
No changes have been made to the case.
[C_CASE_CHANGE_BASE]
**Timestamp:** {date} | {timeAgo} ago
**Staff:** {staff}
[C_CASE_CHANGES_RESOLVE]
**Reason:** {reason}
[C_CASE_CHANGES_REASON]
**Old reason:** {reason}
[C_CASE_CHANGES_DURATION]
**Old duration:** {duration}
[C_CASE_CHANGE_NOREASON]
`No reason given`
[C_CASE_TEMPLATE]
**[Jump to message (if available)](https://discord.com/channels/{guild}/{channel}/{message})**
**Unique ID:** {uniqueID}
**Type:** {type}
**Timestamp:** {date} | {relativeTime} ago
{target}
**Staff:** {staff}
**Changes:** {nrChanges}
[C_CASE_TEMPLATE_VERBOSE]
**[Jump to message (if available)](https://discord.com/channels/{guild}/{channel}/{message})**
**Unique ID:** {uniqueID}
**Type:** {type}
**Timestamp:** {date} | {relativeTime} ago
**UNIX timestamp:** {unix} | {relativeTimeSeconds} seconds ago
{target}
**Staff:** {staff} ({staffID})
**Amount of changes:** {nrChanges}
**Changes:** {changes}
[C_CASE_MODPOINTS]
**Points:** {points}
**Expires:** {expires}
[C_CASE_REASON]
**Reason:**
```{reason}```
[C_CASE_SLOWMODE]
**Slowmode:** {readable}
[C_CASE_SLOWMODE_VERBOSE]
**Slowmode:** {readable} ({seconds}) seconds
[C_CASE_TARGET_USER]
**User:** {target}
[C_CASE_TARGET_CHANNEL]
**Channel:** #{target}
[C_CASE_TARGET_USER_VERBOSE]
**User:** {target} ({targetID})
[C_CASE_TARGET_CHANNEL_VERBOSE]
**Channel:** #{target} ({targetID})
[C_CASE_LENGTH]
**Length:** {time}
[C_CASE_LENGTH_VERBOSE]
**Length:** {time} ({inSeconds} seconds)

View File

@ -1,8 +1,8 @@
//Commands //Commands
//Settings //Settings
//permissionType Setting
//permissionType Setting
[S_PERMISSIONTYPE_DESCRIPTION] [S_PERMISSIONTYPE_DESCRIPTION]
Changes how permissions will be regarded for bot commands. For all modes except for the "discord" mode, you can use the `{prefix}grant` and the `{prefix}revoke` commands to configure permissions. Changes how permissions will be regarded for bot commands. For all modes except for the "discord" mode, you can use the `{prefix}grant` and the `{prefix}revoke` commands to configure permissions.

View File

@ -1,4 +1,4 @@
//PROTECTION SETTING //Protection Setting
[S_PROTECTION_DESCRIPTION] [S_PROTECTION_DESCRIPTION]
Configure how moderation immunity works. Can be specific roles or role position based. Configure how moderation immunity works. Can be specific roles or role position based.
@ -25,8 +25,8 @@ Set the protected list to `{changes}`.
The following roles are protected. The following roles are protected.
{list} {list}
//MODPOINTS SETTING //moderationPoints Setting
[SM_MODPOINTS_DESCRIPTION] [S_MODPOINTS_DESCRIPTION]
Configure points and point expirations for infractions. Used by automod Configure points and point expirations for infractions. Used by automod
[S_MODPOINTS_NAN] [S_MODPOINTS_NAN]
@ -93,7 +93,7 @@ Successfully added the following roles to the ignore bypass:
Successfully removed the following roles from the ignore bypass: Successfully removed the following roles from the ignore bypass:
`{changes}` `{changes}`
//modlogs setting //moderationLog Setting
[S_MODERATIONLOG_DESCRIPTION] [S_MODERATIONLOG_DESCRIPTION]
Define the channel to which moderation logs are sent. The setting also allows you to exclude types of actions from being logged in the channel. Define the channel to which moderation logs are sent. The setting also allows you to exclude types of actions from being logged in the channel.
@ -119,8 +119,7 @@ The following infraction types will no longer be logged:
The following infraction types will now be logged: The following infraction types will now be logged:
`{list}` `{list}`
//NICKNAMELOGS SETTING //nicknameLog Setting
[S_NICKNAMELOG_DESCRIPTION] [S_NICKNAMELOG_DESCRIPTION]
Configure member nickname logging for your server. Configure member nickname logging for your server.
@ -130,7 +129,7 @@ Successfully toggled member nickname logging **{changed}**.
[S_NICKNAMELOG_CHANNEL] [S_NICKNAMELOG_CHANNEL]
Successfully set member nicknames to log to {emoji_text-channel}**{changed}**. Successfully set member nicknames to log to {emoji_text-channel}**{changed}**.
//MEMBERLOGS SETTING //memberLog Setting
[S_MEMBERLOG_DESCRIPTION] [S_MEMBERLOG_DESCRIPTION]
Configure member logging for your server. Configure member logging for your server.
@ -158,8 +157,7 @@ Successfully **{action}** the member join message to
Successfully **{action}** the member leave message to Successfully **{action}** the member leave message to
`{changed}` `{changed}`
//VOICELOGS SETTING //voiceLog Setting
[S_VOICELOG_DESCRIPTION] [S_VOICELOG_DESCRIPTION]
Configure logging of voice joins and leaves for your server. Configure logging of voice joins and leaves for your server.
@ -169,8 +167,7 @@ Successfully turned voice join and leave logging **{changed}**.
[S_VOICELOG_CHANNEL] [S_VOICELOG_CHANNEL]
Successfully set voice joins and leaves to log to {emoji_text-channel}**{changed}**. Successfully set voice joins and leaves to log to {emoji_text-channel}**{changed}**.
//CHATLOGS|MESSAGELOGS SETTING //messageLog Setting
[S_MESSAGELOG_DESCRIPTION] [S_MESSAGELOG_DESCRIPTION]
Configure message logging for your server. Configure message logging for your server.
Message logging utilizes webhooks for bulk message deletions, so if you wish to log those, make sure the bot has the `MANAGE_WEBHOOKS` permission in the logging channel! Message logging utilizes webhooks for bulk message deletions, so if you wish to log those, make sure the bot has the `MANAGE_WEBHOOKS` permission in the logging channel!
@ -210,7 +207,6 @@ Successfully turned message logging **{changed}**.
Successfully set messages to log to {emoji_text-channel}**{changed}**. Successfully set messages to log to {emoji_text-channel}**{changed}**.
//mute Setting //mute Setting
[S_MUTE_DESCRIPTION] [S_MUTE_DESCRIPTION]
**Assign/create a muted role, choose mute functionality, define a default mute duration, or enable permanent mutes.** If creating a new muted role, creating permissions could take some time. Default mute durations will only be assigned if permanent mutes are off and a duration is not passed to the mute command. **Assign/create a muted role, choose mute functionality, define a default mute duration, or enable permanent mutes.** If creating a new muted role, creating permissions could take some time. Default mute durations will only be assigned if permanent mutes are off and a duration is not passed to the mute command.
@ -273,8 +269,15 @@ The bot encountered an issue while creating a role for the guild.
Cannot find a specified role with those arguments. Cannot find a specified role with those arguments.
To create a new role, try `{prefix}setting createmute Muted` To create a new role, try `{prefix}setting createmute Muted`
[S_MUTE_ROLESUCCESS] [S_MUTE_CREATESUCCESS]
Successfully {type} the **mute role** to `{role}`. Successfully{created}set the **mute role** to `{role}`.
{permissions}
[S_MUTE_CREATESUCCESSALT]
created and
[S_MUTE_CREATESUCCESSWARNING]
Some issues were found while creating permissions.
[S_MUTE_GENERATEDPERMISSIONS] [S_MUTE_GENERATEDPERMISSIONS]
**Permissions have been applied to all possible channels.** **Permissions have been applied to all possible channels.**
@ -282,10 +285,6 @@ Successfully {type} the **mute role** to `{role}`.
[S_MUTE_UNGENERATEDPERMISSIONS] [S_MUTE_UNGENERATEDPERMISSIONS]
**None of the permissions have been changed.** **None of the permissions have been changed.**
[S_MUTE_ISSUES]
Some issues were found while creating permissions:
{issues}
//Silent Setting //Silent Setting
[S_SILENT_DESCRIPTION] [S_SILENT_DESCRIPTION]
Configure if all moderation commands will execute silently. Silent executions will delete the exeuctor's message and will not respond unless encountering an error. Configure if all moderation commands will execute silently. Silent executions will delete the exeuctor's message and will not respond unless encountering an error.

View File

@ -1,6 +1,4 @@
//Guild Settings //stickyRole Setting
//STICKYROLE
[S_STICKYROLE_DESCRIPTION] [S_STICKYROLE_DESCRIPTION]
Configure the role persistence when users leave and rejoin (roles get automatically reassigned upon rejoin). Configure the role persistence when users leave and rejoin (roles get automatically reassigned upon rejoin).
@ -20,8 +18,7 @@ Successfully set sticky roles to `{changes}`.
The following roles persist when a user leaves and rejoins: The following roles persist when a user leaves and rejoins:
{list} {list}
//GUILD INDEXING //guildIndex setting
[S_INDEX_DESCRIPTION] [S_INDEX_DESCRIPTION]
Configure guild indexing and description for your guild. Configure guild indexing and description for your guild.
@ -34,7 +31,7 @@ Successfully set the guild description to
[S_INDEX_TOGGLE] [S_INDEX_TOGGLE]
Successfully toggled guild indexing `{toggle}`. Successfully toggled guild indexing `{toggle}`.
//GUILD WELCOMER //welcomer Setting
[S_WELCOMER_DESCRIPTION] [S_WELCOMER_DESCRIPTION]
Configure a message that is sent to new members upon join. Configure a message that is sent to new members upon join.
@ -55,7 +52,6 @@ Successfully set the welcomer message to
`{change}` `{change}`
//guildPrefix Setting //guildPrefix Setting
[S_GUILDPREFIX_DESCRIPTION] [S_GUILDPREFIX_DESCRIPTION]
Customizes your prefix in the guild. Customizes your prefix in the guild.
@ -87,5 +83,3 @@ Successfully removed the following roles from autorole:
[S_AUTOROLE_LIST] [S_AUTOROLE_LIST]
The following roles are added to users upon join. The following roles are added to users upon join.
{list} {list}
//User Settings

View File

@ -0,0 +1,3 @@
{
}

View File

@ -1,3 +1,4 @@
module.exports = { module.exports = {
DefaultGuild: require('./defaultGuild.json') DefaultGuild: require('./defaultGuild.json'),
DefaultUser: require('./defaultUser.json')
}; };

View File

@ -1,7 +1,7 @@
{ {
"success": "<:success:723595130808041512>", "success": "<:success:723595130808041512>",
"failure": "<:failure:723595130912637018>", "failure": "<:failure:723595130912637018>",
"loading": "<a:loading:723589386356129832>", "loading": "<:loading:744489577024192582>",
"warning": "⚠️", "warning": "⚠️",
"enabled": "<:enabled:723589993733423215>", "enabled": "<:enabled:723589993733423215>",
"disabled": "<:disabled:723589993506799618>", "disabled": "<:disabled:723589993506799618>",
@ -19,7 +19,7 @@
"region": "🌐", "region": "🌐",
"calendar": "📆", "calendar": "📆",
"pin": "📌", "pin": "📌",
"note": "📝", "note": "<:note:744490065354293258>",
"trash": "🗑️", "trash": "🗑️",
"news-channel": "<:news:741725913171099810>", "news-channel": "<:news:741725913171099810>",
"id": "🆔", "id": "🆔",

2671
yarn.lock

File diff suppressed because it is too large Load Diff