.setDescription("Gives you moral support, decides if you really do want that third taco, or helps you decide on your existential crisis. Answers come with an accuracy guarantee of 0%!")
.setDescription("Gives you moral support, decides if you really do want that third taco, or helps you decide on your existential crisis. Answers come with an accuracy guarantee of 0%!")
.addField("Syntax","`8ball <question>`"),
.addField("Syntax","`8ball <question>`"),
meta:{
category:'Fun',
description:"Gives you moral support, decides if you really do want that third taco, or helps you decide on your existential crisis. Answers come with an accuracy guarantee of 0%!",
.setDescription("Set your status within the bot as AFK and specify a reason. Then, when other people ping you, I can let them know that you're not available!")
.setDescription("Set your status within the bot as AFK and specify a reason. Then, when other people ping you, I can let them know that you're not available!")
.addField("Syntax","`afk [clearMode] <reason>`")
.addField("Syntax","`afk [clearMode] <reason>`")
.addField("Notice","Your status clear mode can be set to either 'auto' or 'manual'. If not specified, it will clear next time you send a message (auto)."),
.addField("Notice","Your status clear mode can be set to either 'auto' or 'manual'. If not specified, it will clear next time you send a message (auto)."),
meta:{
category:'Social',
description:"Tell others that you're AFK so that they'll be notified when you ping them.",
if(['a','add','e','edit','delete','d'].includes(args[0].toLowerCase())&&(!tg||!tg.staffrole||!tg.staffrole.length||(message.member.roles.cache.has(tg.staffrole)&&message.member.permissions.has("ADMINISTRATOR")))){returnmessage.channel.send("You must have the staff role or be an administrator in this server in order to edit AR settings.");}
if(['a','add','e','edit','delete','d'].includes(args[0].toLowerCase())&&((!tg||!tg.staffrole||!tg.staffrole.length||!message.member.roles.cache.has(tg.staffrole))&&!message.member.permissions.has("ADMINISTRATOR"))){returnmessage.channel.send("You must have the staff role or be an administrator in this server in order to edit AR settings.");}
functionviewARs(tar){
lett=tar.triggers;
letar=tar.ars;
lets='';
for(leti=0;i<t.length;i++){s+=``;}
}
if(['a','add'].includes(args[0].toLowerCase())){
if(['a','add'].includes(args[0].toLowerCase())){
lettrigger=awaitask(message,"What would you like the trigger to be? This is the message that will make your AR work.",120000);if(!trigger){returnnull;}
lettrigger=awaitask(message,"What would you like the trigger to be? This is the message that will make your AR work.",120000);if(!trigger){returnnull;}
@ -36,8 +40,26 @@ module.exports = {
if(`${response}`.length>300){returnmessage.channel.send("Your response needs to be less than 300 characters, please!");}
if(`${response}`.length>300){returnmessage.channel.send("Your response needs to be less than 300 characters, please!");}
if(tar.triggers.length===20){returnmessage.channel.send("Because of data storage concerns, your ARs are capped at 20 per server. You can join the official support server and talk to the devs if you have a legitimate reason for raising this limit and they can see about raising it for you!");}
if(!user){returnmessage.channel.send("You must mention a user to ban, or provide their ID.");}
if(user.roles.highest.position>=message.member.roles.highest.position){returnmessage.channel.send("You don't have permissions to ban that member as they are above you in the roles list.");}
if(user.roles.highest.position>=message.guild.me.roles.highest.position){returnmessage.channel.send("I can't ban that member as their highest role is above mine! (Or the same as mine, too)");}
if(!user.bannable){returnmessage.channel.send("Hmm, it seems like I can't ban that member. This is probably a permissions issue. Or maybe they were already banned?");}
if(isNaN(Number(options.days))||Number(options.days)<0||Number(options.days)>7||options.days.includes('.')){returnmessage.channel.send("The `days` option must be a whole number between 0 and 7.");}
days=Number(options.days);
}
if(options.notes&&options.notes.length>250){returnmessage.channel.send("I mean I get it, they pissed you off, but do you really need to give me that much info on why you're banning them? I can't keep track of all that!");}
if(reason&&reason.length>250){returnmessage.channel.send("I mean I get it, they pissed you off, but do you really need to give me that much info on why you're banning them? I can't keep track of all that!");}
.setDescription("Set your status within the bot as DnD and specify a reason. Then, when other people ping you, I can let them know that you don't want to be disturbed!")
.setDescription("Set your status within the bot as DnD and specify a reason. Then, when other people ping you, I can let them know that you don't want to be disturbed!")
.addField("Syntax","`dnd [clearMode] <reason>`")
.addField("Syntax","`dnd [clearMode] <reason>`")
.addField("Notice","Your status clear mode can be set to either 'auto' or 'manual'. If not specified, it will clear when you use `n?clearstatus`."),
.addField("Notice","Your status clear mode can be set to either 'auto' or 'manual'. If not specified, it will clear when you use `n?clearstatus`."),
meta:{
category:'Social',
description:"Tell others not to disturb you so that they'll know not to ping you.",
if(!client.developers.includes(message.author.id)){returnmessage.channel.send("Sorry, but I've got trust issues, so only me devs can go commanding me around like that.");};
if(!client.developers.includes(message.author.id)){returnmessage.channel.send("Sorry, but I've got trust issues, so only me devs can go commanding me around like that.");};
returnmessage.channel.send("Heya! My help command is currently under construction since my devs are hard at work on my commands and they haven't released me to the full public yet! Consider yourself lucky...");
letcurrentEmbed=newDiscord.MessageEmbed().setAuthor("Help Menu",message.author.avatarURL()).setTitle(category).setDescription("React to control the menu! You can also specify a command name when doing the help command to get more info about it.").setColor("c375f0");
currentEmbed=newDiscord.MessageEmbed().setAuthor("Help Menu",message.author.avatarURL()).setTitle(category).setDescription("React to control the menu! You can also specify a command name when doing the help command to get more info about it.").setColor("c375f0");
}
}
if(current>1){categorySorted.push(currentEmbed);}
helpSorted[category]=categorySorted;
}
letcat=awaitask(message,"What would you like help with? (`Fun`|`Roleplay`|`Utility`|`Misc`|`Moderation`|`Social`) or `all` if you'd like to browse all commands",60000);if(!cat){return;}
if(!['f','fun','rp','roleplay','dnd','role play','rpg','dice','u','util','utility','utilities','m','misc','miscellaneous','mod','moderation','s','social','a','all'].includes(`${cat}`.trim().toLowerCase())){returnmessage.channel.send("That wasn't a valid response! Try again?");}
if(!user){returnmessage.channel.send("You must mention a user to kick, or provide their ID.");}
if(user.roles.highest.position>=message.member.roles.highest.position){returnmessage.channel.send("You don't have permissions to kick that member as they are above you in the roles list.");}
if(user.roles.highest.position>=message.guild.me.roles.highest.position){returnmessage.channel.send("I can't kick that member as their highest role is above mine! (Or the same as mine, too)");}
if(!user.kickable){returnmessage.channel.send("For some reason, I can't kick that user!");}
//if (options.notes && options.notes.length > 250) {return message.channel.send("Hey, listen, let's not write an essay on why you're kicking that member!");}
.addField("Notice","You must be a staff or admin in your server to edit these settings.")
.addField("Notice","You must be a staff or admin in your server to edit these settings.")
.addField("Responses","Your leave message should be generated through a response using my `response` command, and then bound to the leave message by providing your response's name."),
.addField("Responses","Your leave message should be generated through a response using my `response` command, and then bound to the leave message by providing your response's name."),
meta:{
category:'Moderation',
description:"Set the channel and message to be sent when a user leaves the server.",
syntax:'`leave <set|clear|view|test>`',
extra:"You must use the `response` command to create a response. The response's name is what will be given in this command."
.setDescription("Configure your server's log settings.\n\nLogs will update you on events in your server that have the potential to require moderator intervention, like someone deleting a hateful message before you can see it or a misbehaving moderator kicking/banning a member when they aren't supposed to.")
.setDescription("Configure your server's log settings.\n\nLogs will update you on events in your server that have the potential to require moderator intervention, like someone deleting a hateful message before you can see it or a misbehaving moderator kicking/banning a member when they aren't supposed to.")
extra:"**Please note** that this command is still in the works, and that not all log types are available. The currently existing ones have been thoroughly tested, though."
.setDescription("Reloads the system extensions by refreshing all command and event files into client without terminating the node process. *Hi I'm Wubzy and this makes no sense to anyone but discord.js devs because we're nerds*")
.setDescription("Reloads the system extensions by refreshing all command and event files into client without terminating the node process. *Hi I'm Wubzy and this makes no sense to anyone but discord.js devs because we're nerds*")
.addField("Syntax","`refresh [log]`. Adding 'log' will log to the console as though the bot were in startup.")
.addField("Syntax","`refresh [log]`. Adding 'log' will log to the console as though the bot were in startup.")
.addField("Notice","This command is only available to Natsuki developers."),
.addField("Notice","This command is only available to Natsuki developers."),
meta:{
category:'Developer',
description:"Refresh all client commands and events and clear most of the require cache. Only two people can use this command and they're probably not you.",
.setDescription("Configure your server's saved responses. These are reusable and editable, and can be placed in things like welcome messages and used for announcements.")
.setDescription("Configure your server's saved responses. These are reusable and editable, and can be placed in things like welcome messages and used for announcements.")
if(!tg&&!['q','quick'].includes(args[0].toLowerCase())&&(tg.staffrole.length&&!message.member.roles.cache.has(tg.staffrole))&&message.member.permissions.has("ADMINISTRATOR")){returnmessage.reply("you need to be staff or admin in this server in order to edit those settings.");}
if(!['q','quick'].includes(args[0].toLowerCase())&&((tg&&tg.staffrole.length&&!message.member.roles.cache.has(tg.staffrole)))&&!message.member.permissions.has("ADMINISTRATOR")){returnmessage.reply("you need to be staff or admin in this server in order to edit those settings.");}
.setDescription("Create a secret santa for all of your friends or for your server! Whether you celebrate the holidays or not, this can still be loads of fun!")
.setDescription("Create a secret santa for all of your friends or for your server! Whether you celebrate the holidays or not, this can still be loads of fun!")
extra:"It's not Christmas anymore, but you know what, who cares. Some features of this command, such as `end` and `kick` are not available/not working."
if(client.misc.activeDMs.has(message.author.id)){returnmessage.reply("I'm already asking you questions in DM for a separate command! Finish that command before using this one.");}
if(client.misc.activeDMs.has(message.author.id)){returnmessage.reply("I'm already asking you questions in DM for a separate command! Finish that command before using this one.");}
help:"Set your server's staff role, which allows users with that role to modify my settings in this server. You must be an admin in the server to change this setting.",
help:"Set your server's staff role, which allows users with that role to modify my settings in this server. You must be an admin in the server to change this setting.",
meta:{
category:'Moderation',
description:"Set the role that can edit my settings for the server",
.setDescription("Setup and view information on this server's starboard! This allows messages to be sent to a dedicated channel when they receive a set number of star messages.")
.setDescription("Setup and view information on this server's starboard! This allows messages to be sent to a dedicated channel when they receive a set number of star messages.")
.setDescription("Toggle a server as VIP. This grants a few small bonuses to your server that you can't get anywhere else!\n\nWant to become a VIP? Support the bot by [joining the support server](), donating to the bot's creators, or promoting/spreading the bot to other servers.")
.setDescription("Toggle a server as VIP. This grants a few small bonuses to your server that you can't get anywhere else!\n\nWant to become a VIP? Support the bot by [joining the support server](), donating to the bot's creators, or promoting/spreading the bot to other servers.")
.addField("Syntax","`vip <add|remove|check>`")
.addField("Syntax","`vip <add|remove|check>`")
.addField("Notice","This command is **developer-only**."),
.addField("Notice","This command is **developer-only**."),
meta:{
category:'Developer',
description:"Set server VIP status",
syntax:'`vip <add|remove|check>`',
extra:"This command is mostly cosmetic as there are no real perks *yet*"
.setDescription("Warn misbehaving members that what they are doing is wrong, and have it stored in a database in order to see a list of all their past warnings")
.addField("Notice","You must be a server administrator in order to use this command."),
.addField("Notice","You must be a server administrator in order to use this command."),
meta:{
category:'Moderation',
description:"Warn misbehaving members that what they are doing is wrong, and have it stored in a database in order to see a list of all their past warnings",
.addField("Notice","You must be a staff or admin in your server to edit these settings.")
.addField("Notice","You must be a staff or admin in your server to edit these settings.")
.addField("Responses","Your welcome message should be generated through a response using my `response` command, and then bound to the welcome message by providing your response's name."),
.addField("Responses","Your welcome message should be generated through a response using my `response` command, and then bound to the welcome message by providing your response's name."),
meta:{
category:'Moderation',
description:"Set the channel and message to be sent when a user joins the server.",
syntax:'`welcome <set|clear|view|test>`',
extra:"You'll need to use `response` to configure the message that you want sent with this command. The name you give the response is what you'll give to this command"
if((!tg.staffrole.length||!message.member.roles.cache.has(tg.staffrole))&&!message.member.permissions.has("ADMINISTRATOR")){returnmessage.reply("You can't do that without staff or admin permissions, silly!");}
if((!tg||!tg.staffrole.length||!message.member.roles.cache.has(tg.staffrole))&&!message.member.permissions.has("ADMINISTRATOR")){returnmessage.reply("You can't do that without staff or admin permissions, silly!");}
if(['s','set'].includes(args[0].toLowerCase())){
if(['s','set'].includes(args[0].toLowerCase())){
if(!args[1]){returnmessage.reply("You need to specify a channel for your welcome messages to be sent in!");}
if(!args[1]){returnmessage.reply("You need to specify a channel for your welcome messages to be sent in!");}
message.reply('Hey there! You asked me to clear your status when you send a message next, so I went ahead and did that for you.').then(m=>{m.delete({timeout:5000});});
returnmessage.reply(`That user ${tu.statustype==='dnd'?'wishes not to be disturbed':'is AFK'}. Reason: \`${tu.statusmsg}\`. (This status was set ${moment(tu.statussetat.getTime()).fromNow()})`);
letm=awaitmessage.channel.send(`That user ${tu.statustype==='dnd'?'wishes not to be disturbed':'is AFK'}. Reason: ${tu.statusmsg}.${tu.statssetat?`\`(This status was set ${moment(tu.statussetat.getTime()).fromNow()})\``:''}`);