mirror of https://github.com/kry008/Bot-2.0.git
first commit
commit
74ca98e6dc
|
@ -0,0 +1,3 @@
|
|||
config.json
|
||||
node_modules
|
||||
package-lock.json
|
|
@ -0,0 +1,121 @@
|
|||
module.exports = {
|
||||
name: 'argumentstest',
|
||||
description: 'Test command for args',
|
||||
help: 'This command is used to test the arguments of a command',
|
||||
arguments: [
|
||||
{
|
||||
name: 'ANY',
|
||||
type: 'ANY',
|
||||
description: 'Any type of argument',
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'type3',
|
||||
type: 3,
|
||||
description: 'STRING',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type4',
|
||||
type: 4,
|
||||
description: 'INTEGER',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type5',
|
||||
type: 5,
|
||||
description: 'BOOLEAN',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type6',
|
||||
type: 6,
|
||||
description: 'USER',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type7',
|
||||
type: 7,
|
||||
description: 'CHANNEL',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type8',
|
||||
type: 8,
|
||||
description: 'ROLE',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type9',
|
||||
type: 9,
|
||||
description: 'MENTIONABLE',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type10',
|
||||
type: 10,
|
||||
description: 'NUMBER',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'type11',
|
||||
type: 11,
|
||||
description: 'ATTACHMENT',
|
||||
required: false
|
||||
},
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute(message, args) {
|
||||
message.channel.send('Arguments test command executed');
|
||||
var txt = '';
|
||||
if(args) {
|
||||
for (var key in args) {
|
||||
txt += key + ': ' + args[key] + '\n';
|
||||
}
|
||||
}
|
||||
message.channel.send(txt);
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
var stringToReturn = 'Arguments test command executed\n';
|
||||
//get which type of argument was passed, and return the value
|
||||
if(interaction.options.getString('type3')) {
|
||||
stringToReturn += 'type3: ' + interaction.options.getString('type3') + '\n';
|
||||
}
|
||||
if(interaction.options.getInteger('type4')) {
|
||||
stringToReturn += 'type4: ' + interaction.options.getInteger('type4') + '\n';
|
||||
}
|
||||
if(interaction.options.getBoolean('type5')) {
|
||||
stringToReturn += 'type5: ' + interaction.options.getBoolean('type5') + '\n';
|
||||
}
|
||||
if(interaction.options.getUser('type6')) {
|
||||
stringToReturn += 'type6: ' + interaction.options.getUser('type6').username + '\n';
|
||||
}
|
||||
if(interaction.options.getChannel('type7')) {
|
||||
stringToReturn += 'type7: ' + interaction.options.getChannel('type7').name + '\n';
|
||||
}
|
||||
if(interaction.options.getRole('type8')) {
|
||||
stringToReturn += 'type8: ' + interaction.options.getRole('type8').name + '\n';
|
||||
}
|
||||
if(interaction.options.getMentionable('type9')) {
|
||||
stringToReturn += 'type9: ' + interaction.options.getMentionable('type9').name + '\n';
|
||||
}
|
||||
if(interaction.options.getNumber('type10')) {
|
||||
stringToReturn += 'type10: ' + interaction.options.getNumber('type10') + '\n';
|
||||
}
|
||||
if(interaction.options.getMessage('type11')) {
|
||||
stringToReturn += 'type11: ' + interaction.options.getMessage('type11').content + '\n';
|
||||
}
|
||||
|
||||
interaction.reply(stringToReturn);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,65 @@
|
|||
module.exports = {
|
||||
name: 'ban',
|
||||
description: 'Bans a user from the server',
|
||||
help: 'This command is used to ban a user from the server. Requires the user to have the "Ban Members" permission. Requires the bot to have the "Ban Members" permission.',
|
||||
arguments: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 'USER',
|
||||
description: 'The user to ban',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 6,
|
||||
description: 'The user to ban',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'reason',
|
||||
type: 3,
|
||||
description: 'The reason for the ban',
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: true,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: false,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE'],
|
||||
integration_types: [0],
|
||||
execute: async (message, args) => {
|
||||
const user = message.mentions.users.first();
|
||||
if (!user) {
|
||||
return message.reply('You need to mention a user to ban');
|
||||
}
|
||||
const member = message.guild.members.cache.get(user.id);
|
||||
if (!member) {
|
||||
return message.reply('That user is not in this server');
|
||||
}
|
||||
if (!member.bannable) {
|
||||
return message.reply('I cannot ban that user');
|
||||
}
|
||||
const reason = args.slice(1).join(' ') || 'No reason provided';
|
||||
await member.ban({ reason });
|
||||
message.reply(`${user.tag} has been banned`);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const user = interaction.options.getUser('user');
|
||||
const member = interaction.guild.members.cache.get(user.id);
|
||||
if (!member) {
|
||||
return interaction.reply('That user is not in this server');
|
||||
}
|
||||
if (!member.bannable) {
|
||||
return interaction.reply('I cannot ban that user');
|
||||
}
|
||||
const reason = interaction.options.getString('reason') || 'No reason provided';
|
||||
await member.ban({ reason });
|
||||
interaction.reply(`${user.tag} has been banned`);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
function returnCat() {
|
||||
return fetch('https://api.thecatapi.com/v1/images/search')
|
||||
.then(response => response.json())
|
||||
.then(data => data[0].url);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'cat',
|
||||
description: 'Get a random cat picture',
|
||||
help: 'Get a random cat picture',
|
||||
arguments: [],
|
||||
options: [],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute: async (message, args) => {
|
||||
const cat = await returnCat();
|
||||
message.channel.send(cat);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const cat = await returnCat();
|
||||
interaction.reply(cat);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
//https://cat-fact.herokuapp.com/facts/random
|
||||
function returnCatFact() {
|
||||
return fetch('https://cat-fact.herokuapp.com/facts/random')
|
||||
.then(response => response.json())
|
||||
.then(data => data[0].text);
|
||||
}
|
||||
module.exports = {
|
||||
name: 'catfact',
|
||||
description: 'Get a random cat fact',
|
||||
help: 'Get a random cat fact',
|
||||
arguments: [],
|
||||
options: [],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute: async (message, args) => {
|
||||
const catFact = await returnCatFact();
|
||||
message.channel.send(catFact);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const catFact = await returnCatFact();
|
||||
interaction.reply(catFact);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
//https://api.chucknorris.io/jokes/random
|
||||
function randomChuck() {
|
||||
return fetch('https://api.chucknorris.io/jokes/random')
|
||||
.then(response => response.json())
|
||||
.then(data => data.value);
|
||||
}
|
||||
module.exports = {
|
||||
name: 'chuck',
|
||||
description: 'Get a random Chuck Norris joke',
|
||||
help: 'Get a random Chuck Norris joke',
|
||||
arguments: [],
|
||||
options: [],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute: async (message, args) => {
|
||||
const chuck = await randomChuck();
|
||||
message.channel.send(chuck);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const chuck = await randomChuck();
|
||||
interaction.reply(chuck);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,143 @@
|
|||
// This command converts a RGB color to HEX, HSL, and CMYK
|
||||
function rgbToHex(r, g, b) {
|
||||
const red = r.toString(16).padStart(2, '0');
|
||||
const green = g.toString(16).padStart(2, '0');
|
||||
const blue = b.toString(16).padStart(2, '0');
|
||||
return `#${red}${green}${blue}`;
|
||||
}
|
||||
|
||||
function rgbToHsl(r, g, b) {
|
||||
const red = r / 255;
|
||||
const green = g / 255;
|
||||
const blue = b / 255;
|
||||
const max = Math.max(red, green, blue);
|
||||
const min = Math.min(red, green, blue);
|
||||
const lightness = (max + min) / 2;
|
||||
if (max === min) {
|
||||
return { h: 0, s: 0, l: lightness };
|
||||
}
|
||||
const d = max - min;
|
||||
const saturation = lightness > 0.5 ? d / (2 - max - min) : d / (max + min);
|
||||
let hue;
|
||||
switch (max) {
|
||||
case red:
|
||||
hue = (green - blue) / d + (green < blue ? 6 : 0);
|
||||
break;
|
||||
case green:
|
||||
hue = (blue - red) / d + 2;
|
||||
break;
|
||||
case blue:
|
||||
hue = (red - green) / d + 4;
|
||||
break;
|
||||
}
|
||||
hue /= 6;
|
||||
return { h: hue, s: saturation, l: lightness };
|
||||
}
|
||||
|
||||
function rgbToCmyk(r, g, b) {
|
||||
const red = r / 255;
|
||||
const green = g / 255;
|
||||
const blue = b / 255;
|
||||
const black = 1 - Math.max(red, green, blue);
|
||||
const cyan = (1 - red - black) / (1 - black);
|
||||
const magenta = (1 - green - black) / (1 - black);
|
||||
const yellow = (1 - blue - black) / (1 - black);
|
||||
return { c: cyan, m: magenta, y: yellow, k: black };
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'colorrgb',
|
||||
description: 'converts a RGB color to HEX, HSL, and CMYK',
|
||||
help: 'This command converts a RGB color to HEX, HSL, and CMYK',
|
||||
arguments: [
|
||||
{
|
||||
name: 'r',
|
||||
type: 'INTEGER',
|
||||
description: 'The red value (0-255)',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'g',
|
||||
type: 'INTEGER',
|
||||
description: 'The green value (0-255)',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'b',
|
||||
type: 'INTEGER',
|
||||
description: 'The blue value (0-255)',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
options: [
|
||||
{
|
||||
name: 'r',
|
||||
type: 4, // Integer type
|
||||
description: 'The red value (0-255)',
|
||||
required: true
|
||||
},
|
||||
{
|
||||
name: 'g',
|
||||
type: 4, // Integer type
|
||||
description: 'The green value (0-255)',
|
||||
required: true
|
||||
},
|
||||
{
|
||||
name: 'b',
|
||||
type: 4, // Integer type
|
||||
description: 'The blue value (0-255)',
|
||||
required: true
|
||||
}
|
||||
],
|
||||
execute(message, args) {
|
||||
//check if the user provided the 3 values 0-255
|
||||
if (args.length !== 3) {
|
||||
message.channel.send('You need to provide 3 values (0-255).');
|
||||
return;
|
||||
}
|
||||
//check if the values are integers
|
||||
const r = parseInt(args[0]);
|
||||
const g = parseInt(args[1]);
|
||||
const b = parseInt(args[2]);
|
||||
if (isNaN(r) || isNaN(g) || isNaN(b)) {
|
||||
message.channel.send('The values must be integers.');
|
||||
return;
|
||||
}
|
||||
//check if the values are between 0 and 255
|
||||
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
|
||||
message.channel.send('The values must be between 0 and 255.');
|
||||
return;
|
||||
}
|
||||
//convert the RGB values to HEX
|
||||
const hex = rgbToHex(r, g, b);
|
||||
message.channel.send(`HEX: ${hex}`);
|
||||
const hsl = rgbToHsl(r, g, b);
|
||||
message.channel.send(`HSL: ${hsl.h.toFixed(2)}, ${hsl.s.toFixed(2)}, ${hsl.l.toFixed(2)}`);
|
||||
const cmyk = rgbToCmyk(r, g, b);
|
||||
message.channel.send(`CMYK: ${cmyk.c.toFixed(2)}, ${cmyk.m.toFixed(2)}, ${cmyk.y.toFixed(2)}, ${cmyk.k.toFixed(2)}`);
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
const r = interaction.options.getInteger('r');
|
||||
const g = interaction.options.getInteger('g');
|
||||
const b = interaction.options.getInteger('b');
|
||||
//check if the values are between 0 and 255
|
||||
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
|
||||
interaction.reply('The values must be between 0 and 255.');
|
||||
return;
|
||||
}
|
||||
//convert the RGB values to HEX
|
||||
const hex = rgbToHex(r, g, b);
|
||||
const hsl = rgbToHsl(r, g, b);
|
||||
const cmyk = rgbToCmyk(r, g, b);
|
||||
interaction.reply(`HEX: ${hex}\nHSL: ${hsl.h.toFixed(2)}, ${hsl.s.toFixed(2)}, ${hsl.l.toFixed(2)}\nCMYK: ${cmyk.c.toFixed(2)}, ${cmyk.m.toFixed(2)}, ${cmyk.y.toFixed(2)}, ${cmyk.k.toFixed(2)}`);
|
||||
}
|
||||
};
|
|
@ -0,0 +1,80 @@
|
|||
const dns = require('dns');
|
||||
|
||||
module.exports = {
|
||||
name: 'dns',
|
||||
description: 'Look what is the IP of a domain. Requires a domain as argument.',
|
||||
help: 'Look what is the IP of a domain. Requires a domain as argument.',
|
||||
arguments: [
|
||||
{
|
||||
name: 'domain',
|
||||
type: 'STRING',
|
||||
description: 'The domain to look up',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'domain',
|
||||
type: 3, // String type
|
||||
description: 'The domain to look up',
|
||||
required: true
|
||||
}
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
premium: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute(message, args) {
|
||||
const domain = args[0];
|
||||
if (!domain) {
|
||||
message.channel.send('You need to provide a domain.');
|
||||
return;
|
||||
}
|
||||
var ipv4 = '';
|
||||
var ipv6 = '';
|
||||
dns.lookup(domain, { family: 4 }, (err, addresses) => {
|
||||
if (err) {
|
||||
ipv4 = 'Error: not found';
|
||||
} else {
|
||||
ipv4 = 'IP: ' + addresses;
|
||||
}
|
||||
dns.lookup(domain, { family: 6 }, (err, addresses) => {
|
||||
if (err) {
|
||||
ipv6 = 'Error: not found';
|
||||
} else {
|
||||
ipv6 = 'IP: ' + addresses;
|
||||
}
|
||||
message.channel.send('IPv4: ' + ipv4 + '\nIPv6: ' + ipv6);
|
||||
});
|
||||
})
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
const domain = interaction.options.getString('domain');
|
||||
if (!domain) {
|
||||
interaction.reply('You need to provide a domain.');
|
||||
return;
|
||||
}
|
||||
var ipv4 = '';
|
||||
var ipv6 = '';
|
||||
dns.lookup(domain, { family: 4 }, (err, addresses) => {
|
||||
if (err) {
|
||||
ipv4 = 'Error: not found';
|
||||
} else {
|
||||
ipv4 = 'IP: ' + addresses;
|
||||
}
|
||||
dns.lookup(domain, { family: 6 }, (err, addresses) => {
|
||||
if (err) {
|
||||
ipv6 = 'Error: not found';
|
||||
} else {
|
||||
ipv6 = 'IP: ' + addresses;
|
||||
}
|
||||
interaction.reply('IPv4: ' + ipv4 + '\nIPv6: ' + ipv6);
|
||||
});
|
||||
})
|
||||
},
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
function returnDog() {
|
||||
return fetch('https://dog.ceo/api/breeds/image/random')
|
||||
.then(response => response.json())
|
||||
.then(data => data.message);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'dog',
|
||||
description: 'Get a random dog picture',
|
||||
help: 'Get a random dog picture',
|
||||
arguments: [],
|
||||
options: [],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute: async (message, args) => {
|
||||
const dog = await returnDog();
|
||||
message.channel.send(dog);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const dog = await returnDog();
|
||||
interaction.reply(dog);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
function returnCat() {
|
||||
return fetch('https://randomfox.ca/floof/')
|
||||
.then(response => response.json())
|
||||
.then(data => data.image);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'fox',
|
||||
description: 'Get a random fox picture',
|
||||
help: 'Get a random fox picture',
|
||||
arguments: [],
|
||||
options: [],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute: async (message, args) => {
|
||||
const cat = await returnCat();
|
||||
message.channel.send(cat);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const cat = await returnCat();
|
||||
interaction.reply(cat);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,53 @@
|
|||
function getRandomIntInclusive(min, max) {
|
||||
min = Math.ceil(min);
|
||||
max = Math.floor(max);
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'guessnumber',
|
||||
description: 'Guess a number between 1 and 100',
|
||||
help: 'Guess a number between 1 and 100',
|
||||
arguments: [
|
||||
{
|
||||
name: 'number',
|
||||
type: 'INTEGER',
|
||||
description: 'Your guess',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'number',
|
||||
type: 4,
|
||||
description: 'Your guess',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute(message, args) {
|
||||
const guess = parseInt(args[0]);
|
||||
const number = getRandomIntInclusive(1, 100);
|
||||
if (guess === number) {
|
||||
message.reply('You guessed the number!');
|
||||
} else {
|
||||
message.reply(`The number was ${number}`);
|
||||
}
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
const guess = interaction.options.getInteger('number');
|
||||
const number = getRandomIntInclusive(1, 100);
|
||||
if (guess === number) {
|
||||
interaction.reply('You guessed the number!');
|
||||
} else {
|
||||
interaction.reply(`The number was ${number}`);
|
||||
}
|
||||
},
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
//optiona name of the command
|
|
@ -0,0 +1,71 @@
|
|||
module.exports = {
|
||||
name: 'kick',
|
||||
description: 'Kicks a user from the server',
|
||||
help: 'Kicks a user from the server with a reason if provided. Requires the user to have the "Kick Members" permission. Requires the bot to have the "Kick Members" permission.',
|
||||
arguments: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 'USER',
|
||||
description: 'The user to kick',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'reason',
|
||||
type: 'STRING',
|
||||
description: 'The reason for the kick',
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 6,
|
||||
description: 'The user to kick',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'reason',
|
||||
type: 3,
|
||||
description: 'The reason for the kick',
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: true,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: false,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE'],
|
||||
integration_types: [0],
|
||||
execute: async (message, args) => {
|
||||
const user = message.mentions.users.first();
|
||||
if (!user) {
|
||||
return message.reply('You need to mention a user to kick');
|
||||
}
|
||||
const member = message.guild.members.cache.get(user.id);
|
||||
if (!member) {
|
||||
return message.reply('That user is not in this server');
|
||||
}
|
||||
if (!member.kickable) {
|
||||
return message.reply('I cannot kick that user');
|
||||
}
|
||||
const reason = args.slice(1).join(' ') || 'No reason provided';
|
||||
await member.kick(reason);
|
||||
message.reply(`${user.tag} has been kicked`);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const user = interaction.options.getUser('user');
|
||||
const member = interaction.guild.members.cache.get(user.id);
|
||||
if (!member) {
|
||||
return interaction.reply('That user is not in this server');
|
||||
}
|
||||
if (!member.kickable) {
|
||||
return interaction.reply('I cannot kick that user');
|
||||
}
|
||||
const reason = interaction.options.getString('reason') || 'No reason provided';
|
||||
await member.kick(reason);
|
||||
interaction.reply(`${user.tag} has been kicked`);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,21 @@
|
|||
module.exports = {
|
||||
name: 'ping',
|
||||
description: 'Ping!',
|
||||
help: 'Ping!',
|
||||
arguments: [],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
premium: false,
|
||||
canBeUsedInDm: true,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute(message, args) {
|
||||
message.channel.send('Pong!');
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
interaction.reply('Pong.');
|
||||
},
|
||||
};
|
|
@ -0,0 +1,145 @@
|
|||
const fs = require('fs');
|
||||
//read files databases/pokemon_games.json and databases/pokemon.json
|
||||
const pokemon_games = JSON.parse(fs.readFileSync('databases/pokemon_games.json'));
|
||||
const pokemon = JSON.parse(fs.readFileSync('databases/pokemon.json'));
|
||||
|
||||
/*pokemon.json
|
||||
[
|
||||
{
|
||||
"number": 1,
|
||||
"name": "Bulbasaur",
|
||||
"img": "https://en.wikipedia.org/wiki/Bulbasaur#/media/File:Pok%C3%A9mon_Bulbasaur_art.png",
|
||||
"type": [
|
||||
"Grass",
|
||||
"Poison"
|
||||
],
|
||||
"height": "0.7 m",
|
||||
"weight": "6.9 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Bulbasaur is the first Pokémon in the National Pokédex.",
|
||||
"Bulbasaur is the only dual-type Pokémon in the National Pokédex that is both Poison and Grass type.",
|
||||
"Bulbasaur is the only Pokémon that can learn Frenzy Plant, Blast Burn, and Hydro Cannon."
|
||||
]
|
||||
},
|
||||
pokemon_games.json
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Pokémon Red and Blue",
|
||||
"year": 1996
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
function randomPokemon() {
|
||||
//connect data from pokemon.json and pokemon_games.json
|
||||
const randomPokemon = pokemon[Math.floor(Math.random() * pokemon.length)];
|
||||
//find game id in pokemon_games.json
|
||||
const game = pokemon_games.find(game => game.id === randomPokemon.first_appeared);
|
||||
//get numbers of facts and get random fact
|
||||
const fact = randomPokemon.some_facts[Math.floor(Math.random() * randomPokemon.some_facts.length)];
|
||||
//get types of pokemon
|
||||
const types = randomPokemon.type.join(', ');
|
||||
return `**${randomPokemon.name}**\nTypes: ${types}\nHeight: ${randomPokemon.height}\nWeight: ${randomPokemon.weight}\nFirst appeared in: ${game.name} (${game.year})\n${fact}\n${randomPokemon.img}`;
|
||||
}
|
||||
|
||||
function pokemonNumber(number) {
|
||||
const pokemonNumber = pokemon.find(pokemon => pokemon.number === number);
|
||||
if (!pokemonNumber) {
|
||||
return 'Pokemon not found **FUNCTION NOT FINISHED**';
|
||||
}
|
||||
const game = pokemon_games.find(game => game.id === pokemonNumber.first_appeared);
|
||||
const fact = pokemonNumber.some_facts[Math.floor(Math.random() * pokemonNumber.some_facts.length)];
|
||||
const types = pokemonNumber.type.join(', ');
|
||||
return `**${pokemonNumber.name}**\nTypes: ${types}\nHeight: ${pokemonNumber.height}\nWeight: ${pokemonNumber.weight}\nFirst appeared in: ${game.name} (${game.year})\n${fact}`;
|
||||
}
|
||||
|
||||
function pokemonName(name) {
|
||||
const pokemonName = pokemon.find(pokemon => pokemon.name.toLowerCase() === name.toLowerCase());
|
||||
if (!pokemonName) {
|
||||
return 'Pokemon not found **FUNCTION NOT FINISHED**';
|
||||
}
|
||||
const game = pokemon_games.find(game => game.id === pokemonName.first_appeared);
|
||||
const fact = pokemonName.some_facts[Math.floor(Math.random() * pokemonName.some_facts.length)];
|
||||
const types = pokemonName.type.join(', ');
|
||||
return `**${pokemonName.name}**\nTypes: ${types}\nHeight: ${pokemonName.height}\nWeight: ${pokemonName.weight}\nFirst appeared in: ${game.name} (${game.year})\n${fact}`;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'pokemon',
|
||||
description: 'Get a random pokemon. **FUNCTION NOT FINISHED**',
|
||||
help: 'Get a random pokemon. **FUNCTION NOT FINISHED**',
|
||||
arguments: [
|
||||
{
|
||||
name: 'pokemonname',
|
||||
type: 'STRING',
|
||||
description: 'Name of the pokemon you want to get information about',
|
||||
required: false,
|
||||
},
|
||||
{
|
||||
name: 'pokemonnumber',
|
||||
type: 'INTEGER',
|
||||
description: 'Number of the pokemon you want to get information about',
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'pokemonname',
|
||||
type: 3, // String type
|
||||
description: 'Name of the pokemon you want to get information about',
|
||||
required: false
|
||||
},
|
||||
{
|
||||
name: 'pokemonnumber',
|
||||
type: 4, // Integer type
|
||||
description: 'Number of the pokemon you want to get information about',
|
||||
required: false
|
||||
}
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
premium: false,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute: async (message, args) => {
|
||||
if(args.length === 0) {
|
||||
const pokemon = randomPokemon();
|
||||
message.channel.send(pokemon);
|
||||
return;
|
||||
}
|
||||
//check if it is a number
|
||||
if(!isNaN(args[0])) {
|
||||
const pokemon = pokemonNumber(parseInt(args[0]));
|
||||
message.channel.send(pokemon);
|
||||
return;
|
||||
}
|
||||
//check if it is a string
|
||||
const pokemon = pokemonName(args.join(' '));
|
||||
return message.channel.send(pokemon);
|
||||
|
||||
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const name = interaction.options.getString('pokemonname');
|
||||
const number = interaction.options.getInteger('pokemonnumber');
|
||||
if (!name && !number) {
|
||||
const pokemon = randomPokemon();
|
||||
interaction.reply(pokemon);
|
||||
return;
|
||||
}
|
||||
if (number) {
|
||||
const pokemon = pokemonNumber(number);
|
||||
interaction.reply(pokemon);
|
||||
return;
|
||||
}
|
||||
const pokemon = pokemonName(name);
|
||||
interaction.reply(pokemon);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,38 @@
|
|||
module.exports = {
|
||||
name: 'profilepicture',
|
||||
description: 'Get the profile picture of a user.',
|
||||
help: 'Get the profile picture of a user.',
|
||||
arguments: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 'User',
|
||||
description: 'The user to get the profile picture',
|
||||
required: false
|
||||
}
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 6, // User type
|
||||
description: 'The user to get the profile picture',
|
||||
required: false
|
||||
}
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
premium: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
contexts: ['GUILD_TEXT', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute(message, args) {
|
||||
const user = message.mentions.users.first() || message.author;
|
||||
message.channel.send(user.displayAvatarURL({ dynamic: true }));
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
const user = interaction.options.getUser('user') || interaction.user;
|
||||
interaction.reply(user.displayAvatarURL({ dynamic: true }));
|
||||
},
|
||||
};
|
|
@ -0,0 +1,28 @@
|
|||
module.exports = {
|
||||
name: '',
|
||||
description: '',
|
||||
help: '',
|
||||
arguments: [
|
||||
{
|
||||
name: '',
|
||||
description: '',
|
||||
type: 3,
|
||||
required: false,
|
||||
}
|
||||
],
|
||||
options: [],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: true,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute(message, args) {
|
||||
message.channel.send();
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
interaction.reply();
|
||||
},
|
||||
};
|
|
@ -0,0 +1,149 @@
|
|||
//waifu img
|
||||
function returnWaifu(type) {
|
||||
//check if the type is valid
|
||||
const validTypes = ['waifu', 'neko', 'shinobu', 'megumin', 'bully', 'cuddle', 'cry', 'hug', 'awoo', 'kiss', 'lick', 'pat', 'smug', 'bonk', 'yeet', 'blush', 'smile', 'wave', 'highfive', 'handhold', 'nom', 'bite', 'glomp', 'slap', 'kill', 'kick', 'happy', 'wink', 'poke', 'dance', 'cringe'];
|
||||
if (!validTypes.includes(type)) {
|
||||
return 'Invalid type';
|
||||
}
|
||||
return fetch(`https://api.waifu.pics/sfw/${type}`)
|
||||
.then(response => response.json())
|
||||
.then(data => data.url);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
//make choose list
|
||||
name: 'waifu',
|
||||
description: 'Get a random waifu picture',
|
||||
help: 'Get a random waifu picture with the type you want',
|
||||
arguments: [
|
||||
{
|
||||
name: 'type',
|
||||
type: 'STRING',
|
||||
description: 'The type of waifu picture you want',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
options: [
|
||||
{
|
||||
name: 'type',
|
||||
description: 'The type of waifu picture you want',
|
||||
type: 3,
|
||||
required: true,
|
||||
choices: [
|
||||
{
|
||||
name: 'waifu',
|
||||
value: 'waifu',
|
||||
},
|
||||
{
|
||||
name: 'neko',
|
||||
value: 'neko',
|
||||
},
|
||||
{
|
||||
name: 'shinobu',
|
||||
value: 'shinobu',
|
||||
},
|
||||
{
|
||||
name: 'megumin',
|
||||
value: 'megumin',
|
||||
},
|
||||
{
|
||||
name: 'cuddle',
|
||||
value: 'cuddle',
|
||||
},
|
||||
{
|
||||
name: 'cry',
|
||||
value: 'cry',
|
||||
},
|
||||
{
|
||||
name: 'hug',
|
||||
value: 'hug',
|
||||
},
|
||||
{
|
||||
name: 'awoo',
|
||||
value: 'awoo',
|
||||
},
|
||||
{
|
||||
name: 'kiss',
|
||||
value: 'kiss',
|
||||
},
|
||||
{
|
||||
name: 'pat',
|
||||
value: 'pat',
|
||||
},
|
||||
{
|
||||
name: 'smug',
|
||||
value: 'smug',
|
||||
},
|
||||
{
|
||||
name: 'bonk',
|
||||
value: 'bonk',
|
||||
},
|
||||
{
|
||||
name: 'blush',
|
||||
value: 'blush',
|
||||
},
|
||||
{
|
||||
name: 'smile',
|
||||
value: 'smile',
|
||||
},
|
||||
{
|
||||
name: 'wave',
|
||||
value: 'wave',
|
||||
},
|
||||
{
|
||||
name: 'highfive',
|
||||
value: 'highfive',
|
||||
},
|
||||
{
|
||||
name: 'handhold',
|
||||
value: 'handhold',
|
||||
},
|
||||
{
|
||||
name: 'nom',
|
||||
value: 'nom',
|
||||
},
|
||||
{
|
||||
name: 'bite',
|
||||
value: 'bite',
|
||||
},
|
||||
{
|
||||
name: 'slap',
|
||||
value: 'slap',
|
||||
},
|
||||
{
|
||||
name: 'happy',
|
||||
value: 'happy',
|
||||
},
|
||||
{
|
||||
name: 'wink',
|
||||
value: 'wink',
|
||||
},
|
||||
{
|
||||
name: 'poke',
|
||||
value: 'poke',
|
||||
},
|
||||
{
|
||||
name: 'dance',
|
||||
value: 'dance',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
requireBan: false,
|
||||
premium: false,
|
||||
canBeUsedInDm: true,
|
||||
contexts: ['GUILD_TEXT', 'GUILD_VOICE', 'DM'],
|
||||
integration_types: [0,1],
|
||||
execute: async (message, args) => {
|
||||
const waifu = await returnWaifu(args[0]);
|
||||
message.channel.send(waifu);
|
||||
},
|
||||
executeSlash: async interaction => {
|
||||
const waifu = await returnWaifu(interaction.options.getString('type'));
|
||||
interaction.reply(waifu);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,38 @@
|
|||
module.exports = {
|
||||
name: 'who',
|
||||
description: 'Gets data about a user.',
|
||||
help: 'Gets data about a user.',
|
||||
arguments: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 'User',
|
||||
description: 'The user to get data',
|
||||
required: false
|
||||
}
|
||||
],
|
||||
slash: true,
|
||||
text: true,
|
||||
admin: false,
|
||||
requireKick: false,
|
||||
premium: false,
|
||||
requireBan: false,
|
||||
canBeUsedInDm: false,
|
||||
contexts: ['GUILD_TEXT', 'DM'],
|
||||
integration_types: [0,1],
|
||||
options: [
|
||||
{
|
||||
name: 'user',
|
||||
type: 6, // User type
|
||||
description: 'The user to get data',
|
||||
required: false
|
||||
}
|
||||
],
|
||||
execute(message, args) {
|
||||
const user = message.mentions.users.first() || message.author;
|
||||
message.channel.send(`Username: ${user.username}\nID: ${user.id}\nCreated at: ${user.createdAt}\nBot: ${user.bot ? '✅' : '❌'}`);
|
||||
},
|
||||
executeSlash(interaction) {
|
||||
const user = interaction.options.getUser('user') || interaction.user;
|
||||
interaction.reply(`Username: ${user.username}\nID: ${user.id}\nCreated at: ${user.createdAt}\nBot: ${user.bot ? '✅' : '❌'}`);
|
||||
},
|
||||
};
|
|
@ -0,0 +1,230 @@
|
|||
[
|
||||
{
|
||||
"number": 1,
|
||||
"name": "Bulbasaur",
|
||||
"type": [
|
||||
"Grass",
|
||||
"Poison"
|
||||
],
|
||||
"height": "0.7 m",
|
||||
"weight": "6.9 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Bulbasaur is the first Pokémon in the National Pokédex.",
|
||||
"Bulbasaur is the only dual-type Pokémon in the National Pokédex that is both Poison and Grass type.",
|
||||
"Bulbasaur is the only Pokémon that can learn Frenzy Plant, Blast Burn, and Hydro Cannon."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/1.png"
|
||||
},
|
||||
{
|
||||
"number": 2,
|
||||
"name": "Ivysaur",
|
||||
"type": [
|
||||
"Grass",
|
||||
"Poison"
|
||||
],
|
||||
"height": "1.0 m",
|
||||
"weight": "13.0 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Ivysaur is the evolved form of Bulbasaur.",
|
||||
"Ivysaur is the only Pokémon that can learn Frenzy Plant, Blast Burn, and Hydro Cannon."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/2.png"
|
||||
},
|
||||
{
|
||||
"number": 3,
|
||||
"name": "Venusaur",
|
||||
"type": [
|
||||
"Grass",
|
||||
"Poison"
|
||||
],
|
||||
"height": "2.0 m",
|
||||
"weight": "100.0 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Venusaur is the evolved form of Ivysaur.",
|
||||
"Venusaur is the only Pokémon that can learn Frenzy Plant, Blast Burn, and Hydro Cannon."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/3.png"
|
||||
},
|
||||
{
|
||||
"number": 4,
|
||||
"name": "Charmander",
|
||||
"type": [
|
||||
"Fire"
|
||||
],
|
||||
"height": "0.6 m",
|
||||
"weight": "8.5 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Charmander is the first Fire-type Pokémon in the National Pokédex.",
|
||||
"Charmander is the only Pokémon that can learn Blast Burn."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/4.png"
|
||||
},
|
||||
{
|
||||
"number": 5,
|
||||
"name": "Charmeleon",
|
||||
"type": [
|
||||
"Fire"
|
||||
],
|
||||
"height": "1.1 m",
|
||||
"weight": "19.0 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Charmeleon is the evolved form of Charmander.",
|
||||
"Charmeleon is the only Pokémon that can learn Blast Burn."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/5.png"
|
||||
},
|
||||
{
|
||||
"number": 6,
|
||||
"name": "Charizard",
|
||||
"type": [
|
||||
"Fire",
|
||||
"Flying"
|
||||
],
|
||||
"height": "1.7 m",
|
||||
"weight": "90.5 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Charizard is the evolved form of Charmeleon.",
|
||||
"Charizard is the only Pokémon that can learn Blast Burn."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/6.png"
|
||||
},
|
||||
{
|
||||
"number": 7,
|
||||
"name": "Squirtle",
|
||||
"type": [
|
||||
"Water"
|
||||
],
|
||||
"height": "0.5 m",
|
||||
"weight": "9.0 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Squirtle is the first Water-type Pokémon in the National Pokédex.",
|
||||
"Squirtle is the only Pokémon that can learn Hydro Cannon."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/7.png"
|
||||
},
|
||||
{
|
||||
"number": 8,
|
||||
"name": "Wartortle",
|
||||
"type": [
|
||||
"Water"
|
||||
],
|
||||
"height": "1.0 m",
|
||||
"weight": "22.5 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Wartortle is the evolved form of Squirtle.",
|
||||
"Wartortle is the only Pokémon that can learn Hydro Cannon."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/8.png"
|
||||
},
|
||||
{
|
||||
"number": 9,
|
||||
"name": "Blastoise",
|
||||
"type": [
|
||||
"Water"
|
||||
],
|
||||
"height": "1.6 m",
|
||||
"weight": "85.5 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Blastoise is the evolved form of Wartortle.",
|
||||
"Blastoise is the only Pokémon that can learn Hydro Cannon."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/9.png"
|
||||
},
|
||||
{
|
||||
"number": 10,
|
||||
"name": "Caterpie",
|
||||
"type": [
|
||||
"Bug"
|
||||
],
|
||||
"height": "0.3 m",
|
||||
"weight": "2.9 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Caterpie is the first Bug-type Pokémon in the National Pokédex."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/10.png"
|
||||
},
|
||||
{
|
||||
"number": 11,
|
||||
"name": "Metapod",
|
||||
"type": [
|
||||
"Bug"
|
||||
],
|
||||
"height": "0.7 m",
|
||||
"weight": "9.9 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Metapod is the evolved form of Caterpie."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/11.png"
|
||||
},
|
||||
{
|
||||
"number": 12,
|
||||
"name": "Butterfree",
|
||||
"type": [
|
||||
"Bug",
|
||||
"Flying"
|
||||
],
|
||||
"height": "1.1 m",
|
||||
"weight": "32.0 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Butterfree is the evolved form of Metapod."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/12.png"
|
||||
},
|
||||
{
|
||||
"number": 13,
|
||||
"name": "Weedle",
|
||||
"type": [
|
||||
"Bug",
|
||||
"Poison"
|
||||
],
|
||||
"height": "0.3 m",
|
||||
"weight": "3.2 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Weedle is the first Bug-type Pokémon in the National Pokédex that is also Poison type."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/13.png"
|
||||
},
|
||||
{
|
||||
"number": 14,
|
||||
"name": "Kakuna",
|
||||
"type": [
|
||||
"Bug",
|
||||
"Poison"
|
||||
],
|
||||
"height": "0.6 m",
|
||||
"weight": "10.0 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Kakuna is the evolved form of Weedle."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/14.png"
|
||||
},
|
||||
{
|
||||
"number": 15,
|
||||
"name": "Beedrill",
|
||||
"type": [
|
||||
"Bug",
|
||||
"Poison"
|
||||
],
|
||||
"height": "1.0 m",
|
||||
"weight": "29.5 kg",
|
||||
"first_appeared": 1,
|
||||
"some_facts": [
|
||||
"Beedrill is the evolved form of Kakuna."
|
||||
],
|
||||
"img": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/15.png"
|
||||
}
|
||||
]
|
|
@ -0,0 +1,17 @@
|
|||
[
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Pokémon Red and Blue",
|
||||
"year": 1996
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Pokémon Yellow",
|
||||
"year": 1998
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Pokémon Gold and Silver",
|
||||
"year": 1999
|
||||
}
|
||||
]
|
|
@ -0,0 +1,48 @@
|
|||
const { REST, Routes, Integration } = require('discord.js');
|
||||
const { clientId, token } = require('./config.json');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const commands = [];
|
||||
const commandsPath = path.join(__dirname, 'commands');
|
||||
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
|
||||
|
||||
const contextsMapping = {
|
||||
GUILD_TEXT: 0,
|
||||
GUILD_VOICE: 1,
|
||||
DM: 2
|
||||
};
|
||||
|
||||
for (const file of commandFiles) {
|
||||
const filePath = path.join(commandsPath, file);
|
||||
const command = require(filePath);
|
||||
if (command.slash) {
|
||||
const slashCommand = {
|
||||
name: command.name,
|
||||
description: command.description,
|
||||
options: command.options || [],
|
||||
default_permission: command.admin ? false : true,
|
||||
contexts: command.contexts.map(context => contextsMapping[context]) || [0],
|
||||
integration_types: command.integration_types || [0],
|
||||
};
|
||||
commands.push(slashCommand);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const rest = new REST({ version: '10' }).setToken(token);
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
console.log('Started refreshing application (/) commands.');
|
||||
|
||||
await rest.put(
|
||||
Routes.applicationCommands(clientId),
|
||||
{ body: commands },
|
||||
);
|
||||
|
||||
console.log('Successfully reloaded application (/) commands.');
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
})();
|
|
@ -0,0 +1,9 @@
|
|||
const { Events } = require('discord.js');
|
||||
|
||||
module.exports = {
|
||||
name: Events.GuildCreate,
|
||||
once: false,
|
||||
execute(guild) {
|
||||
console.log(`Joined guild ${guild.name}`);
|
||||
}
|
||||
};
|
|
@ -0,0 +1,10 @@
|
|||
const { Events } = require('discord.js');
|
||||
|
||||
module.exports = {
|
||||
name: Events.ClientReady,
|
||||
once: true,
|
||||
execute(client) {
|
||||
console.log(`Ready! Logged in as ${client.user.tag}`);
|
||||
client.user.setActivity('a game', { type: 'PLAYING' });
|
||||
},
|
||||
};
|
|
@ -0,0 +1,9 @@
|
|||
const { Events } = require('discord.js');
|
||||
|
||||
module.exports = {
|
||||
name: Events.NAME,
|
||||
once: false,
|
||||
execute(args) {
|
||||
//TODO
|
||||
}
|
||||
};
|
|
@ -0,0 +1,128 @@
|
|||
const { Client, Events, GatewayIntentBits, Collection, PermissionsBitField } = require('discord.js');
|
||||
const { token, prefix, wwwport } = require('./config.json');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
var http = require('http');
|
||||
http.createServer(function (req, res) {
|
||||
//res.write('Strona domowa: Bot v2.0, link zaproszenia: https://discord.com/oauth2/authorize?client_id=883390927383724112');
|
||||
var json = {
|
||||
"Strona domowa": "Bot v2.0",
|
||||
"Link zaproszenia": "https://discord.com/oauth2/authorize?client_id=883390927383724112",
|
||||
"Status": "Working"
|
||||
};
|
||||
res.write(JSON.stringify(json));
|
||||
res.end();
|
||||
}).listen(wwwport || 8080);
|
||||
|
||||
const client = new Client({
|
||||
intents: [
|
||||
GatewayIntentBits.Guilds,
|
||||
GatewayIntentBits.GuildMessages,
|
||||
GatewayIntentBits.MessageContent,
|
||||
GatewayIntentBits.GuildMessageReactions,
|
||||
GatewayIntentBits.GuildMembers,
|
||||
GatewayIntentBits.GuildVoiceStates,
|
||||
GatewayIntentBits.GuildMessageTyping,
|
||||
GatewayIntentBits.DirectMessages,
|
||||
GatewayIntentBits.DirectMessageReactions,
|
||||
GatewayIntentBits.DirectMessageTyping
|
||||
]
|
||||
});
|
||||
|
||||
client.commands = new Collection();
|
||||
|
||||
const commandsPath = path.join(__dirname, 'commands');
|
||||
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
|
||||
|
||||
for (const file of commandFiles) {
|
||||
const filePath = path.join(commandsPath, file);
|
||||
const command = require(filePath);
|
||||
if (!command.text) continue;
|
||||
client.commands.set(command.name, command);
|
||||
}
|
||||
|
||||
const eventsPath = path.join(__dirname, 'events');
|
||||
const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js'));
|
||||
|
||||
for (const file of eventFiles) {
|
||||
const filePath = path.join(eventsPath, file);
|
||||
const event = require(filePath);
|
||||
if (event.once) {
|
||||
client.once(event.name, (...args) => event.execute(...args));
|
||||
} else {
|
||||
client.on(event.name, (...args) => event.execute(...args));
|
||||
}
|
||||
}
|
||||
|
||||
client.on(Events.MessageCreate, message => {
|
||||
if (!message.content.startsWith(prefix) || message.author.bot) return;
|
||||
const args = message.content.slice(1).split(/ +/);
|
||||
const commandName = args.shift().toLowerCase();
|
||||
|
||||
if (!client.commands.has(commandName)) return;
|
||||
|
||||
const command = client.commands.get(commandName);
|
||||
|
||||
try {
|
||||
if(command.admin && !message.member.permissions.has(PermissionsBitField.Flags.Administrator)) {
|
||||
message.reply('You do not have permission to use this command.');
|
||||
return;
|
||||
}
|
||||
if (!command.canBeUsedInDm && !message.guild) {
|
||||
message.reply('This command can only be used in a server.');
|
||||
return;
|
||||
}
|
||||
if (command.requireKick && !message.member.permissions.has(PermissionsBitField.Flags.KickMembers)) {
|
||||
message.reply('You do not have permission to use this command.');
|
||||
return;
|
||||
}
|
||||
if (command.requireBan && !message.member.permissions.has(PermissionsBitField.Flags.BanMembers)) {
|
||||
message.reply('You do not have permission to use this command.');
|
||||
return;
|
||||
}
|
||||
if (command.text) {
|
||||
command.execute(message, args);
|
||||
message.react('✅');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
message.reply('There was an error trying to execute that command!');
|
||||
//react message with an emoji X
|
||||
message.react('❌');
|
||||
}
|
||||
});
|
||||
|
||||
client.on(Events.InteractionCreate, async interaction => {
|
||||
if (!interaction.isCommand()) return;
|
||||
|
||||
const command = client.commands.get(interaction.commandName);
|
||||
|
||||
if (!command) return;
|
||||
|
||||
try {
|
||||
if(command.admin && !interaction.member.permissions.has(PermissionsBitField.Flags.Administrator)) {
|
||||
await interaction.reply({ content: 'You do not have permission to use this command!', ephemeral: true });
|
||||
return;
|
||||
}
|
||||
if (!command.canBeUsedInDm && !interaction.guild) {
|
||||
await interaction.reply({ content: 'This command can only be used in a server!', ephemeral: true });
|
||||
return;
|
||||
}
|
||||
if (command.requireKick && !interaction.member.permissions.has(PermissionsBitField.Flags.KickMembers)) {
|
||||
await interaction.reply({ content: 'You do not have permission to use this command!', ephemeral: true });
|
||||
return;
|
||||
}
|
||||
if (command.requireBan && !interaction.member.permissions.has(PermissionsBitField.Flags.BanMembers)) {
|
||||
await interaction.reply({ content: 'You do not have permission to use this command!', ephemeral: true });
|
||||
return;
|
||||
}
|
||||
if (command.slash) {
|
||||
await command.executeSlash(interaction);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true });
|
||||
}
|
||||
});
|
||||
|
||||
client.login(token);
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"watch": ["commands", "deploy-commands.js", "index.js"],
|
||||
"execMap": {
|
||||
"js": "node"
|
||||
},
|
||||
"events": {
|
||||
"restart": "node deploy-commands.js"
|
||||
},
|
||||
"ignore": ["node_modules"],
|
||||
"ext": "js,json"
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"name": "discordjs",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "node deploy-commands.js && nodemon index.js",
|
||||
"test": "nodemon index.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"discord.js": "^14.15.2",
|
||||
"nodemon": "^3.1.0"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue