mirror of
https://github.com/JonnyBro/JaBa.git
synced 2025-01-01 16:23:02 +05:00
Compare commits
5 commits
b11cf4ce11
...
5e800f7447
Author | SHA1 | Date | |
---|---|---|---|
5e800f7447 | |||
3cf0b475af | |||
11bb890a99 | |||
f373df7252 | |||
de517c724e |
300 changed files with 14566 additions and 2588 deletions
4
.gitmodules
vendored
4
.gitmodules
vendored
|
@ -1,4 +0,0 @@
|
||||||
[submodule "dashboard/dashboard-core"]
|
|
||||||
path = dashboard/dashboard-core
|
|
||||||
url = https://git.jonnybro.ru/jonny_bro/dashboard-core
|
|
||||||
branch = main
|
|
3
.prettierignore
Normal file
3
.prettierignore
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/dist
|
||||||
|
/coverage
|
||||||
|
/node_modules
|
|
@ -64,7 +64,6 @@ If you want to contribute, feel free to fork this repo and making a pull request
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
* [ ] Refactor [tictactoe](./helpers/tictactoe.js).
|
|
||||||
* [ ] Finish and release *dashboard-core* submodule.
|
* [ ] Finish and release *dashboard-core* submodule.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
328
base/Client.js
328
base/Client.js
|
@ -1,9 +1,7 @@
|
||||||
const { Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder, EmbedBuilder, PermissionsBitField, ChannelType } = require("discord.js"),
|
const { Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder, EmbedBuilder, PermissionsBitField, ChannelType } = require("discord.js"),
|
||||||
{ GiveawaysManager } = require("discord-giveaways"),
|
{ GiveawaysManager } = require("discord-giveaways"),
|
||||||
{ REST } = require("@discordjs/rest"),
|
{ REST } = require("@discordjs/rest"),
|
||||||
{ Player: DiscordPlayer } = require("discord-player"),
|
{ Player } = require("discord-player"),
|
||||||
{ SpotifyExtractor } = require("@discord-player/extractor"),
|
|
||||||
{ YoutubeiExtractor } = require("discord-player-youtubei"),
|
|
||||||
{ Routes } = require("discord-api-types/v10");
|
{ Routes } = require("discord-api-types/v10");
|
||||||
|
|
||||||
const BaseEvent = require("./BaseEvent.js"),
|
const BaseEvent = require("./BaseEvent.js"),
|
||||||
|
@ -33,32 +31,23 @@ class JaBaClient extends Client {
|
||||||
this.databaseCache.guilds = new Collection();
|
this.databaseCache.guilds = new Collection();
|
||||||
this.databaseCache.members = new Collection();
|
this.databaseCache.members = new Collection();
|
||||||
this.databaseCache.usersReminds = new Collection();
|
this.databaseCache.usersReminds = new Collection();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
this.player = new Player(this, {
|
||||||
* Initializes the client by logging in with the provided token and connecting to the MongoDB database.
|
ytdlOptions: {
|
||||||
*
|
requestOptions: {
|
||||||
* This method is called during the client's startup process to set up the necessary connections and resources.
|
headers: {
|
||||||
*
|
cookie: this.config.youtubeCookie,
|
||||||
* @returns {Promise<void>} A Promise that resolves when the client is fully initialized.
|
},
|
||||||
*/
|
},
|
||||||
async init() {
|
|
||||||
this.player = new DiscordPlayer(this);
|
|
||||||
|
|
||||||
await this.player.extractors.register(YoutubeiExtractor, {
|
|
||||||
authentication: this.config.youtubeCookie,
|
|
||||||
streamOptions: {
|
|
||||||
useClient: "YTMUSIC_ANDROID",
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
this.player.extractors.loadDefault(null, {
|
||||||
await this.player.extractors.register(SpotifyExtractor, {
|
SpotifyExtractor: {
|
||||||
clientId: this.config.spotify.clientId,
|
clientId: this.config.spotify.clientId,
|
||||||
clientSecret: this.config.spotify.clientSecret,
|
clientSecret: this.config.spotify.clientSecret,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.player.extractors.loadDefault(ext => !["YouTubeExtractor", "SpotifyExtractor"].includes(ext));
|
|
||||||
|
|
||||||
this.player.events.on("playerStart", async (queue, track) => {
|
this.player.events.on("playerStart", async (queue, track) => {
|
||||||
const m = (
|
const m = (
|
||||||
await queue.metadata.channel.send({
|
await queue.metadata.channel.send({
|
||||||
|
@ -99,24 +88,37 @@ class JaBaClient extends Client {
|
||||||
reaction: "🎉",
|
reaction: "🎉",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the client by logging in with the provided token and connecting to the MongoDB database.
|
||||||
|
*
|
||||||
|
* This method is called during the client's startup process to set up the necessary connections and resources.
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>} A Promise that resolves when the client is fully initialized.
|
||||||
|
*/
|
||||||
|
async init() {
|
||||||
|
this.login(this.config.token);
|
||||||
|
|
||||||
mongoose
|
mongoose
|
||||||
.connect(this.config.mongoDB)
|
.connect(this.config.mongoDB)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.logger.log("Connected to the MongoDB database.");
|
this.logger.log("Connected to the Mongodb database.");
|
||||||
})
|
})
|
||||||
.catch(e => {
|
.catch(err => {
|
||||||
this.logger.error(`Unable to connect to the MongoDB database.\nError: ${e.message}\n${e.stack}`);
|
this.logger.error(`Unable to connect to the Mongodb database.\nError: ${err}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.login(this.config.token);
|
// const autoUpdateDocs = require("../helpers/autoUpdateDocs");
|
||||||
|
// autoUpdateDocs.update(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads all the commands from the specified directory and registers them with the Discord API.
|
* Loads all the commands from the specified directory and registers them with the Discord API.
|
||||||
*
|
*
|
||||||
* This method dynamically loads all command files from the specified directory,
|
* This method is responsible for dynamically loading all the command files from the specified directory,
|
||||||
* creates instances of the corresponding command classes, and registers them with the Discord API.
|
* creating instances of the corresponding command classes, and registering the commands with the Discord API.
|
||||||
|
* It also handles any additional setup or initialization required by the loaded commands.
|
||||||
*
|
*
|
||||||
* @param {string} dir - The directory path where the command files are located.
|
* @param {string} dir - The directory path where the command files are located.
|
||||||
* @returns {Promise<void>} A Promise that resolves when all the commands have been loaded and registered.
|
* @returns {Promise<void>} A Promise that resolves when all the commands have been loaded and registered.
|
||||||
|
@ -124,119 +126,43 @@ class JaBaClient extends Client {
|
||||||
async loadCommands(dir) {
|
async loadCommands(dir) {
|
||||||
const rest = new REST().setToken(this.config.token),
|
const rest = new REST().setToken(this.config.token),
|
||||||
filePath = path.join(__dirname, dir),
|
filePath = path.join(__dirname, dir),
|
||||||
folders = (await fs.readdir(filePath)).map(file => path.join(filePath, file));
|
folders = (await fs.readdir(filePath)).map(file => path.join(filePath, file)).filter(async path => (await fs.lstat(path)).isDirectory());
|
||||||
|
|
||||||
const commands = [];
|
const commands = [];
|
||||||
for (const folder of folders) {
|
for (let index = 0; index < folders.length; index++) {
|
||||||
|
const folder = folders[index];
|
||||||
|
|
||||||
|
if (folder.endsWith("!DISABLED")) continue;
|
||||||
|
|
||||||
const files = await fs.readdir(folder);
|
const files = await fs.readdir(folder);
|
||||||
|
|
||||||
for (const file of files) {
|
for (let index = 0; index < files.length; index++) {
|
||||||
if (!file.endsWith(".js")) continue;
|
const file = files[index];
|
||||||
|
|
||||||
const Command = require(path.join(folder, file));
|
if (file.endsWith(".js")) {
|
||||||
|
const Command = require(path.join(folder, file));
|
||||||
|
|
||||||
if (!(Command.prototype instanceof BaseCommand)) continue;
|
if (Command.prototype instanceof BaseCommand) {
|
||||||
|
const command = new Command(this);
|
||||||
|
this.commands.set(command.command.name, command);
|
||||||
|
|
||||||
const command = new Command(this);
|
if (command.onLoad && typeof command.onLoad === "function") await command.onLoad(this);
|
||||||
this.commands.set(command.command.name, command);
|
|
||||||
|
|
||||||
if (typeof command.onLoad === "function") await command.onLoad(this);
|
commands.push(command.command instanceof SlashCommandBuilder || command.command instanceof ContextMenuCommandBuilder ? command.command.toJSON() : command.command);
|
||||||
|
|
||||||
commands.push(command.command instanceof SlashCommandBuilder || command.command instanceof ContextMenuCommandBuilder ? command.command.toJSON() : command.command);
|
this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`);
|
||||||
|
}
|
||||||
this.logger.log(`Successfully loaded "${file}" command. (Command: ${command.command.name})`);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const route = this.config.production ? Routes.applicationCommands(this.config.userId) : Routes.applicationGuildCommands(this.config.userId, this.config.support.id);
|
if (this.config.production) await rest.put(Routes.applicationCommands(this.config.userId), { body: commands });
|
||||||
|
else await rest.put(Routes.applicationGuildCommands(this.config.userId, this.config.support.id), { body: commands });
|
||||||
await rest.put(route, { body: commands });
|
|
||||||
|
|
||||||
this.logger.log("Successfully registered application commands.");
|
this.logger.log("Successfully registered application commands.");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.error("Error registering application commands:", err);
|
console.log(err);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads a command from the specified directory and file.
|
|
||||||
* @param {string} dir - The directory containing the command file.
|
|
||||||
* @param {string} file - The name of the command file (without the .js extension).
|
|
||||||
* @returns {Promise<void>} This method does not return a value.
|
|
||||||
*/
|
|
||||||
async loadCommand(dir, file) {
|
|
||||||
try {
|
|
||||||
const Command = require(path.join(dir, `${file}.js`));
|
|
||||||
|
|
||||||
if (!(Command.prototype instanceof BaseCommand)) {
|
|
||||||
return this.logger.error(`Tried to load a non-command file: "${file}.js"`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const command = new Command(this);
|
|
||||||
this.commands.set(command.command.name, command);
|
|
||||||
|
|
||||||
if (typeof command.onLoad === "function") await command.onLoad(this);
|
|
||||||
|
|
||||||
this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`);
|
|
||||||
} catch (error) {
|
|
||||||
this.logger.error(`Error loading command "${file}":`, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unloads a command from the specified directory and file.
|
|
||||||
* @param {string} dir - The directory containing the command file.
|
|
||||||
* @param {string} name - The name of the command file (without the .js extension).
|
|
||||||
* @returns {void} This method does not return a value.
|
|
||||||
*/
|
|
||||||
unloadCommand(dir, name) {
|
|
||||||
delete require.cache[require.resolve(`${dir}${path.sep}${name}.js`)];
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads all event files from the specified directory and its subdirectories.
|
|
||||||
* @param {string} dir - The directory containing the event files.
|
|
||||||
* @returns {Promise<void>} This method does not return a value.
|
|
||||||
*/
|
|
||||||
async loadEvents(dir) {
|
|
||||||
const filePath = path.join(__dirname, dir);
|
|
||||||
const files = await fs.readdir(filePath);
|
|
||||||
|
|
||||||
for (const file of files) {
|
|
||||||
const fullPath = path.join(filePath, file);
|
|
||||||
const stat = await fs.lstat(fullPath);
|
|
||||||
|
|
||||||
if (stat.isDirectory()) {
|
|
||||||
await this.loadEvents(path.join(dir, file));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file.endsWith(".js")) {
|
|
||||||
try {
|
|
||||||
const Event = require(fullPath);
|
|
||||||
|
|
||||||
if (!(Event.prototype instanceof BaseEvent)) {
|
|
||||||
this.logger.error(`"${file}" is not a valid event file.`);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const event = new Event();
|
|
||||||
|
|
||||||
if (!event.name || !event.name.length) {
|
|
||||||
this.logger.error(`Cannot load "${file}" event: Event name is missing!`);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.once ? this.once(event.name, event.execute.bind(event, this)) : this.on(event.name, event.execute.bind(event, this));
|
|
||||||
|
|
||||||
this.logger.log(`Successfully loaded "${file}" event. (Event: ${event.name})`);
|
|
||||||
} catch (error) {
|
|
||||||
this.logger.error(`Error loading event "${file}":`, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,24 +196,37 @@ class JaBaClient extends Client {
|
||||||
* @param {Object[]} [data.fields] - An array of field objects for the embed.
|
* @param {Object[]} [data.fields] - An array of field objects for the embed.
|
||||||
* @param {string} [data.image] - The URL of the image for the embed.
|
* @param {string} [data.image] - The URL of the image for the embed.
|
||||||
* @param {string} [data.url] - The URL to be used as the embed's hyperlink.
|
* @param {string} [data.url] - The URL to be used as the embed's hyperlink.
|
||||||
* @param {string} [data.color] - The HEX color of the embed's border.
|
* @param {string} [data.color] - The HEX color of the embed's border. If not provided, the default color from the client's configuration will be used.
|
||||||
* @param {string|Object} [data.footer] - The text to be displayed as the embed's footer.
|
* @param {string} [data.footer] - The text to be displayed as the embed's footer. If not provided, the default footer from the client's configuration will be used.
|
||||||
* @param {Date} [data.timestamp] - The timestamp to be displayed in the embed.
|
* @param {Date} [data.timestamp] - The timestamp to be displayed in the embed's footer. If not provided, the current timestamp will be used.
|
||||||
* @param {string|Object} [data.author] - The author information for the embed.
|
* @param {string|Object} [data.author] - The author information for the embed. Can be a string (name) or an object with `name` and/or `iconURL` properties.
|
||||||
* @returns {EmbedBuilder} The generated EmbedBuilder instance.
|
* @returns {EmbedBuilder} The generated EmbedBuilder instance.
|
||||||
*/
|
*/
|
||||||
embed(data) {
|
embed(data) {
|
||||||
const embed = new EmbedBuilder()
|
const embed = new EmbedBuilder()
|
||||||
.setTitle(data.title ?? null)
|
.setTitle(data.title || null)
|
||||||
.setDescription(data.description ?? null)
|
.setDescription(data.description || null)
|
||||||
.setThumbnail(data.thumbnail ?? null)
|
.setThumbnail(data.thumbnail || null)
|
||||||
.addFields(data.fields ?? [])
|
.addFields(data.fields || [])
|
||||||
.setImage(data.image ?? null)
|
.setImage(data.image || null)
|
||||||
.setURL(data.url ?? null)
|
.setURL(data.url || null);
|
||||||
.setColor(data.color ?? this.config.embed.color)
|
|
||||||
.setFooter(typeof data.footer === "object" ? data.footer : data.footer ? { text: data.footer } : this.config.embed.footer)
|
if (data.color) embed.setColor(data.color);
|
||||||
.setTimestamp(data.timestamp ?? null)
|
else if (data.color === null) embed.setColor(null);
|
||||||
.setAuthor(typeof data.author === "string" ? { name: data.author, iconURL: this.user.avatarURL() } : data.author ?? null);
|
else embed.setColor(this.config.embed.color);
|
||||||
|
|
||||||
|
if (data.footer) embed.setFooter(data.footer);
|
||||||
|
else if (data.footer === null) embed.setFooter(null);
|
||||||
|
else embed.setFooter(this.config.embed.footer);
|
||||||
|
|
||||||
|
if (data.timestamp) embed.setTimestamp(data.timestamp);
|
||||||
|
else if (data.timestamp === null) embed.setTimestamp(null);
|
||||||
|
else embed.setTimestamp();
|
||||||
|
|
||||||
|
if (!data.author || data.author === null) embed.setAuthor(null);
|
||||||
|
else if (typeof data.author === "string") embed.setAuthor({ name: data.author, iconURL: this.user.avatarURL() });
|
||||||
|
else if (typeof data.author === "object" && (data.author.iconURL !== null || data.author.iconURL !== undefined)) embed.setAuthor({ name: data.author.name, iconURL: data.author.iconURL });
|
||||||
|
else embed.setAuthor(data.author);
|
||||||
|
|
||||||
return embed;
|
return embed;
|
||||||
}
|
}
|
||||||
|
@ -305,22 +244,86 @@ class JaBaClient extends Client {
|
||||||
if (channel) return (await channel.createInvite()).url || "No channels found or missing permissions";
|
if (channel) return (await channel.createInvite()).url || "No channels found or missing permissions";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a command from the specified directory and file.
|
||||||
|
* @param {string} dir - The directory containing the command file.
|
||||||
|
* @param {string} file - The name of the command file (without the .js extension).
|
||||||
|
* @returns {Promise<string>} A log message indicating the successful loading of the command.
|
||||||
|
*/
|
||||||
|
async loadCommand(dir, file) {
|
||||||
|
const Command = require(path.join(dir, `${file}.js`));
|
||||||
|
if (!(Command.prototype instanceof BaseCommand)) return this.logger.error("Tried to load a non-command file!");
|
||||||
|
|
||||||
|
const command = new Command(this);
|
||||||
|
this.commands.set(command.command.name, command);
|
||||||
|
|
||||||
|
if (command.onLoad && typeof command.onLoad === "function") await command.onLoad(this);
|
||||||
|
|
||||||
|
return this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unloads a command from the specified directory and file.
|
||||||
|
* @param {string} dir - The directory containing the command file.
|
||||||
|
* @param {string} name - The name of the command file (without the .js extension).
|
||||||
|
* @returns {void} This method does not return a value.
|
||||||
|
*/
|
||||||
|
async unloadCommand(dir, name) {
|
||||||
|
delete require.cache[require.resolve(`${dir}${path.sep}${name}.js`)];
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads all event files from the specified directory and its subdirectories.
|
||||||
|
* @param {string} dir - The directory containing the event files.
|
||||||
|
* @returns {void} This method does not return a value.
|
||||||
|
*/
|
||||||
|
async loadEvents(dir) {
|
||||||
|
const filePath = path.join(__dirname, dir);
|
||||||
|
const files = await fs.readdir(filePath);
|
||||||
|
|
||||||
|
for (let index = 0; index < files.length; index++) {
|
||||||
|
const file = files[index];
|
||||||
|
const stat = await fs.lstat(path.join(filePath, file));
|
||||||
|
if (stat.isDirectory()) this.loadEvents(path.join(dir, file));
|
||||||
|
|
||||||
|
if (file.endsWith(".js")) {
|
||||||
|
const Event = require(path.join(filePath, file));
|
||||||
|
|
||||||
|
if (Event.prototype instanceof BaseEvent) {
|
||||||
|
const event = new Event();
|
||||||
|
if (!event.name || !event.name.length) return console.error(`Cannot load "${file}" event file: Event name is not set!`);
|
||||||
|
if (event.once) this.once(event.name, event.execute.bind(event, this));
|
||||||
|
else this.on(event.name, event.execute.bind(event, this));
|
||||||
|
|
||||||
|
this.logger.log(`Successfully loaded "${file}" event file. (Event: ${event.name})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a User data from the database.
|
* Returns a User data from the database.
|
||||||
* @param {string} userID - The ID of the user to find or create.
|
* @param {string} userID - The ID of the user to find or create.
|
||||||
* @returns {Promise<import("./User")>} The user data object, either retrieved from the database or newly created.
|
* @returns {Promise<import("./User")>} The user data object, either retrieved from the database or newly created.
|
||||||
*/
|
*/
|
||||||
async getUserData(userID) {
|
async getUserData(userID) {
|
||||||
let userData = await this.usersData.findOne({ id: userID });
|
let userData = await this.usersData.findOne({ id: userID });
|
||||||
|
|
||||||
if (!userData) {
|
if (userData) {
|
||||||
|
this.databaseCache.users.set(userID, userData);
|
||||||
|
|
||||||
|
return userData;
|
||||||
|
} else {
|
||||||
userData = new this.usersData({ id: userID });
|
userData = new this.usersData({ id: userID });
|
||||||
|
|
||||||
await userData.save();
|
await userData.save();
|
||||||
|
|
||||||
|
this.databaseCache.users.set(userID, userData);
|
||||||
|
|
||||||
|
return userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.databaseCache.users.set(userID, userData);
|
|
||||||
|
|
||||||
return userData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -332,19 +335,27 @@ class JaBaClient extends Client {
|
||||||
async getMemberData(memberId, guildId) {
|
async getMemberData(memberId, guildId) {
|
||||||
let memberData = await this.membersData.findOne({ guildID: guildId, id: memberId });
|
let memberData = await this.membersData.findOne({ guildID: guildId, id: memberId });
|
||||||
|
|
||||||
if (!memberData) {
|
if (memberData) {
|
||||||
|
this.databaseCache.members.set(`${memberId}${guildId}`, memberData);
|
||||||
|
|
||||||
|
return memberData;
|
||||||
|
} else {
|
||||||
memberData = new this.membersData({ id: memberId, guildID: guildId });
|
memberData = new this.membersData({ id: memberId, guildID: guildId });
|
||||||
|
|
||||||
await memberData.save();
|
await memberData.save();
|
||||||
|
|
||||||
const guildData = await this.getGuildData(guildId);
|
const guildData = await this.getGuildData(guildId);
|
||||||
|
|
||||||
if (guildData) {
|
if (guildData) {
|
||||||
guildData.members.push(memberData._id);
|
guildData.members.push(memberData._id);
|
||||||
|
|
||||||
await guildData.save();
|
await guildData.save();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
this.databaseCache.members.set(`${memberId}/${guildId}`, memberData);
|
this.databaseCache.members.set(`${memberId}/${guildId}`, memberData);
|
||||||
return memberData;
|
|
||||||
|
return memberData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -355,14 +366,19 @@ class JaBaClient extends Client {
|
||||||
async getGuildData(guildId) {
|
async getGuildData(guildId) {
|
||||||
let guildData = await this.guildsData.findOne({ id: guildId }).populate("members");
|
let guildData = await this.guildsData.findOne({ id: guildId }).populate("members");
|
||||||
|
|
||||||
if (!guildData) {
|
if (guildData) {
|
||||||
|
this.databaseCache.guilds.set(guildId, guildData);
|
||||||
|
|
||||||
|
return guildData;
|
||||||
|
} else {
|
||||||
guildData = new this.guildsData({ id: guildId });
|
guildData = new this.guildsData({ id: guildId });
|
||||||
|
|
||||||
await guildData.save();
|
await guildData.save();
|
||||||
|
|
||||||
|
this.databaseCache.guilds.set(guildId, guildData);
|
||||||
|
|
||||||
|
return guildData;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.databaseCache.guilds.set(guildId, guildData);
|
|
||||||
|
|
||||||
return guildData;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
73
commands/!DISABLED/ban.js
Normal file
73
commands/!DISABLED/ban.js
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
class Ban extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("ban")
|
||||||
|
.setDescription(client.translate("moderation/ban:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("moderation/ban:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("moderation/ban:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false)
|
||||||
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.BanMembers)
|
||||||
|
.addUserOption(option =>
|
||||||
|
option
|
||||||
|
.setName("user")
|
||||||
|
.setDescription(client.translate("common:USER"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("common:USER", null, "uk-UA"),
|
||||||
|
ru: client.translate("common:USER", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setRequired(true),
|
||||||
|
)
|
||||||
|
.addStringOption(option =>
|
||||||
|
option
|
||||||
|
.setName("reason")
|
||||||
|
.setDescription(client.translate("common:REASON"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("common:REASON", null, "uk-UA"),
|
||||||
|
ru: client.translate("common:REASON", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setRequired(true),
|
||||||
|
),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
await interaction.deferReply();
|
||||||
|
|
||||||
|
const member = interaction.options.getMember("user"),
|
||||||
|
reason = interaction.options.getString("reason"),
|
||||||
|
memberPosition = member.roles.highest.position,
|
||||||
|
moderationPosition = interaction.member.roles.highest.position;
|
||||||
|
|
||||||
|
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
|
||||||
|
if (member.id === interaction.member.id) return interaction.error("moderation/ban:YOURSELF", null, { ephemeral: true, edit: true });
|
||||||
|
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition) && member.bannable) return interaction.error("moderation/ban:SUPERIOR", null, { ephemeral: true, edit: true });
|
||||||
|
|
||||||
|
await member.ban({
|
||||||
|
reason,
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.success("moderation/ban:SUCCESS", {
|
||||||
|
user: member.user.toString(),
|
||||||
|
reason,
|
||||||
|
}, { edit: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Ban;
|
49
commands/!DISABLED/importmee6.js
Normal file
49
commands/!DISABLED/importmee6.js
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
const { SlashCommandBuilder } = require("discord.js"),
|
||||||
|
Mee6Api = require("../../helpers/mee6-api");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
class ImportMee6 extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("importmee6")
|
||||||
|
.setDescription(client.translate("economy/importmee6:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("economy/importmee6:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("economy/importmee6:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
await interaction.deferReply();
|
||||||
|
|
||||||
|
const level = (await Mee6Api.getUserXp(interaction.guildId, interaction.member)).level;
|
||||||
|
|
||||||
|
interaction.data.member.level = level;
|
||||||
|
interaction.data.member.exp = 0;
|
||||||
|
|
||||||
|
await interaction.data.member.save();
|
||||||
|
|
||||||
|
interaction.editReply({
|
||||||
|
content: interaction.translate("owner/debug:SUCCESS_LEVEL", {
|
||||||
|
user: interaction.member.toString(),
|
||||||
|
amount: level,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ImportMee6;
|
73
commands/!DISABLED/kick.js
Normal file
73
commands/!DISABLED/kick.js
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
class Kick extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("kick")
|
||||||
|
.setDescription(client.translate("moderation/kick:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("moderation/kick:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("moderation/kick:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false)
|
||||||
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.KickMembers)
|
||||||
|
.addUserOption(option =>
|
||||||
|
option
|
||||||
|
.setName("user")
|
||||||
|
.setDescription(client.translate("common:USER"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("common:USER", null, "uk-UA"),
|
||||||
|
ru: client.translate("common:USER", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setRequired(true),
|
||||||
|
)
|
||||||
|
.addStringOption(option =>
|
||||||
|
option
|
||||||
|
.setName("reason")
|
||||||
|
.setDescription(client.translate("common:REASON"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("common:REASON", null, "uk-UA"),
|
||||||
|
ru: client.translate("common:REASON", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setRequired(true),
|
||||||
|
),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
await interaction.deferReply();
|
||||||
|
|
||||||
|
const member = interaction.options.getMember("user"),
|
||||||
|
reason = interaction.options.getString("reason"),
|
||||||
|
memberPosition = member.roles.highest.position,
|
||||||
|
moderationPosition = interaction.member.roles.highest.position;
|
||||||
|
|
||||||
|
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
|
||||||
|
if (member.id === interaction.member.id) return interaction.error("moderation/kick:YOURSELF", null, { ephemeral: true, edit: true });
|
||||||
|
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition) && member.kickable) return interaction.error("moderation/kick:SUPERIOR", null, { ephemeral: true, edit: true });
|
||||||
|
|
||||||
|
await member.kick({
|
||||||
|
reason,
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.success("moderation/kick:SUCCESS", {
|
||||||
|
user: member.user.toString(),
|
||||||
|
reason,
|
||||||
|
}, { edit: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Kick;
|
79
commands/!DISABLED/memes.js
Normal file
79
commands/!DISABLED/memes.js
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
const { SlashCommandBuilder, ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
class Memes extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("memes")
|
||||||
|
.setDescription(client.translate("fun/memes:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("fun/memes:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("fun/memes:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
*/
|
||||||
|
async onLoad(client) {
|
||||||
|
client.on("interactionCreate", async interaction => {
|
||||||
|
if (!interaction.isStringSelectMenu()) return;
|
||||||
|
|
||||||
|
if (interaction.customId === "memes_select") {
|
||||||
|
interaction.deferUpdate();
|
||||||
|
|
||||||
|
interaction.guild.data = await client.getGuildData(interaction.guildId);
|
||||||
|
|
||||||
|
const tag = interaction.values[0];
|
||||||
|
const res = await fetch(`https://meme-api.com/gimme/${tag}`).then(response => response.json());
|
||||||
|
|
||||||
|
const embed = client.embed({
|
||||||
|
title: res.title,
|
||||||
|
description: `${interaction.translate("fun/memes:SUBREDDIT")}: **${res.subreddit}**\n${interaction.translate("common:AUTHOR")}: **${res.author}**\n${interaction.translate("fun/memes:UPS")}: **${res.ups}**`,
|
||||||
|
image: res.url,
|
||||||
|
});
|
||||||
|
|
||||||
|
await interaction.editReply({
|
||||||
|
embeds: [embed],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
await interaction.deferReply({ ephemeral: true });
|
||||||
|
|
||||||
|
const tags = ["funny", "memes", "dankmemes", "me_irl", "wholesomememes"].map(tag =>
|
||||||
|
JSON.parse(
|
||||||
|
JSON.stringify({
|
||||||
|
label: tag,
|
||||||
|
value: tag,
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
const row = new ActionRowBuilder().addComponents(new StringSelectMenuBuilder().setCustomId("memes_select").setPlaceholder(interaction.translate("common:NOTHING_SELECTED")).addOptions(tags));
|
||||||
|
|
||||||
|
await interaction.editReply({
|
||||||
|
components: [row],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Memes;
|
63
commands/!DISABLED/staff.js
Normal file
63
commands/!DISABLED/staff.js
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
class Staff extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("staff")
|
||||||
|
.setDescription(client.translate("general/staff:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("general/staff:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("general/staff:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
await interaction.guild.members.fetch();
|
||||||
|
|
||||||
|
const administrators = interaction.guild.members.cache.filter(m => m.permissions.has(PermissionsBitField.Flags.Administrator) && !m.user.bot);
|
||||||
|
const moderators = interaction.guild.members.cache.filter(m => !administrators.has(m.id) && m.permissions.has(PermissionsBitField.Flags.ManageMessages) && !m.user.bot);
|
||||||
|
|
||||||
|
const embed = client.embed({
|
||||||
|
author: {
|
||||||
|
name: interaction.translate("general/staff:TITLE", {
|
||||||
|
guild: interaction.guild.name,
|
||||||
|
}),
|
||||||
|
iconURL: interaction.guild.iconURL(),
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: interaction.translate("general/staff:ADMINS"),
|
||||||
|
value:
|
||||||
|
administrators.size > 0
|
||||||
|
? administrators.map(a => `${a.presence ? client.customEmojis.status[a.presence.status] : client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n")
|
||||||
|
: interaction.translate("general/staff:NO_ADMINS"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: interaction.translate("general/staff:MODS"),
|
||||||
|
value: moderators.size > 0 ? moderators.map(m => `${m.presence ? client.customEmojis.status[m.presence.status] : client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : interaction.translate("general/staff:NO_MODS"),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.reply({
|
||||||
|
embeds: [embed],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Staff;
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Addemoji extends BaseCommand {
|
class Addemoji extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Addemoji extends BaseCommand {
|
||||||
uk: client.translate("administration/addemoji:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/addemoji:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/addemoji:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/addemoji:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
|
@ -59,7 +58,7 @@ class Addemoji extends BaseCommand {
|
||||||
})
|
})
|
||||||
.then(emoji =>
|
.then(emoji =>
|
||||||
interaction.success("administration/stealemoji:SUCCESS", {
|
interaction.success("administration/stealemoji:SUCCESS", {
|
||||||
emoji: emoji.toString(),
|
emoji: emoji.name,
|
||||||
}, { ephemeral: true }),
|
}, { ephemeral: true }),
|
||||||
)
|
)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, ChannelType, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField, ChannelType } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Automod extends BaseCommand {
|
class Automod extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Automod extends BaseCommand {
|
||||||
uk: client.translate("administration/automod:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/automod:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/automod:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/automod:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addSubcommand(subcommand =>
|
.addSubcommand(subcommand =>
|
||||||
subcommand
|
subcommand
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Autorole extends BaseCommand {
|
class Autorole extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Autorole extends BaseCommand {
|
||||||
uk: client.translate("administration/autorole:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/autorole:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/autorole:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/autorole:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addBooleanOption(option =>
|
.addBooleanOption(option =>
|
||||||
option
|
option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, ChannelType, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField, ChannelType } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Config extends BaseCommand {
|
class Config extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Config extends BaseCommand {
|
||||||
uk: client.translate("administration/config:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/config:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/config:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/config:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addSubcommand(subcommand =>
|
.addSubcommand(subcommand =>
|
||||||
subcommand
|
subcommand
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Goodbye extends BaseCommand {
|
class Goodbye extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Goodbye extends BaseCommand {
|
||||||
uk: client.translate("administration/goodbye:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/goodbye:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/goodbye:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/goodbye:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addSubcommand(subcommand =>
|
.addSubcommand(subcommand =>
|
||||||
subcommand
|
subcommand
|
||||||
|
@ -27,43 +26,42 @@ class Goodbye extends BaseCommand {
|
||||||
ru: client.translate("administration/goodbye:TEST", null, "ru-RU"),
|
ru: client.translate("administration/goodbye:TEST", null, "ru-RU"),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.addSubcommand(
|
.addSubcommand(subcommand =>
|
||||||
subcommand =>
|
subcommand
|
||||||
subcommand
|
.setName("config")
|
||||||
.setName("config")
|
.setDescription(client.translate("administration/goodbye:CONFIG"))
|
||||||
.setDescription(client.translate("administration/goodbye:CONFIG"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("administration/goodbye:CONFIG", null, "uk-UA"),
|
||||||
uk: client.translate("administration/goodbye:CONFIG", null, "uk-UA"),
|
ru: client.translate("administration/goodbye:CONFIG", null, "ru-RU"),
|
||||||
ru: client.translate("administration/goodbye:CONFIG", null, "ru-RU"),
|
})
|
||||||
})
|
.addBooleanOption(option =>
|
||||||
.addBooleanOption(option =>
|
option
|
||||||
option
|
.setName("state")
|
||||||
.setName("state")
|
.setDescription(client.translate("common:STATE"))
|
||||||
.setDescription(client.translate("common:STATE"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("common:STATE", null, "uk-UA"),
|
||||||
uk: client.translate("common:STATE", null, "uk-UA"),
|
ru: client.translate("common:STATE", null, "ru-RU"),
|
||||||
ru: client.translate("common:STATE", null, "ru-RU"),
|
})
|
||||||
})
|
.setRequired(true),
|
||||||
.setRequired(true),
|
)
|
||||||
)
|
.addChannelOption(option =>
|
||||||
.addChannelOption(option =>
|
option
|
||||||
option
|
.setName("channel")
|
||||||
.setName("channel")
|
.setDescription(client.translate("common:CHANNEL"))
|
||||||
.setDescription(client.translate("common:CHANNEL"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("common:CHANNEL", null, "uk-UA"),
|
||||||
uk: client.translate("common:CHANNEL", null, "uk-UA"),
|
ru: client.translate("common:CHANNEL", null, "ru-RU"),
|
||||||
ru: client.translate("common:CHANNEL", null, "ru-RU"),
|
}),
|
||||||
}),
|
)
|
||||||
)
|
.addStringOption(option =>
|
||||||
.addStringOption(option =>
|
option
|
||||||
option
|
.setName("message")
|
||||||
.setName("message")
|
.setDescription(client.translate("administration/goodbye:MESSAGE"))
|
||||||
.setDescription(client.translate("administration/goodbye:MESSAGE"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("administration/goodbye:MESSAGE", null, "uk-UA"),
|
||||||
uk: client.translate("administration/goodbye:MESSAGE", null, "uk-UA"),
|
ru: client.translate("administration/goodbye:MESSAGE", null, "ru-RU"),
|
||||||
ru: client.translate("administration/goodbye:MESSAGE", null, "ru-RU"),
|
}),
|
||||||
}),
|
),
|
||||||
),
|
|
||||||
// .addBooleanOption(option =>
|
// .addBooleanOption(option =>
|
||||||
// option
|
// option
|
||||||
// .setName("image")
|
// .setName("image")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, ActionRowBuilder, StringSelectMenuBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField, ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Selectroles extends BaseCommand {
|
class Selectroles extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Selectroles extends BaseCommand {
|
||||||
uk: client.translate("administration/selectroles:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/selectroles:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/selectroles:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/selectroles:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addSubcommand(subcommand =>
|
.addSubcommand(subcommand =>
|
||||||
subcommand
|
subcommand
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Set extends BaseCommand {
|
class Set extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Set extends BaseCommand {
|
||||||
uk: client.translate("administration/set:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/set:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/set:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/set:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Setlang extends BaseCommand {
|
class Setlang extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Setlang extends BaseCommand {
|
||||||
uk: client.translate("administration/setlang:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/setlang:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/setlang:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/setlang:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, parseEmoji, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, parseEmoji, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Stealemoji extends BaseCommand {
|
class Stealemoji extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Stealemoji extends BaseCommand {
|
||||||
uk: client.translate("administration/stealemoji:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/stealemoji:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/stealemoji:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/stealemoji:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
|
@ -48,7 +47,7 @@ class Stealemoji extends BaseCommand {
|
||||||
})
|
})
|
||||||
.then(emoji =>
|
.then(emoji =>
|
||||||
interaction.success("administration/stealemoji:SUCCESS", {
|
interaction.success("administration/stealemoji:SUCCESS", {
|
||||||
emoji: emoji.toString(),
|
emoji: emoji.name,
|
||||||
}, { ephemeral: true }),
|
}, { ephemeral: true }),
|
||||||
)
|
)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Welcome extends BaseCommand {
|
class Welcome extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Welcome extends BaseCommand {
|
||||||
uk: client.translate("administration/welcome:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("administration/welcome:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("administration/welcome:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("administration/welcome:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild)
|
||||||
.addSubcommand(subcommand =>
|
.addSubcommand(subcommand =>
|
||||||
subcommand
|
subcommand
|
||||||
|
@ -27,43 +26,42 @@ class Welcome extends BaseCommand {
|
||||||
ru: client.translate("administration/goodbye:TEST", null, "ru-RU"),
|
ru: client.translate("administration/goodbye:TEST", null, "ru-RU"),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.addSubcommand(
|
.addSubcommand(subcommand =>
|
||||||
subcommand =>
|
subcommand
|
||||||
subcommand
|
.setName("config")
|
||||||
.setName("config")
|
.setDescription(client.translate("administration/goodbye:CONFIG"))
|
||||||
.setDescription(client.translate("administration/goodbye:CONFIG"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("administration/goodbye:CONFIG", null, "uk-UA"),
|
||||||
uk: client.translate("administration/goodbye:CONFIG", null, "uk-UA"),
|
ru: client.translate("administration/goodbye:CONFIG", null, "ru-RU"),
|
||||||
ru: client.translate("administration/goodbye:CONFIG", null, "ru-RU"),
|
})
|
||||||
})
|
.addBooleanOption(option =>
|
||||||
.addBooleanOption(option =>
|
option
|
||||||
option
|
.setName("state")
|
||||||
.setName("state")
|
.setDescription(client.translate("common:STATE"))
|
||||||
.setDescription(client.translate("common:STATE"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("common:STATE", null, "uk-UA"),
|
||||||
uk: client.translate("common:STATE", null, "uk-UA"),
|
ru: client.translate("common:STATE", null, "ru-RU"),
|
||||||
ru: client.translate("common:STATE", null, "ru-RU"),
|
})
|
||||||
})
|
.setRequired(true),
|
||||||
.setRequired(true),
|
)
|
||||||
)
|
.addChannelOption(option =>
|
||||||
.addChannelOption(option =>
|
option
|
||||||
option
|
.setName("channel")
|
||||||
.setName("channel")
|
.setDescription(client.translate("common:CHANNEL"))
|
||||||
.setDescription(client.translate("common:CHANNEL"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("common:CHANNEL", null, "uk-UA"),
|
||||||
uk: client.translate("common:CHANNEL", null, "uk-UA"),
|
ru: client.translate("common:CHANNEL", null, "ru-RU"),
|
||||||
ru: client.translate("common:CHANNEL", null, "ru-RU"),
|
}),
|
||||||
}),
|
)
|
||||||
)
|
.addStringOption(option =>
|
||||||
.addStringOption(option =>
|
option
|
||||||
option
|
.setName("message")
|
||||||
.setName("message")
|
.setDescription(client.translate("administration/goodbye:MESSAGE"))
|
||||||
.setDescription(client.translate("administration/goodbye:MESSAGE"))
|
.setDescriptionLocalizations({
|
||||||
.setDescriptionLocalizations({
|
uk: client.translate("administration/goodbye:MESSAGE", null, "uk-UA"),
|
||||||
uk: client.translate("administration/goodbye:MESSAGE", null, "uk-UA"),
|
ru: client.translate("administration/goodbye:MESSAGE", null, "ru-RU"),
|
||||||
ru: client.translate("administration/goodbye:MESSAGE", null, "ru-RU"),
|
}),
|
||||||
}),
|
),
|
||||||
),
|
|
||||||
// .addBooleanOption(option =>
|
// .addBooleanOption(option =>
|
||||||
// option
|
// option
|
||||||
// .setName("image")
|
// .setName("image")
|
||||||
|
|
|
@ -1,100 +0,0 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
|
||||||
fetch = require("node-fetch");
|
|
||||||
|
|
||||||
class Courses extends BaseCommand {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {import("../base/Client")} client
|
|
||||||
*/
|
|
||||||
constructor(client) {
|
|
||||||
super({
|
|
||||||
command: new SlashCommandBuilder()
|
|
||||||
.setName("courses")
|
|
||||||
.setDescription(client.translate("beatrun/courses:DESCRIPTION"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("beatrun/courses:DESCRIPTION", null, "uk-UA"),
|
|
||||||
ru: client.translate("beatrun/courses:DESCRIPTION", null, "ru-RU"),
|
|
||||||
})
|
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
|
||||||
.setContexts([InteractionContextType.Guild, InteractionContextType.BotDM, InteractionContextType.PrivateChannel])
|
|
||||||
.addStringOption(option =>
|
|
||||||
option
|
|
||||||
.setName("code")
|
|
||||||
.setDescription(client.translate("common:CODE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("common:CODE", null, "uk-UA"),
|
|
||||||
ru: client.translate("common:CODE", null, "ru-RU"),
|
|
||||||
})
|
|
||||||
.setRequired(true),
|
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
dirname: __dirname,
|
|
||||||
ownerOnly: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {import("../../base/Client")} client
|
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
|
||||||
* @param {Object} data
|
|
||||||
*/
|
|
||||||
async execute(client, interaction) {
|
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
|
||||||
|
|
||||||
const code = interaction.options.getString("code");
|
|
||||||
const response = await fetch(`https://courses.jonnybro.ru/api/info/${code}`).then(res => res.json()),
|
|
||||||
{ data } = response;
|
|
||||||
|
|
||||||
if (response.res === 401) return interaction.error("beatrun/courses:NOT_FOUND", null, { ephemeral: true, edit: true });
|
|
||||||
|
|
||||||
const embed = client.embed({
|
|
||||||
title: data.name,
|
|
||||||
description: `[${interaction.translate("beatrun/courses:DOWNLOAD")}](https://courses.jonnybro.ru/${data.path})`,
|
|
||||||
thumbnail: data.mapimg,
|
|
||||||
url: `https://courses.jonnybro.ru/?search=${code}`,
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: interaction.translate("beatrun/courses:MAP"),
|
|
||||||
value: `[${data.map}](https://steamcommunity.com/sharedfiles/filedetails/?id=${data.mapid})`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: interaction.translate("beatrun/courses:UPLOADER"),
|
|
||||||
value: `[${data.uploader.name || data.uploader.userid}](https://steamcommunity.com/profiles/${data.uploader.userid})`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "\u200B",
|
|
||||||
value: "\u200B",
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: interaction.translate("beatrun/courses:DATE"),
|
|
||||||
value: `<t:${Math.floor(data.time / 1000)}:D>`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: interaction.translate("beatrun/courses:PLAYS"),
|
|
||||||
value: `${data.plays || 0}`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
interaction.editReply({
|
|
||||||
embeds: [embed],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Courses;
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Achievements extends BaseCommand {
|
class Achievements extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Achievements extends BaseCommand {
|
||||||
uk: client.translate("economy/achievements:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/achievements:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/achievements:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/achievements:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Bank extends BaseCommand {
|
class Bank extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Bank extends BaseCommand {
|
||||||
uk: client.translate("economy/bank:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/bank:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/bank:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/bank:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("option")
|
.setName("option")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Birthdate extends BaseCommand {
|
class Birthdate extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Birthdate extends BaseCommand {
|
||||||
uk: client.translate("economy/birthdate:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/birthdate:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/birthdate:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/birthdate:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.Guild, InteractionContextType.PrivateChannel])
|
|
||||||
.addIntegerOption(option =>
|
.addIntegerOption(option =>
|
||||||
option
|
option
|
||||||
.setName("day")
|
.setName("day")
|
||||||
|
@ -24,7 +23,8 @@ class Birthdate extends BaseCommand {
|
||||||
.setDescriptionLocalizations({
|
.setDescriptionLocalizations({
|
||||||
uk: client.translate("economy/birthdate:DAY", null, "uk-UA"),
|
uk: client.translate("economy/birthdate:DAY", null, "uk-UA"),
|
||||||
ru: client.translate("economy/birthdate:DAY", null, "ru-RU"),
|
ru: client.translate("economy/birthdate:DAY", null, "ru-RU"),
|
||||||
}),
|
})
|
||||||
|
.setRequired(true),
|
||||||
)
|
)
|
||||||
.addIntegerOption(option =>
|
.addIntegerOption(option =>
|
||||||
option
|
option
|
||||||
|
@ -34,19 +34,20 @@ class Birthdate extends BaseCommand {
|
||||||
uk: client.translate("economy/birthdate:MONTH", null, "uk-UA"),
|
uk: client.translate("economy/birthdate:MONTH", null, "uk-UA"),
|
||||||
ru: client.translate("economy/birthdate:MONTH", null, "ru-RU"),
|
ru: client.translate("economy/birthdate:MONTH", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
|
.setRequired(true)
|
||||||
.setChoices(
|
.setChoices(
|
||||||
{ name: client.translate("misc:MONTHS:JANUARY"), value: 1 },
|
{ name: client.translate("economy/birthdate:JANUARY"), value: 1 },
|
||||||
{ name: client.translate("misc:MONTHS:FEBRUARY"), value: 2 },
|
{ name: client.translate("economy/birthdate:FEBRUARY"), value: 2 },
|
||||||
{ name: client.translate("misc:MONTHS:MARCH"), value: 3 },
|
{ name: client.translate("economy/birthdate:MARCH"), value: 3 },
|
||||||
{ name: client.translate("misc:MONTHS:APRIL"), value: 4 },
|
{ name: client.translate("economy/birthdate:APRIL"), value: 4 },
|
||||||
{ name: client.translate("misc:MONTHS:MAY"), value: 5 },
|
{ name: client.translate("economy/birthdate:MAY"), value: 5 },
|
||||||
{ name: client.translate("misc:MONTHS:JUNE"), value: 6 },
|
{ name: client.translate("economy/birthdate:JUNE"), value: 6 },
|
||||||
{ name: client.translate("misc:MONTHS:JULY"), value: 7 },
|
{ name: client.translate("economy/birthdate:JULY"), value: 7 },
|
||||||
{ name: client.translate("misc:MONTHS:AUGUST"), value: 8 },
|
{ name: client.translate("economy/birthdate:AUGUST"), value: 8 },
|
||||||
{ name: client.translate("misc:MONTHS:SEPTEMBER"), value: 9 },
|
{ name: client.translate("economy/birthdate:SEPTEMBER"), value: 9 },
|
||||||
{ name: client.translate("misc:MONTHS:OCTOBER"), value: 10 },
|
{ name: client.translate("economy/birthdate:OCTOBER"), value: 10 },
|
||||||
{ name: client.translate("misc:MONTHS:NOVEMBER"), value: 11 },
|
{ name: client.translate("economy/birthdate:NOVEMBER"), value: 11 },
|
||||||
{ name: client.translate("misc:MONTHS:DECEMBER"), value: 12 },
|
{ name: client.translate("economy/birthdate:DECEMBER"), value: 12 },
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.addIntegerOption(option =>
|
.addIntegerOption(option =>
|
||||||
|
@ -56,25 +57,8 @@ class Birthdate extends BaseCommand {
|
||||||
.setDescriptionLocalizations({
|
.setDescriptionLocalizations({
|
||||||
uk: client.translate("economy/birthdate:YEAR", null, "uk-UA"),
|
uk: client.translate("economy/birthdate:YEAR", null, "uk-UA"),
|
||||||
ru: client.translate("economy/birthdate:YEAR", null, "ru-RU"),
|
ru: client.translate("economy/birthdate:YEAR", null, "ru-RU"),
|
||||||
}),
|
})
|
||||||
)
|
.setRequired(true),
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("clear")
|
|
||||||
.setDescription(client.translate("economy/birthdate:CLEAR"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("economy/birthdate:CLEAR", null, "uk-UA"),
|
|
||||||
ru: client.translate("economy/birthdate:CLEAR", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -87,20 +71,8 @@ class Birthdate extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
const userData = interaction.data.user,
|
||||||
|
day = interaction.options.getInteger("day"),
|
||||||
const userData = interaction.data.user;
|
|
||||||
|
|
||||||
if (interaction.options.getBoolean("clear")) {
|
|
||||||
userData.birthdate = null;
|
|
||||||
await userData.save();
|
|
||||||
|
|
||||||
return interaction.success("economy/birthdate:SUCCESS", {
|
|
||||||
date: "none",
|
|
||||||
}, { edit: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
const day = interaction.options.getInteger("day"),
|
|
||||||
month = interaction.options.getInteger("month"),
|
month = interaction.options.getInteger("month"),
|
||||||
year = interaction.options.getInteger("year"),
|
year = interaction.options.getInteger("year"),
|
||||||
date = new Date(year, month - 1, day);
|
date = new Date(year, month - 1, day);
|
||||||
|
@ -109,9 +81,9 @@ class Birthdate extends BaseCommand {
|
||||||
|
|
||||||
const d = Math.floor(date.getTime() / 1000);
|
const d = Math.floor(date.getTime() / 1000);
|
||||||
|
|
||||||
if (!(day == date.getDate() && month - 1 == date.getMonth() && year == date.getFullYear())) return interaction.error("economy/birthdate:INVALID_DATE", null, { edit: true });
|
if (!(day == date.getDate() && month - 1 == date.getMonth() && year == date.getFullYear())) return interaction.error("economy/birthdate:INVALID_DATE");
|
||||||
if (date.getTime() > Date.now()) return interaction.error("economy/birthdate:DATE_TOO_HIGH", null, { edit: true });
|
if (date.getTime() > Date.now()) return interaction.error("economy/birthdate:DATE_TOO_HIGH");
|
||||||
if (date.getTime() < Date.now() - 2.523e12) return interaction.error("economy/birthdate:DATE_TOO_LOW", null, { edit: true });
|
if (date.getTime() < Date.now() - 2.523e12) return interaction.error("economy/birthdate:DATE_TOO_LOW");
|
||||||
|
|
||||||
userData.birthdate = d;
|
userData.birthdate = d;
|
||||||
|
|
||||||
|
@ -119,7 +91,7 @@ class Birthdate extends BaseCommand {
|
||||||
|
|
||||||
interaction.success("economy/birthdate:SUCCESS", {
|
interaction.success("economy/birthdate:SUCCESS", {
|
||||||
date: `<t:${d}:D>`,
|
date: `<t:${d}:D>`,
|
||||||
}, { edit: true });
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Divorce extends BaseCommand {
|
class Divorce extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Divorce extends BaseCommand {
|
||||||
uk: client.translate("economy/divorce:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/divorce:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/divorce:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/divorce:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Leaderboard extends BaseCommand {
|
class Leaderboard extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Leaderboard extends BaseCommand {
|
||||||
uk: client.translate("economy/leaderboard:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/leaderboard:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/leaderboard:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/leaderboard:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("type")
|
.setName("type")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
pendings = {};
|
pendings = {};
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Marry extends BaseCommand {
|
||||||
uk: client.translate("economy/marry:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/marry:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/marry:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/marry:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -45,7 +44,7 @@ class Marry extends BaseCommand {
|
||||||
|
|
||||||
const member = interaction.options.getMember("user");
|
const member = interaction.options.getMember("user");
|
||||||
if (member.user.bot) return interaction.error("economy/marry:BOT_USER");
|
if (member.user.bot) return interaction.error("economy/marry:BOT_USER");
|
||||||
if (member.id === interaction.member.id) return interaction.error("misc:CANT_YOURSELF");
|
if (member.id === interaction.member.id) return interaction.error("economy/marry:YOURSELF");
|
||||||
|
|
||||||
const otherUserData = await client.getUserData(member.id);
|
const otherUserData = await client.getUserData(member.id);
|
||||||
if (otherUserData.lover) return interaction.error("economy/marry:ALREADY_MARRIED_USER", { user: member.toString() });
|
if (otherUserData.lover) return interaction.error("economy/marry:ALREADY_MARRIED_USER", { user: member.toString() });
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Money extends BaseCommand {
|
class Money extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Money extends BaseCommand {
|
||||||
uk: client.translate("economy/money:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/money:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/money:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/money:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -40,9 +39,10 @@ class Money extends BaseCommand {
|
||||||
await interaction.deferReply();
|
await interaction.deferReply();
|
||||||
|
|
||||||
const member = interaction.options.getMember("user") || interaction.member;
|
const member = interaction.options.getMember("user") || interaction.member;
|
||||||
if (member.user.bot) return interaction.error("economy/money:BOT_USER", null, { edit: true });
|
if (member.user.bot) return interaction.error("economy/money:BOT_USER");
|
||||||
|
|
||||||
const memberData = member.id === interaction.user.id ? interaction.data.member : await client.getMemberData(member.id, interaction.guildId);
|
const memberData = member.id === interaction.user.id ? interaction.data.member : await client.getMemberData(member.id, interaction.guildId);
|
||||||
|
|
||||||
const guilds = client.guilds.cache.filter(g => g.members.cache.find(m => m.id === member.id));
|
const guilds = client.guilds.cache.filter(g => g.members.cache.find(m => m.id === member.id));
|
||||||
|
|
||||||
let globalMoney = 0;
|
let globalMoney = 0;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Pay extends BaseCommand {
|
class Pay extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Pay extends BaseCommand {
|
||||||
uk: client.translate("economy/pay:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/pay:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/pay:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/pay:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -51,7 +50,7 @@ class Pay extends BaseCommand {
|
||||||
const memberData = interaction.data.member,
|
const memberData = interaction.data.member,
|
||||||
otherMember = interaction.options.getMember("user");
|
otherMember = interaction.options.getMember("user");
|
||||||
if (otherMember.user.bot) return interaction.error("economy/pay:BOT_USER");
|
if (otherMember.user.bot) return interaction.error("economy/pay:BOT_USER");
|
||||||
if (otherMember.id === interaction.member.id) return interaction.error("misc:CANT_YOURSELF");
|
if (otherMember.id === interaction.member.id) return interaction.error("economy/pay:YOURSELF");
|
||||||
|
|
||||||
const amount = interaction.options.getInteger("amount");
|
const amount = interaction.options.getInteger("amount");
|
||||||
if (amount <= 0) return interaction.error("misc:MORE_THAN_ZERO");
|
if (amount <= 0) return interaction.error("misc:MORE_THAN_ZERO");
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Profile extends BaseCommand {
|
class Profile extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Profile extends BaseCommand {
|
||||||
uk: client.translate("economy/profile:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/profile:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/profile:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/profile:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Rep extends BaseCommand {
|
class Rep extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Rep extends BaseCommand {
|
||||||
uk: client.translate("economy/rep:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/rep:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/rep:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/rep:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -50,7 +49,7 @@ class Rep extends BaseCommand {
|
||||||
|
|
||||||
const user = interaction.options.getUser("user");
|
const user = interaction.options.getUser("user");
|
||||||
if (user.bot) return interaction.error("economy/rep:BOT_USER");
|
if (user.bot) return interaction.error("economy/rep:BOT_USER");
|
||||||
if (user.id === interaction.user.id) return interaction.error("misc:CANT_YOURSELF");
|
if (user.id === interaction.user.id) return interaction.error("economy/rep:YOURSELF");
|
||||||
|
|
||||||
const toWait = Math.floor((Date.now() + 12 * 60 * 60 * 1000) / 1000); // 12 hours
|
const toWait = Math.floor((Date.now() + 12 * 60 * 60 * 1000) / 1000); // 12 hours
|
||||||
if (!userData.cooldowns) userData.cooldowns = {};
|
if (!userData.cooldowns) userData.cooldowns = {};
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Rob extends BaseCommand {
|
class Rob extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Rob extends BaseCommand {
|
||||||
uk: client.translate("economy/rob:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/rob:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/rob:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/rob:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -51,7 +50,7 @@ class Rob extends BaseCommand {
|
||||||
const memberData = interaction.data.member,
|
const memberData = interaction.data.member,
|
||||||
otherMember = interaction.options.getMember("user");
|
otherMember = interaction.options.getMember("user");
|
||||||
if (otherMember.user.bot) return interaction.error("economy/pay:BOT_USER");
|
if (otherMember.user.bot) return interaction.error("economy/pay:BOT_USER");
|
||||||
if (otherMember.id === interaction.member.id) return interaction.error("misc:CANT_YOURSELF");
|
if (otherMember.id === interaction.member.id) return interaction.error("economy/rob:YOURSELF");
|
||||||
|
|
||||||
const amount = interaction.options.getInteger("amount");
|
const amount = interaction.options.getInteger("amount");
|
||||||
if (amount <= 0) return interaction.error("misc:MORE_THAN_ZERO");
|
if (amount <= 0) return interaction.error("misc:MORE_THAN_ZERO");
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType, escapeEscape, escapeCodeBlock, escapeInlineCode } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Setbio extends BaseCommand {
|
class Setbio extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Setbio extends BaseCommand {
|
||||||
uk: client.translate("economy/setbio:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/setbio:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/setbio:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/setbio:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("text")
|
.setName("text")
|
||||||
|
@ -26,15 +25,6 @@ class Setbio extends BaseCommand {
|
||||||
ru: client.translate("economy/profile:BIO", null, "ru-RU"),
|
ru: client.translate("economy/profile:BIO", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -47,17 +37,15 @@ class Setbio extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
|
||||||
|
|
||||||
const userData = interaction.data.user,
|
const userData = interaction.data.user,
|
||||||
newBio = interaction.options.getString("text");
|
newBio = interaction.options.getString("text");
|
||||||
if (newBio.length > 150) return interaction.error("misc:MAX_150_CHARS", null, { edit: true });
|
if (newBio.length > 150) return interaction.error("economy/setbio:MAX_CHARACTERS");
|
||||||
|
|
||||||
userData.bio = escapeEscape(escapeCodeBlock(escapeInlineCode(newBio))).replace("@", "@\u200b");
|
userData.bio = newBio;
|
||||||
|
|
||||||
await userData.save();
|
await userData.save();
|
||||||
|
|
||||||
interaction.success("economy/setbio:SUCCESS", null, { edit: true });
|
interaction.success("economy/setbio:SUCCESS");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Slots extends BaseCommand {
|
class Slots extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Slots extends BaseCommand {
|
||||||
uk: client.translate("economy/slots:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/slots:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/slots:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/slots:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addIntegerOption(option =>
|
.addIntegerOption(option =>
|
||||||
option
|
option
|
||||||
.setName("amount")
|
.setName("amount")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Transactions extends BaseCommand {
|
class Transactions extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Transactions extends BaseCommand {
|
||||||
uk: client.translate("economy/transactions:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/transactions:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/transactions:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/transactions:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addBooleanOption(option =>
|
.addBooleanOption(option =>
|
||||||
option
|
option
|
||||||
.setName("clear")
|
.setName("clear")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, parseEmoji, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, parseEmoji } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Work extends BaseCommand {
|
class Work extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Work extends BaseCommand {
|
||||||
uk: client.translate("economy/work:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("economy/work:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("economy/work:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("economy/work:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Eightball extends BaseCommand {
|
class Eightball extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Eightball extends BaseCommand {
|
||||||
uk: client.translate("fun/8ball:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("fun/8ball:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("fun/8ball:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("fun/8ball:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("question")
|
.setName("question")
|
||||||
|
@ -26,15 +25,6 @@ class Eightball extends BaseCommand {
|
||||||
ru: client.translate("fun/8ball:QUESTION", null, "ru-RU"),
|
ru: client.translate("fun/8ball:QUESTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -47,7 +37,7 @@ class Eightball extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply();
|
||||||
|
|
||||||
const question = interaction.options.getString("question");
|
const question = interaction.options.getString("question");
|
||||||
const embed = client.embed({
|
const embed = client.embed({
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fetch = require("node-fetch");
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
@ -16,17 +16,7 @@ class Cat extends BaseCommand {
|
||||||
uk: client.translate("fun/cat:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("fun/cat:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("fun/cat:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("fun/cat:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
@ -38,7 +28,7 @@ class Cat extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply();
|
||||||
|
|
||||||
const res = await fetch("https://api.thecatapi.com/v1/images/search").then(r => r.json());
|
const res = await fetch("https://api.thecatapi.com/v1/images/search").then(r => r.json());
|
||||||
const cat = res[0].url;
|
const cat = res[0].url;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fetch = require("node-fetch");
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
@ -16,17 +16,7 @@ class Dog extends BaseCommand {
|
||||||
uk: client.translate("fun/dog:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("fun/dog:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("fun/dog:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("fun/dog:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
@ -38,7 +28,7 @@ class Dog extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply();
|
||||||
|
|
||||||
const res = await fetch("https://dog.ceo/api/breeds/image/random").then(r => r.json());
|
const res = await fetch("https://dog.ceo/api/breeds/image/random").then(r => r.json());
|
||||||
const dog = res.message;
|
const dog = res.message;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fetch = require("node-fetch");
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class LMGTFY extends BaseCommand {
|
||||||
uk: client.translate("fun/lmgtfy:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("fun/lmgtfy:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("fun/lmgtfy:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("fun/lmgtfy:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("query")
|
.setName("query")
|
||||||
|
@ -37,15 +36,6 @@ class LMGTFY extends BaseCommand {
|
||||||
ru: client.translate("fun/lmgtfy:SHORT", null, "ru-RU"),
|
ru: client.translate("fun/lmgtfy:SHORT", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -58,24 +48,24 @@ class LMGTFY extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply({ ephemeral: true });
|
||||||
|
|
||||||
const query = interaction.options.getString("query").replace(/[' '_]/g, "+"),
|
const query = interaction.options.getString("query").replace(/[' '_]/g, "+"),
|
||||||
short = interaction.options.getBoolean("short"),
|
short = interaction.options.getBoolean("short"),
|
||||||
url = `https://letmegooglethat.com/?q=${encodeURIComponent(query)}`;
|
url = `https://letmegooglethat.com/?q=${encodeURIComponent(query)}`;
|
||||||
|
|
||||||
if (short) {
|
if (short) {
|
||||||
const res = await fetch("https://i.jonnybro.ru/api/shorten", {
|
const res = await fetch("https://plsgo.ru/rest/v3/short-urls", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
Authorization: client.config.apiKeys.zipline,
|
"X-Api-Key": client.config.apiKeys.shlink,
|
||||||
},
|
},
|
||||||
body: JSON.stringify({ url: url }),
|
body: new URLSearchParams({ longUrl: url }),
|
||||||
}).then(res => res.json());
|
}).then(res => res.json());
|
||||||
|
|
||||||
interaction.editReply({
|
interaction.editReply({
|
||||||
content: `<${res.url}>`,
|
content: `<${res.shortUrl}>`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
interaction.editReply({
|
interaction.editReply({
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
md5 = require("md5");
|
md5 = require("md5");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Lovecalc extends BaseCommand {
|
||||||
uk: client.translate("fun/lovecalc:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("fun/lovecalc:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("fun/lovecalc:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("fun/lovecalc:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("first_member")
|
.setName("first_member")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, MessageCollector, ButtonBuilder, ActionRowBuilder, ButtonStyle, ThreadAutoArchiveDuration, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, MessageCollector, ButtonBuilder, ActionRowBuilder, ButtonStyle, ThreadAutoArchiveDuration } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
currentGames = {};
|
currentGames = {};
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Number extends BaseCommand {
|
||||||
uk: client.translate("fun/number:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("fun/number:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("fun/number:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("fun/number:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
tictactoe = require("../../helpers/tictactoe");
|
tictactoe = require("../../helpers/tictactoe");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class TicTacToe extends BaseCommand {
|
||||||
uk: client.translate("fun/tictactoe:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("fun/tictactoe:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("fun/tictactoe:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("fun/tictactoe:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild, InteractionContextType.PrivateChannel])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -39,23 +38,26 @@ class TicTacToe extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
const winner = await tictactoe(interaction, {
|
tictactoe(interaction, {
|
||||||
resultBtn: true,
|
resultBtn: true,
|
||||||
|
embedColor: client.config.embed.color,
|
||||||
|
embedFoot: client.config.embed.footer,
|
||||||
|
}).then(async winner => {
|
||||||
|
const memberData = await client.getMemberData(winner.id, interaction.guildId);
|
||||||
|
|
||||||
|
memberData.money += 100;
|
||||||
|
|
||||||
|
const info = {
|
||||||
|
user: interaction.translate("economy/transactions:TTT"),
|
||||||
|
amount: 100,
|
||||||
|
date: Date.now(),
|
||||||
|
type: "got",
|
||||||
|
};
|
||||||
|
|
||||||
|
memberData.transactions.push(info);
|
||||||
|
|
||||||
|
await memberData.save();
|
||||||
});
|
});
|
||||||
|
|
||||||
const memberData = await client.getMemberData(winner.id, interaction.guildId);
|
|
||||||
memberData.money += 100;
|
|
||||||
|
|
||||||
const info = {
|
|
||||||
user: interaction.translate("economy/transactions:TTT"),
|
|
||||||
amount: 100,
|
|
||||||
date: Date.now(),
|
|
||||||
type: "got",
|
|
||||||
};
|
|
||||||
|
|
||||||
memberData.transactions.push(info);
|
|
||||||
|
|
||||||
await memberData.save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType, escapeEscape, escapeCodeBlock, escapeInlineCode } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Afk extends BaseCommand {
|
class Afk extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Afk extends BaseCommand {
|
||||||
uk: client.translate("general/afk:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/afk:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/afk:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/afk:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("message")
|
.setName("message")
|
||||||
|
@ -26,15 +25,6 @@ class Afk extends BaseCommand {
|
||||||
ru: client.translate("common:MESSAGE", null, "ru-RU"),
|
ru: client.translate("common:MESSAGE", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -47,19 +37,17 @@ class Afk extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply({ ephemeral: true });
|
||||||
|
|
||||||
const userData = interaction.data.user,
|
const userData = interaction.data.user,
|
||||||
message = interaction.options.getString("message");
|
reason = interaction.options.getString("message");
|
||||||
|
|
||||||
if (message.length > 150) return interaction.error("misc:MAX_150_CHARS", null, { edit: true });
|
userData.afk = reason;
|
||||||
|
|
||||||
userData.afk = escapeEscape(escapeCodeBlock(escapeInlineCode(message))).replace("@", "@\u200b");
|
|
||||||
|
|
||||||
await userData.save();
|
await userData.save();
|
||||||
|
|
||||||
interaction.success("general/afk:SUCCESS", {
|
interaction.success("general/afk:SUCCESS", {
|
||||||
message,
|
reason,
|
||||||
}, { edit: true });
|
}, { edit: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { ContextMenuCommandBuilder, ApplicationCommandType, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { ContextMenuCommandBuilder, ApplicationCommandType } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class AvatarContext extends BaseCommand {
|
class AvatarContext extends BaseCommand {
|
||||||
|
@ -11,8 +11,7 @@ class AvatarContext extends BaseCommand {
|
||||||
command: new ContextMenuCommandBuilder()
|
command: new ContextMenuCommandBuilder()
|
||||||
.setName("Get Avatar")
|
.setName("Get Avatar")
|
||||||
.setType(ApplicationCommandType.User)
|
.setType(ApplicationCommandType.User)
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Avatar extends BaseCommand {
|
class Avatar extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Avatar extends BaseCommand {
|
||||||
uk: client.translate("general/avatar:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/avatar:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/avatar:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/avatar:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -34,15 +33,6 @@ class Avatar extends BaseCommand {
|
||||||
uk: client.translate("general/avatar:SERVER", null, "uk-UA"),
|
uk: client.translate("general/avatar:SERVER", null, "uk-UA"),
|
||||||
ru: client.translate("general/avatar:SERVER", null, "ru-RU"),
|
ru: client.translate("general/avatar:SERVER", null, "ru-RU"),
|
||||||
}),
|
}),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -55,13 +45,11 @@ class Avatar extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
const member = interaction.options.getMember("user") || interaction.member;
|
||||||
|
const avatarURL = interaction.options.getBoolean("server") ? member.displayAvatarURL({ size: 2048 }) : member.user.displayAvatarURL({ size: 2048 });
|
||||||
const user = interaction.options.getUser("user") || interaction.user;
|
|
||||||
const avatarURL = interaction.options.getBoolean("server") ? user.displayAvatarURL({ size: 2048 }) : user.avatarURL({ size: 2048 });
|
|
||||||
const embed = client.embed({ image: avatarURL });
|
const embed = client.embed({ image: avatarURL });
|
||||||
|
|
||||||
interaction.editReply({
|
interaction.reply({
|
||||||
embeds: [embed],
|
embeds: [embed],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Boosters extends BaseCommand {
|
class Boosters extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Boosters extends BaseCommand {
|
||||||
uk: client.translate("general/boosters:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/boosters:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/boosters:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/boosters:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, parseEmoji, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, parseEmoji } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Emoji extends BaseCommand {
|
class Emoji extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Emoji extends BaseCommand {
|
||||||
uk: client.translate("general/emoji:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/emoji:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/emoji:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/emoji:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("emoji")
|
.setName("emoji")
|
||||||
|
@ -26,15 +25,6 @@ class Emoji extends BaseCommand {
|
||||||
ru: client.translate("common:EMOJI", null, "ru-RU"),
|
ru: client.translate("common:EMOJI", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -47,10 +37,9 @@ class Emoji extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
|
||||||
|
|
||||||
const rawEmoji = interaction.options.getString("emoji");
|
const rawEmoji = interaction.options.getString("emoji");
|
||||||
const parsedEmoji = parseEmoji(rawEmoji);
|
const parsedEmoji = parseEmoji(rawEmoji);
|
||||||
|
|
||||||
const embed = client.embed({
|
const embed = client.embed({
|
||||||
author: {
|
author: {
|
||||||
name: interaction.translate("general/emoji:TITLE", {
|
name: interaction.translate("general/emoji:TITLE", {
|
||||||
|
@ -77,7 +66,7 @@ class Emoji extends BaseCommand {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
interaction.editReply({
|
interaction.reply({
|
||||||
embeds: [embed],
|
embeds: [embed],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, StringSelectMenuBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, StringSelectMenuBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Help extends BaseCommand {
|
class Help extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Help extends BaseCommand {
|
||||||
uk: client.translate("general/help:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/help:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/help:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/help:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("command")
|
.setName("command")
|
||||||
|
@ -26,15 +25,6 @@ class Help extends BaseCommand {
|
||||||
ru: client.translate("common:COMMAND", null, "ru-RU"),
|
ru: client.translate("common:COMMAND", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setAutocomplete(true),
|
.setAutocomplete(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -90,7 +80,7 @@ class Help extends BaseCommand {
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply();
|
||||||
|
|
||||||
const commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()];
|
const commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()];
|
||||||
const categories = [... new Set(commands.map(c => c.category))];
|
const categories = [... new Set(commands.map(c => c.category))];
|
||||||
|
|
|
@ -1,236 +0,0 @@
|
||||||
const { SlashCommandBuilder, ChannelType, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
|
||||||
|
|
||||||
class Info extends BaseCommand {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {import("../base/Client")} client
|
|
||||||
*/
|
|
||||||
constructor(client) {
|
|
||||||
super({
|
|
||||||
command: new SlashCommandBuilder()
|
|
||||||
.setName("info")
|
|
||||||
.setDescription(client.translate("general/info:DESCRIPTION"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("general/info:DESCRIPTION", null, "uk-UA"),
|
|
||||||
ru: client.translate("general/info:DESCRIPTION", null, "ru-RU"),
|
|
||||||
})
|
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addSubcommand(subcommand =>
|
|
||||||
subcommand
|
|
||||||
.setName("user")
|
|
||||||
.setDescription(client.translate("general/info:USER"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("general/info:USER", null, "uk-UA"),
|
|
||||||
ru: client.translate("general/info:USER", null, "ru-RU"),
|
|
||||||
})
|
|
||||||
.addUserOption(option =>
|
|
||||||
option
|
|
||||||
.setName("user")
|
|
||||||
.setDescription(client.translate("common:USER"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("common:USER", null, "uk-UA"),
|
|
||||||
ru: client.translate("common:USER", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.addSubcommand(subcommand =>
|
|
||||||
subcommand
|
|
||||||
.setName("server")
|
|
||||||
.setDescription(client.translate("general/info:SERVER"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("general/info:SERVER", null, "uk-UA"),
|
|
||||||
ru: client.translate("general/info:SERVER", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
dirname: __dirname,
|
|
||||||
ownerOnly: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {import("../../base/Client")} client
|
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
|
||||||
*/
|
|
||||||
async execute(client, interaction) {
|
|
||||||
await interaction.deferReply();
|
|
||||||
|
|
||||||
const command = interaction.options.getSubcommand();
|
|
||||||
|
|
||||||
if (command === "user") {
|
|
||||||
const member = interaction.options.getMember("user") || interaction.member;
|
|
||||||
const embed = getUserInfo(client, interaction, member);
|
|
||||||
|
|
||||||
return interaction.editReply({
|
|
||||||
embeds: [embed],
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const embed = await getServerInfo(client, interaction);
|
|
||||||
|
|
||||||
return interaction.editReply({
|
|
||||||
embeds: [embed],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {import("../../base/Client")} client
|
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
|
||||||
* @returns {Promise<import("discord.js").Embed>} Embed containing information about the guild
|
|
||||||
*/
|
|
||||||
async function getServerInfo(client, interaction) {
|
|
||||||
const { guild } = interaction;
|
|
||||||
|
|
||||||
await guild.members.fetch();
|
|
||||||
const owner = await guild.fetchOwner();
|
|
||||||
|
|
||||||
const embed = client.embed({
|
|
||||||
author: guild.name,
|
|
||||||
thumbnail: guild.iconURL(),
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: client.customEmojis.title + interaction.translate("common:NAME"),
|
|
||||||
value: guild.name,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.calendar + interaction.translate("common:CREATION"),
|
|
||||||
value: `<t:${Math.floor(guild.createdTimestamp / 1000)}:D>`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.users + interaction.translate("common:MEMBERS"),
|
|
||||||
value:
|
|
||||||
`${guild.members.cache.filter(m => !m.user.bot).size} ${client.functions.getNoun(
|
|
||||||
guild.members.cache.filter(m => !m.user.bot).size,
|
|
||||||
interaction.translate("misc:NOUNS:MEMBERS:1"),
|
|
||||||
interaction.translate("misc:NOUNS:MEMBERS:2"),
|
|
||||||
interaction.translate("misc:NOUNS:MEMBERS:5"),
|
|
||||||
)}` +
|
|
||||||
"\n" +
|
|
||||||
`${guild.members.cache.filter(m => m.user.bot).size} ${client.functions.getNoun(
|
|
||||||
guild.members.cache.filter(m => m.user.bot).size,
|
|
||||||
interaction.translate("misc:NOUNS:BOTS:1"),
|
|
||||||
interaction.translate("misc:NOUNS:BOTS:2"),
|
|
||||||
interaction.translate("misc:NOUNS:BOTS:5"),
|
|
||||||
)}`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.afk + interaction.translate("general/info:AFK_CHANNEL"),
|
|
||||||
value: guild.afkChannel?.toString() || interaction.translate("common:MISSING"),
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.id + interaction.translate("common:SERVER_ID"),
|
|
||||||
value: guild.id,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.crown + interaction.translate("common:OWNER"),
|
|
||||||
value: owner.toString(),
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.boost + interaction.translate("general/info:BOOSTS"),
|
|
||||||
value: guild.premiumSubscriptionCount?.toString() || "0",
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.channels + interaction.translate("common:CHANNELS"),
|
|
||||||
value:
|
|
||||||
`${guild.channels.cache.filter(c => c.type === ChannelType.GuildText).size} ${client.functions.getNoun(
|
|
||||||
guild.channels.cache.filter(c => c.type === ChannelType.GuildText).size,
|
|
||||||
interaction.translate("misc:NOUNS:TEXT:1"),
|
|
||||||
interaction.translate("misc:NOUNS:TEXT:2"),
|
|
||||||
interaction.translate("misc:NOUNS:TEXT:5"),
|
|
||||||
)}` +
|
|
||||||
"\n" +
|
|
||||||
`${guild.channels.cache.filter(c => c.type === ChannelType.GuildVoice).size} ${client.functions.getNoun(
|
|
||||||
guild.channels.cache.filter(c => c.type === ChannelType.GuildVoice).size,
|
|
||||||
interaction.translate("misc:NOUNS:VOICE:1"),
|
|
||||||
interaction.translate("misc:NOUNS:VOICE:2"),
|
|
||||||
interaction.translate("misc:NOUNS:VOICE:5"),
|
|
||||||
)}` +
|
|
||||||
"\n" +
|
|
||||||
`${guild.channels.cache.filter(c => c.type === ChannelType.GuildCategory).size} ${client.functions.getNoun(
|
|
||||||
guild.channels.cache.filter(c => c.type === ChannelType.GuildCategory).size,
|
|
||||||
interaction.translate("misc:NOUNS:CATEGORY:1"),
|
|
||||||
interaction.translate("misc:NOUNS:CATEGORY:2"),
|
|
||||||
interaction.translate("misc:NOUNS:CATEGORY:5"),
|
|
||||||
)}`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
return embed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {import("../../base/Client")} client
|
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
|
||||||
* @param {import("discord.js").Member} member
|
|
||||||
* @returns {import("discord.js").Embed} Embed containing information about the user
|
|
||||||
*/
|
|
||||||
function getUserInfo(client, interaction, member) {
|
|
||||||
const embed = client.embed({
|
|
||||||
author: {
|
|
||||||
name: `${member.user.getUsername()} (${member.id})`,
|
|
||||||
iconURL: member.displayAvatarURL(),
|
|
||||||
},
|
|
||||||
thumbnail: member.displayAvatarURL(),
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: ":man: " + interaction.translate("common:USERNAME"),
|
|
||||||
value: member.user.getUsername(),
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.pencil + " " + interaction.translate("common:NICKNAME"),
|
|
||||||
value: member.nickname || interaction.translate("general/info:NO_NICKNAME"),
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.bot + " " + interaction.translate("common:ROBOT"),
|
|
||||||
value: member.user.bot ? interaction.translate("common:YES") : interaction.translate("common:NO"),
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.calendar + " " + interaction.translate("common:CREATION"),
|
|
||||||
value: `<t:${Math.floor(member.user.createdTimestamp / 1000)}:D>`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.calendar2 + " " + interaction.translate("common:JOINED"),
|
|
||||||
value: `<t:${Math.floor(member.joinedTimestamp / 1000)}:D>`,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.color + " " + interaction.translate("common:COLOR"),
|
|
||||||
value: member.displayHexColor,
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: client.customEmojis.roles + " " + interaction.translate("common:ROLES"),
|
|
||||||
value:
|
|
||||||
member.roles.size > 10
|
|
||||||
? member.roles.cache.map(r => r).filter(r => r.id !== interaction.guild.roles.everyone.id).slice(0, 10).join(", ") + " " +
|
|
||||||
interaction.translate("general/info:MORE_ROLES", {
|
|
||||||
count: member.roles.cache.size - 10,
|
|
||||||
})
|
|
||||||
: member.roles.cache.size < 1 ? interaction.translate("general/info:NO_ROLE") : member.roles.cache.map(r => r).filter(r => r.id !== interaction.guild.roles.everyone.id).slice(0, 10).join(", "),
|
|
||||||
inline: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
return embed;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Info;
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
gamedig = require("gamedig");
|
gamedig = require("gamedig");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Minecraft extends BaseCommand {
|
||||||
uk: client.translate("general/minecraft:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/minecraft:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/minecraft:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/minecraft:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("ip")
|
.setName("ip")
|
||||||
|
@ -27,15 +26,6 @@ class Minecraft extends BaseCommand {
|
||||||
ru: client.translate("common:IP", null, "ru-RU"),
|
ru: client.translate("common:IP", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -48,7 +38,7 @@ class Minecraft extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply();
|
||||||
|
|
||||||
const ip = interaction.options.getString("ip");
|
const ip = interaction.options.getString("ip");
|
||||||
const options = {
|
const options = {
|
||||||
|
@ -65,7 +55,7 @@ class Minecraft extends BaseCommand {
|
||||||
let res = await gamedig.query(options).catch(() => {});
|
let res = await gamedig.query(options).catch(() => {});
|
||||||
|
|
||||||
if (!res) {
|
if (!res) {
|
||||||
options.type = "mbe";
|
options.type = "minecraftpe";
|
||||||
res = await gamedig.query(options).catch(() => {});
|
res = await gamedig.query(options).catch(() => {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Ping extends BaseCommand {
|
class Ping extends BaseCommand {
|
||||||
|
@ -15,17 +15,7 @@ class Ping extends BaseCommand {
|
||||||
uk: client.translate("general/ping:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/ping:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/ping:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/ping:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
@ -37,8 +27,6 @@ class Ping extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
|
||||||
|
|
||||||
const embed = client.embed({
|
const embed = client.embed({
|
||||||
author: {
|
author: {
|
||||||
name: interaction.translate("general/ping:PONG"),
|
name: interaction.translate("general/ping:PONG"),
|
||||||
|
@ -48,7 +36,7 @@ class Ping extends BaseCommand {
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
interaction.editReply({
|
interaction.reply({
|
||||||
embeds: [embed],
|
embeds: [embed],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
ms = require("ms");
|
ms = require("ms");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Remindme extends BaseCommand {
|
||||||
uk: client.translate("general/remindme:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/remindme:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/remindme:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/remindme:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("time")
|
.setName("time")
|
||||||
|
@ -51,12 +50,6 @@ class Remindme extends BaseCommand {
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: true });
|
await interaction.deferReply({ ephemeral: true });
|
||||||
|
|
||||||
const conditions = ["s", "m", "h", "d", "w", "y"],
|
|
||||||
time = interaction.options.getString("time"),
|
|
||||||
message = interaction.options.getString("message");
|
|
||||||
|
|
||||||
if (!conditions.some(s => time.includes(s))) return interaction.error("general/remindme:TIME", null, { edit: true });
|
|
||||||
|
|
||||||
const userData = interaction.data.user;
|
const userData = interaction.data.user;
|
||||||
|
|
||||||
if (!userData.reminds) userData.reminds = [];
|
if (!userData.reminds) userData.reminds = [];
|
||||||
|
@ -64,9 +57,9 @@ class Remindme extends BaseCommand {
|
||||||
const dateNow = Date.now();
|
const dateNow = Date.now();
|
||||||
|
|
||||||
const reminder = {
|
const reminder = {
|
||||||
message: message,
|
message: interaction.options.getString("message"),
|
||||||
createdAt: Math.floor(dateNow / 1000),
|
createdAt: Math.floor(dateNow / 1000),
|
||||||
sendAt: Math.floor((dateNow + ms(time)) / 1000),
|
sendAt: Math.floor((dateNow + ms(interaction.options.getString("time"))) / 1000),
|
||||||
};
|
};
|
||||||
|
|
||||||
userData.reminds.push(reminder);
|
userData.reminds.push(reminder);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Reminds extends BaseCommand {
|
class Reminds extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Reminds extends BaseCommand {
|
||||||
uk: client.translate("general/reminds:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/reminds:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/reminds:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/reminds:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
@ -29,129 +28,88 @@ class Reminds extends BaseCommand {
|
||||||
async onLoad(client) {
|
async onLoad(client) {
|
||||||
client.on("interactionCreate", async interaction => {
|
client.on("interactionCreate", async interaction => {
|
||||||
if (!interaction.isButton()) return;
|
if (!interaction.isButton()) return;
|
||||||
if (!interaction.customId.startsWith("reminds_")) return;
|
|
||||||
|
|
||||||
interaction.data = [];
|
if (interaction.customId.startsWith("reminds_")) {
|
||||||
interaction.data.guild = await client.getGuildData(interaction.guildId);
|
interaction.data = [];
|
||||||
interaction.data.user = await client.getUserData(interaction.user.id);
|
interaction.data.guild = await client.getGuildData(interaction.guildId);
|
||||||
|
interaction.data.user = await client.getUserData(interaction.user.id);
|
||||||
|
|
||||||
const reminds = interaction.data.user.reminds,
|
const reminds = interaction.data.user.reminds,
|
||||||
embeds = generateRemindsEmbeds(interaction, reminds);
|
embeds = generateRemindsEmbeds(interaction, reminds);
|
||||||
|
|
||||||
const row = new ActionRowBuilder().addComponents(
|
const row = new ActionRowBuilder().addComponents(
|
||||||
new ButtonBuilder().setCustomId("reminds_prev_page").setStyle(ButtonStyle.Primary).setEmoji("⬅️"),
|
new ButtonBuilder().setCustomId("reminds_prev_page").setStyle(ButtonStyle.Primary).setEmoji("⬅️"),
|
||||||
new ButtonBuilder().setCustomId("reminds_next_page").setStyle(ButtonStyle.Primary).setEmoji("➡️"),
|
new ButtonBuilder().setCustomId("reminds_next_page").setStyle(ButtonStyle.Primary).setEmoji("➡️"),
|
||||||
new ButtonBuilder().setCustomId("reminds_jump_page").setStyle(ButtonStyle.Secondary).setEmoji("↗️"),
|
new ButtonBuilder().setCustomId("reminds_jump_page").setStyle(ButtonStyle.Secondary).setEmoji("↗️"),
|
||||||
new ButtonBuilder().setCustomId("reminds_stop").setStyle(ButtonStyle.Danger).setEmoji("❌"),
|
new ButtonBuilder().setCustomId("reminds_stop").setStyle(ButtonStyle.Danger).setEmoji("❌"),
|
||||||
);
|
);
|
||||||
|
|
||||||
let currentPage = Number(interaction.message.content.match(/\d+/g)[0]) - 1 ?? 0;
|
let currentPage = Number(interaction.message.content.match(/\d+/g)[0]) - 1 ?? 0;
|
||||||
|
|
||||||
if (interaction.customId === "reminds_prev_page") {
|
if (interaction.customId === "reminds_prev_page") {
|
||||||
await interaction.deferUpdate();
|
await interaction.deferUpdate();
|
||||||
|
|
||||||
if (currentPage !== 0) {
|
|
||||||
--currentPage;
|
|
||||||
|
|
||||||
const row2 = new ActionRowBuilder().addComponents(embeds[currentPage].data._buttons);
|
|
||||||
|
|
||||||
interaction.editReply({
|
|
||||||
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
|
|
||||||
embeds: [embeds[currentPage]],
|
|
||||||
components: [row, row2],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (interaction.customId === "reminds_next_page") {
|
|
||||||
await interaction.deferUpdate();
|
|
||||||
|
|
||||||
if (currentPage < embeds.length - 1) {
|
|
||||||
currentPage++;
|
|
||||||
|
|
||||||
const row2 = new ActionRowBuilder().addComponents(embeds[currentPage].data._buttons);
|
|
||||||
|
|
||||||
interaction.editReply({
|
|
||||||
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
|
|
||||||
embeds: [embeds[currentPage]],
|
|
||||||
components: [row, row2],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (interaction.customId === "reminds_jump_page") {
|
|
||||||
await interaction.deferUpdate();
|
|
||||||
|
|
||||||
const msg = await interaction.followUp({
|
|
||||||
content: interaction.translate("misc:JUMP_TO_PAGE", {
|
|
||||||
length: embeds.length,
|
|
||||||
}),
|
|
||||||
fetchReply: true,
|
|
||||||
ephemeral: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const filter = res => {
|
|
||||||
return res.author.id === interaction.user.id && !isNaN(res.content);
|
|
||||||
};
|
|
||||||
|
|
||||||
interaction.channel.awaitMessages({ filter, max: 1, time: 10 * 1000 }).then(collected => {
|
|
||||||
if (embeds[collected.first().content - 1]) {
|
|
||||||
currentPage = collected.first().content - 1;
|
|
||||||
|
|
||||||
const row2 = new ActionRowBuilder().addComponents(embeds[currentPage].data._buttons);
|
|
||||||
|
|
||||||
|
if (currentPage !== 0) {
|
||||||
|
--currentPage;
|
||||||
interaction.editReply({
|
interaction.editReply({
|
||||||
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
|
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
|
||||||
embeds: [embeds[currentPage]],
|
embeds: [embeds[currentPage]],
|
||||||
components: [row, row2],
|
components: [row],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (collected.first().deletable) collected.first().delete();
|
|
||||||
if (msg.deletable) msg.delete();
|
|
||||||
} else {
|
|
||||||
if (collected.first().deletable) collected.first().delete();
|
|
||||||
if (msg.deletable) msg.delete();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
});
|
} else if (interaction.customId === "reminds_next_page") {
|
||||||
} else if (interaction.customId === "reminds_stop") {
|
await interaction.deferUpdate();
|
||||||
await interaction.deferUpdate();
|
|
||||||
|
|
||||||
row.components.forEach(component => {
|
if (currentPage < embeds.length - 1) {
|
||||||
component.setDisabled(true);
|
currentPage++;
|
||||||
});
|
interaction.editReply({
|
||||||
|
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
|
||||||
|
embeds: [embeds[currentPage]],
|
||||||
|
components: [row],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (interaction.customId === "reminds_jump_page") {
|
||||||
|
await interaction.deferUpdate();
|
||||||
|
|
||||||
return interaction.editReply({
|
const msg = await interaction.followUp({
|
||||||
components: [row],
|
content: interaction.translate("misc:JUMP_TO_PAGE", {
|
||||||
});
|
length: embeds.length,
|
||||||
} else if (interaction.customId.startsWith("reminds_delete_")) {
|
}),
|
||||||
await interaction.deferUpdate();
|
fetchReply: true,
|
||||||
|
});
|
||||||
|
|
||||||
const id = parseInt(interaction.customId.split("_")[2]);
|
const filter = res => {
|
||||||
const remindToDelete = reminds[id - 1];
|
return res.author.id === interaction.user.id && !isNaN(res.content);
|
||||||
|
};
|
||||||
|
|
||||||
interaction.data.user.reminds = reminds.filter(r => r.sendAt !== remindToDelete.sendAt);
|
interaction.channel.awaitMessages({ filter, max: 1, time: 10 * 1000 }).then(collected => {
|
||||||
|
if (embeds[collected.first().content - 1]) {
|
||||||
|
currentPage = collected.first().content - 1;
|
||||||
|
interaction.editReply({
|
||||||
|
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
|
||||||
|
embeds: [embeds[currentPage]],
|
||||||
|
components: [row],
|
||||||
|
});
|
||||||
|
|
||||||
await interaction.data.user.save();
|
if (collected.first().deletable) collected.first().delete();
|
||||||
|
if (msg.deletable) msg.delete();
|
||||||
|
} else {
|
||||||
|
if (collected.first().deletable) collected.first().delete();
|
||||||
|
if (msg.deletable) msg.delete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (interaction.customId === "reminds_stop") {
|
||||||
|
await interaction.deferUpdate();
|
||||||
|
|
||||||
const embeds = generateRemindsEmbeds(interaction, interaction.data.user.reminds);
|
row.components.forEach(component => {
|
||||||
|
component.setDisabled(true);
|
||||||
|
});
|
||||||
|
|
||||||
if (embeds.length === 0) return interaction.editReply({
|
return interaction.editReply({
|
||||||
content: interaction.translate("general/reminds:NO_REMINDS"),
|
components: [row],
|
||||||
embeds: [],
|
});
|
||||||
components: [],
|
}
|
||||||
});
|
|
||||||
|
|
||||||
embeds.length <= 5 ? currentPage = 0 : currentPage;
|
|
||||||
|
|
||||||
const row2 = new ActionRowBuilder().addComponents(embeds[currentPage].data._buttons);
|
|
||||||
|
|
||||||
await interaction.editReply({
|
|
||||||
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
|
|
||||||
embeds: [embeds[currentPage]],
|
|
||||||
components: [row, row2],
|
|
||||||
});
|
|
||||||
|
|
||||||
return interaction.followUp({
|
|
||||||
content: `${client.customEmojis.success} | ${interaction.translate("general/reminds:DELETED", { pos: id })}`,
|
|
||||||
ephemeral: true,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -176,12 +134,10 @@ class Reminds extends BaseCommand {
|
||||||
new ButtonBuilder().setCustomId("reminds_stop").setStyle(ButtonStyle.Danger).setEmoji("❌"),
|
new ButtonBuilder().setCustomId("reminds_stop").setStyle(ButtonStyle.Danger).setEmoji("❌"),
|
||||||
);
|
);
|
||||||
|
|
||||||
const buttonsRow = new ActionRowBuilder().addComponents(embeds[0].data._buttons);
|
|
||||||
|
|
||||||
await interaction.editReply({
|
await interaction.editReply({
|
||||||
content: `${interaction.translate("common:PAGE")}: **1**/**${embeds.length}**`,
|
content: `${interaction.translate("common:PAGE")}: **1**/**${embeds.length}**`,
|
||||||
embeds: [embeds[0]],
|
embeds: [embeds[0]],
|
||||||
components: [row, buttonsRow],
|
components: [row],
|
||||||
ephemeral: true,
|
ephemeral: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -212,21 +168,9 @@ function generateRemindsEmbeds(interaction, reminds) {
|
||||||
description: info,
|
description: info,
|
||||||
});
|
});
|
||||||
|
|
||||||
embed.data._buttons = [];
|
|
||||||
|
|
||||||
for (const key in current) {
|
|
||||||
embed.data._buttons.push(
|
|
||||||
new ButtonBuilder()
|
|
||||||
.setCustomId(`reminds_delete_${parseInt(key) + i + 1}`)
|
|
||||||
.setLabel(interaction.translate("general/reminds:DELETE", { pos: parseInt(key) + i + 1 }))
|
|
||||||
.setStyle(ButtonStyle.Danger),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
embeds.push(embed);
|
embeds.push(embed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return embeds;
|
return embeds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, parseEmoji, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, parseEmoji } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Report extends BaseCommand {
|
class Report extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Report extends BaseCommand {
|
||||||
uk: client.translate("general/report:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/report:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/report:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/report:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
.setName("user")
|
.setName("user")
|
||||||
|
@ -87,14 +86,14 @@ class Report extends BaseCommand {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
const cool = parseEmoji(client.customEmojis.cool).id;
|
const success = parseEmoji(client.customEmojis.cool).id;
|
||||||
const notcool = parseEmoji(client.customEmojis.notcool).id;
|
const error = parseEmoji(client.customEmojis.notcool).id;
|
||||||
|
|
||||||
repChannel.send({
|
repChannel.send({
|
||||||
embeds: [embed],
|
embeds: [embed],
|
||||||
}).then(async m => {
|
}).then(async m => {
|
||||||
await m.react(cool);
|
await m.react(success);
|
||||||
await m.react(notcool);
|
await m.react(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
interaction.success("general/report:SUCCESS", {
|
interaction.success("general/report:SUCCESS", {
|
||||||
|
|
121
commands/General/serverinfo.js
Normal file
121
commands/General/serverinfo.js
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
const { SlashCommandBuilder, ChannelType } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
class Serverinfo extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("serverinfo")
|
||||||
|
.setDescription(client.translate("general/serverinfo:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("general/serverinfo:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("general/serverinfo:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
const { guild } = interaction;
|
||||||
|
|
||||||
|
await guild.members.fetch();
|
||||||
|
const owner = await guild.fetchOwner();
|
||||||
|
|
||||||
|
const embed = client.embed({
|
||||||
|
author: guild.name,
|
||||||
|
thumbnail: guild.iconURL(),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: client.customEmojis.title + interaction.translate("common:NAME"),
|
||||||
|
value: guild.name,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.calendar + interaction.translate("common:CREATION"),
|
||||||
|
value: `<t:${guild.createdTimestamp}:D>`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.users + interaction.translate("common:MEMBERS"),
|
||||||
|
value:
|
||||||
|
`${guild.members.cache.filter(m => !m.user.bot).size} ${client.functions.getNoun(
|
||||||
|
guild.members.cache.filter(m => !m.user.bot).size,
|
||||||
|
interaction.translate("misc:NOUNS:MEMBERS:1"),
|
||||||
|
interaction.translate("misc:NOUNS:MEMBERS:2"),
|
||||||
|
interaction.translate("misc:NOUNS:MEMBERS:5"),
|
||||||
|
)}` +
|
||||||
|
"\n" +
|
||||||
|
`${guild.members.cache.filter(m => m.user.bot).size} ${client.functions.getNoun(
|
||||||
|
guild.members.cache.filter(m => m.user.bot).size,
|
||||||
|
interaction.translate("misc:NOUNS:BOTS:1"),
|
||||||
|
interaction.translate("misc:NOUNS:BOTS:2"),
|
||||||
|
interaction.translate("misc:NOUNS:BOTS:5"),
|
||||||
|
)}`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.afk + interaction.translate("general/serverinfo:AFK_CHANNEL"),
|
||||||
|
value: guild.afkChannel?.toString() || interaction.translate("common:MISSING"),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.id + interaction.translate("common:SERVER_ID"),
|
||||||
|
value: guild.id,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.crown + interaction.translate("common:OWNER"),
|
||||||
|
value: owner.toString(),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.boost + interaction.translate("general/serverinfo:BOOSTS"),
|
||||||
|
value: guild.premiumSubscriptionCount?.toString() || "0",
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.channels + interaction.translate("common:CHANNELS"),
|
||||||
|
value:
|
||||||
|
`${guild.channels.cache.filter(c => c.type === ChannelType.GuildText).size} ${client.functions.getNoun(
|
||||||
|
guild.channels.cache.filter(c => c.type === ChannelType.GuildText).size,
|
||||||
|
interaction.translate("misc:NOUNS:TEXT:1"),
|
||||||
|
interaction.translate("misc:NOUNS:TEXT:2"),
|
||||||
|
interaction.translate("misc:NOUNS:TEXT:5"),
|
||||||
|
)}` +
|
||||||
|
"\n" +
|
||||||
|
`${guild.channels.cache.filter(c => c.type === ChannelType.GuildVoice).size} ${client.functions.getNoun(
|
||||||
|
guild.channels.cache.filter(c => c.type === ChannelType.GuildVoice).size,
|
||||||
|
interaction.translate("misc:NOUNS:VOICE:1"),
|
||||||
|
interaction.translate("misc:NOUNS:VOICE:2"),
|
||||||
|
interaction.translate("misc:NOUNS:VOICE:5"),
|
||||||
|
)}` +
|
||||||
|
"\n" +
|
||||||
|
`${guild.channels.cache.filter(c => c.type === ChannelType.GuildCategory).size} ${client.functions.getNoun(
|
||||||
|
guild.channels.cache.filter(c => c.type === ChannelType.GuildCategory).size,
|
||||||
|
interaction.translate("misc:NOUNS:CATEGORY:1"),
|
||||||
|
interaction.translate("misc:NOUNS:CATEGORY:2"),
|
||||||
|
interaction.translate("misc:NOUNS:CATEGORY:5"),
|
||||||
|
)}`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.reply({
|
||||||
|
embeds: [embed],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Serverinfo;
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fetch = require("node-fetch");
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Shorturl extends BaseCommand {
|
||||||
uk: client.translate("general/shorturl:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/shorturl:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/shorturl:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/shorturl:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("url")
|
.setName("url")
|
||||||
|
@ -27,15 +26,6 @@ class Shorturl extends BaseCommand {
|
||||||
ru: client.translate("common:URL", null, "ru-RU"),
|
ru: client.translate("common:URL", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -48,22 +38,20 @@ class Shorturl extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply({ ephemeral: true });
|
||||||
|
|
||||||
const url = interaction.options.getString("url");
|
const url = interaction.options.getString("url");
|
||||||
const res = await fetch("https://i.jonnybro.ru/api/shorten", {
|
const res = await fetch("https://plsgo.ru/rest/v3/short-urls", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
Authorization: client.config.apiKeys.zipline,
|
"X-Api-Key": client.config.apiKeys.shlink,
|
||||||
},
|
},
|
||||||
body: JSON.stringify({ url: url }),
|
body: new URLSearchParams({ longUrl: url }),
|
||||||
}).then(res => res.json());
|
}).then(res => res.json());
|
||||||
|
|
||||||
console.log(res);
|
|
||||||
|
|
||||||
interaction.editReply({
|
interaction.editReply({
|
||||||
content: `<${res.url}>`,
|
content: `<${res.shortUrl}>`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, version: discordJsVersion, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField, version: djsVersion } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Stats extends BaseCommand {
|
class Stats extends BaseCommand {
|
||||||
|
@ -15,17 +15,7 @@ class Stats extends BaseCommand {
|
||||||
uk: client.translate("general/stats:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/stats:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/stats:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/stats:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
@ -37,13 +27,13 @@ class Stats extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
const hiddenGuildMembersCount = client.guilds.cache.get("568120814776614924").memberCount;
|
||||||
|
const servers = client.guilds.cache.size - 1;
|
||||||
const servers = client.guilds.cache.size;
|
|
||||||
let users = 0;
|
let users = 0;
|
||||||
client.guilds.cache.forEach(g => {
|
client.guilds.cache.forEach(g => {
|
||||||
users += g.memberCount;
|
users += g.memberCount;
|
||||||
});
|
});
|
||||||
|
users = users - hiddenGuildMembersCount;
|
||||||
|
|
||||||
const embed = client.embed({
|
const embed = client.embed({
|
||||||
author: interaction.translate("common:STATS"),
|
author: interaction.translate("common:STATS"),
|
||||||
|
@ -59,7 +49,7 @@ class Stats extends BaseCommand {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: client.customEmojis.version + " " + interaction.translate("general/stats:VERSIONS_TITLE"),
|
name: client.customEmojis.version + " " + interaction.translate("general/stats:VERSIONS_TITLE"),
|
||||||
value: `\`Discord.js: v${discordJsVersion}\`\n\`Nodejs: v${process.versions.node}\``,
|
value: `\`Discord.js: v${djsVersion}\`\n\`Nodejs: v${process.versions.node}\``,
|
||||||
inline: true,
|
inline: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -94,13 +84,14 @@ class Stats extends BaseCommand {
|
||||||
dashboardLink: client.config.dashboard.domain,
|
dashboardLink: client.config.dashboard.domain,
|
||||||
supportLink: "https://discord.gg/Ptkj2n9nzZ",
|
supportLink: "https://discord.gg/Ptkj2n9nzZ",
|
||||||
inviteLink: client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [PermissionsBitField.Flags.Administrator] }),
|
inviteLink: client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [PermissionsBitField.Flags.Administrator] }),
|
||||||
|
donateLink: "https://www.donationalerts.com/r/jonny_bro",
|
||||||
owner: client.config.owner.id,
|
owner: client.config.owner.id,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
interaction.editReply({
|
interaction.reply({
|
||||||
embeds: [embed],
|
embeds: [embed],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, parseEmoji, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, parseEmoji } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Suggest extends BaseCommand {
|
class Suggest extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Suggest extends BaseCommand {
|
||||||
uk: client.translate("general/suggest:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/suggest:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/suggest:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/suggest:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("message")
|
.setName("message")
|
||||||
|
|
99
commands/General/userinfo.js
Normal file
99
commands/General/userinfo.js
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
class Userinfo extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("userinfo")
|
||||||
|
.setDescription(client.translate("general/userinfo:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("general/userinfo:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("general/userinfo:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false)
|
||||||
|
.addUserOption(option =>
|
||||||
|
option
|
||||||
|
.setName("user")
|
||||||
|
.setDescription(client.translate("common:USER"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("common:USER", null, "uk-UA"),
|
||||||
|
ru: client.translate("common:USER", null, "ru-RU"),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
* @param {Object} data
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
const member = interaction.options.getMember("user") || interaction.member;
|
||||||
|
|
||||||
|
const embed = client.embed({
|
||||||
|
author: {
|
||||||
|
name: `${member.user.getUsername()} (${member.id})`,
|
||||||
|
iconURL: member.displayAvatarURL(),
|
||||||
|
},
|
||||||
|
thumbnail: member.displayAvatarURL(),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: ":man: " + interaction.translate("common:USERNAME"),
|
||||||
|
value: member.user.getUsername(),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.pencil + " " + interaction.translate("common:NICKNAME"),
|
||||||
|
value: member.nickname || interaction.translate("general/userinfo:NO_NICKNAME"),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.bot + " " + interaction.translate("common:ROBOT"),
|
||||||
|
value: member.user.bot ? interaction.translate("common:YES") : interaction.translate("common:NO"),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.calendar + " " + interaction.translate("common:CREATION"),
|
||||||
|
value: `<t:${member.user.createdTimestamp}:D>`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.calendar2 + " " + interaction.translate("common:JOINED"),
|
||||||
|
value: `<t:${member.joinedTimestamp}:D>`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.color + " " + interaction.translate("common:COLOR"),
|
||||||
|
value: member.displayHexColor,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: client.customEmojis.roles + " " + interaction.translate("common:ROLES"),
|
||||||
|
value:
|
||||||
|
member.roles.size > 10
|
||||||
|
? member.roles.cache.map(r => r).filter(r => r.id !== interaction.guild.roles.everyone.id).slice(0, 10).join(", ") + " " +
|
||||||
|
interaction.translate("general/userinfo:MORE_ROLES", {
|
||||||
|
count: member.roles.cache.size - 10,
|
||||||
|
})
|
||||||
|
: member.roles.cache.size < 1 ? interaction.translate("general/userinfo:NO_ROLE") : member.roles.cache.map(r => r).filter(r => r.id !== interaction.guild.roles.everyone.id).slice(0, 10).join(", "),
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.reply({
|
||||||
|
embeds: [embed],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Userinfo;
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fetch = require("node-fetch");
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Whois extends BaseCommand {
|
||||||
uk: client.translate("general/whois:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("general/whois:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("general/whois:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("general/whois:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("ip")
|
.setName("ip")
|
||||||
|
@ -27,15 +26,6 @@ class Whois extends BaseCommand {
|
||||||
ru: client.translate("common:IP", null, "ru-RU"),
|
ru: client.translate("common:IP", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setRequired(true),
|
.setRequired(true),
|
||||||
)
|
|
||||||
.addBooleanOption(option =>
|
|
||||||
option
|
|
||||||
.setName("ephemeral")
|
|
||||||
.setDescription(client.translate("misc:EPHEMERAL_RESPONSE"))
|
|
||||||
.setDescriptionLocalizations({
|
|
||||||
uk: client.translate("misc:EPHEMERAL_RESPONSE", null, "uk-UA"),
|
|
||||||
ru: client.translate("misc:EPHEMERAL_RESPONSE", null, "ru-RU"),
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -48,12 +38,12 @@ class Whois extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: interaction.options.getBoolean("ephemeral") || false });
|
await interaction.deferReply();
|
||||||
|
|
||||||
const ip = interaction.options.getString("ip"),
|
const ip = interaction.options.getString("ip"),
|
||||||
whois = await fetch(`http://ip-api.com/json/${ip}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json());
|
whois = await fetch(`http://ip-api.com/json/${ip}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json());
|
||||||
|
|
||||||
if (whois.status === "fail") return interaction.error("general/whois:ERROR", { ip }, { edit: true });
|
if (whois.status === "fail") return interaction.editReply({ content: interaction.translate("general/whois:ERROR", { ip }) });
|
||||||
|
|
||||||
const embed = client.embed({
|
const embed = client.embed({
|
||||||
title: interaction.translate("general/whois:INFO_ABOUT", {
|
title: interaction.translate("general/whois:INFO_ABOUT", {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fetch = require("node-fetch"),
|
fetch = require("node-fetch"),
|
||||||
moment = require("moment");
|
moment = require("moment");
|
||||||
|
@ -17,8 +17,7 @@ class Checkjar extends BaseCommand {
|
||||||
uk: client.translate("iat/checkjar:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("iat/checkjar:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("iat/checkjar:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("iat/checkjar:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Clear extends BaseCommand {
|
class Clear extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Clear extends BaseCommand {
|
||||||
uk: client.translate("moderation/clear:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("moderation/clear:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("moderation/clear:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("moderation/clear:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
|
@ -118,7 +117,7 @@ class Clear extends BaseCommand {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (isNaN(option) || parseInt(option) < 1) return interaction.error("misc:OPTION_NAN_ALL", null, { edit: true });
|
if (isNaN(option) || parseInt(option) < 1) return interaction.error("misc:OPTION_NAN_ALL", null, { ephemeral: true });
|
||||||
|
|
||||||
let messages = await interaction.channel.messages.fetch({ limit: option });
|
let messages = await interaction.channel.messages.fetch({ limit: option });
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Clearwarns extends BaseCommand {
|
class Clearwarns extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Clearwarns extends BaseCommand {
|
||||||
uk: client.translate("moderation/clearwarns:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("moderation/clearwarns:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("moderation/clearwarns:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("moderation/clearwarns:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
|
@ -40,7 +39,6 @@ class Clearwarns extends BaseCommand {
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
const member = interaction.options.getMember("user");
|
const member = interaction.options.getMember("user");
|
||||||
if (member.user.id === interaction.user.id) return interaction.error("misc:CANT_YOURSELF");
|
|
||||||
|
|
||||||
const memberData = await client.getMemberData(member.id, interaction.guildId);
|
const memberData = await client.getMemberData(member.id, interaction.guildId);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
ms = require("ms");
|
ms = require("ms");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Giveaway extends BaseCommand {
|
||||||
uk: client.translate("moderation/giveaway:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("moderation/giveaway:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("moderation/giveaway:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("moderation/giveaway:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
.addSubcommand(subcommand =>
|
.addSubcommand(subcommand =>
|
||||||
subcommand
|
subcommand
|
||||||
|
|
119
commands/Moderation/poll.js
Normal file
119
commands/Moderation/poll.js
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionsBitField } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
class Poll extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("poll")
|
||||||
|
.setDescription(client.translate("moderation/poll:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("moderation/poll:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("moderation/poll:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false)
|
||||||
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
|
.addStringOption(option =>
|
||||||
|
option
|
||||||
|
.setName("question")
|
||||||
|
.setDescription(client.translate("moderation/poll:QUESTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("moderation/poll:QUESTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("moderation/poll:QUESTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setRequired(true),
|
||||||
|
),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
const question = interaction.options.getString("question");
|
||||||
|
|
||||||
|
const row = new ActionRowBuilder().addComponents(
|
||||||
|
new ButtonBuilder().setCustomId("poll_everyone").setLabel("@everyone").setStyle(ButtonStyle.Primary),
|
||||||
|
new ButtonBuilder().setCustomId("poll_here").setLabel("@here").setStyle(ButtonStyle.Primary),
|
||||||
|
new ButtonBuilder().setCustomId("poll_nothing").setLabel(interaction.translate("moderation/poll:NOTHING")).setStyle(ButtonStyle.Primary),
|
||||||
|
new ButtonBuilder().setCustomId("poll_cancel").setLabel(interaction.translate("common:CANCEL")).setStyle(ButtonStyle.Danger),
|
||||||
|
);
|
||||||
|
|
||||||
|
await interaction.reply({
|
||||||
|
content: interaction.translate("moderation/poll:SELECT_MENTION"),
|
||||||
|
ephemeral: true,
|
||||||
|
components: [row],
|
||||||
|
});
|
||||||
|
|
||||||
|
let mention = null;
|
||||||
|
const filter = i => i.user.id === interaction.user.id;
|
||||||
|
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: 15 * 1000 });
|
||||||
|
|
||||||
|
collector.on("collect", async i => {
|
||||||
|
if (i.isButton()) {
|
||||||
|
if (i.customId === "poll_everyone") {
|
||||||
|
mention = "||@everyone||";
|
||||||
|
i.update({
|
||||||
|
content: interaction.translate("moderation/poll:POLL_SENDED"),
|
||||||
|
components: [],
|
||||||
|
});
|
||||||
|
} else if (i.customId === "poll_here") {
|
||||||
|
mention = "||@here||";
|
||||||
|
i.update({
|
||||||
|
content: interaction.translate("moderation/poll:POLL_SENDED"),
|
||||||
|
components: [],
|
||||||
|
});
|
||||||
|
} else if (i.customId === "poll_nothing") {
|
||||||
|
mention = null;
|
||||||
|
i.update({
|
||||||
|
content: interaction.translate("moderation/poll:POLL_SENDED"),
|
||||||
|
components: [],
|
||||||
|
});
|
||||||
|
} else if (i.customId === "poll_cancel") {
|
||||||
|
return i.update({
|
||||||
|
content: interaction.translate("misc:SELECT_CANCELED"),
|
||||||
|
components: [],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const cool = client.emojis.cache.find(e => e.name === client.customEmojis.cool.split(":")[1]);
|
||||||
|
const notcool = client.emojis.cache.find(e => e.name === client.customEmojis.notcool.split(":")[1]);
|
||||||
|
|
||||||
|
const embed = client.embed({
|
||||||
|
author: interaction.translate("moderation/poll:TITLE"),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: "\u200B",
|
||||||
|
value: question,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "\u200B",
|
||||||
|
value: interaction.translate("moderation/poll:REACT", {
|
||||||
|
success: cool.toString(),
|
||||||
|
error: notcool.toString(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
return interaction.channel.send({
|
||||||
|
content: mention,
|
||||||
|
embeds: [embed],
|
||||||
|
}).then(async m => {
|
||||||
|
await m.react(cool);
|
||||||
|
await m.react(notcool);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Poll;
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Unban extends BaseCommand {
|
class Unban extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Unban extends BaseCommand {
|
||||||
uk: client.translate("moderation/unban:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("moderation/unban:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("moderation/unban:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("moderation/unban:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Ban extends BaseCommand {
|
class Ban extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Ban extends BaseCommand {
|
||||||
uk: client.translate("moderation/untimeout:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("moderation/untimeout:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("moderation/untimeout:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("moderation/untimeout:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ModerateMembers)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ModerateMembers)
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
|
@ -45,7 +44,7 @@ class Ban extends BaseCommand {
|
||||||
timedout = member.isCommunicationDisabled();
|
timedout = member.isCommunicationDisabled();
|
||||||
|
|
||||||
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
|
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
|
||||||
if (member.id === interaction.member.id) return interaction.error("misc:CANT_YOURSELF", null, { ephemeral: true, edit: true });
|
if (member.id === interaction.member.id) return interaction.error("moderation/untimeout:YOURSELF", null, { ephemeral: true, edit: true });
|
||||||
if (!timedout) return interaction.error("moderation/untimeout:NOT_TIMEDOUT", null, { ephemeral: true, edit: true });
|
if (!timedout) return interaction.error("moderation/untimeout:NOT_TIMEDOUT", null, { ephemeral: true, edit: true });
|
||||||
|
|
||||||
await member.timeout(null);
|
await member.timeout(null);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { ContextMenuCommandBuilder, ModalBuilder, ActionRowBuilder, TextInputBuilder, ApplicationCommandType, PermissionsBitField, TextInputStyle, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { ContextMenuCommandBuilder, ModalBuilder, ActionRowBuilder, TextInputBuilder, ApplicationCommandType, PermissionsBitField, TextInputStyle } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class WarnContext extends BaseCommand {
|
class WarnContext extends BaseCommand {
|
||||||
|
@ -11,8 +11,7 @@ class WarnContext extends BaseCommand {
|
||||||
command: new ContextMenuCommandBuilder()
|
command: new ContextMenuCommandBuilder()
|
||||||
.setName("Give Warn")
|
.setName("Give Warn")
|
||||||
.setType(ApplicationCommandType.User)
|
.setType(ApplicationCommandType.User)
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages),
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
@ -30,7 +29,7 @@ class WarnContext extends BaseCommand {
|
||||||
moderationPosition = interaction.member.roles.highest.position;
|
moderationPosition = interaction.member.roles.highest.position;
|
||||||
|
|
||||||
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true });
|
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true });
|
||||||
if (member.id === interaction.member.id) return interaction.error("misc:CANT_YOURSELF", null, { ephemeral: true });
|
if (member.id === interaction.member.id) return interaction.error("moderation/warn:YOURSELF", null, { ephemeral: true });
|
||||||
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/warn:SUPERIOR", null, { ephemeral: true });
|
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/warn:SUPERIOR", null, { ephemeral: true });
|
||||||
|
|
||||||
const memberData = await client.getMemberData(member.id, interaction.guildId);
|
const memberData = await client.getMemberData(member.id, interaction.guildId);
|
||||||
|
@ -67,6 +66,11 @@ class WarnContext extends BaseCommand {
|
||||||
|
|
||||||
if (submitted) {
|
if (submitted) {
|
||||||
const reason = submitted.fields.getTextInputValue("warn_reason");
|
const reason = submitted.fields.getTextInputValue("warn_reason");
|
||||||
|
|
||||||
|
// const sanctions = memberData.sanctions.filter(s => s.type === "warn").length;
|
||||||
|
// const banCount = data.guildData.plugins.warnsSanctions.ban;
|
||||||
|
// const kickCount = data.guildData.plugins.warnsSanctions.kick;
|
||||||
|
|
||||||
const caseInfo = {
|
const caseInfo = {
|
||||||
moderator: interaction.member.id,
|
moderator: interaction.member.id,
|
||||||
date: Date.now(),
|
date: Date.now(),
|
||||||
|
@ -93,6 +97,67 @@ class WarnContext extends BaseCommand {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (banCount) {
|
||||||
|
if (sanctions >= banCount) {
|
||||||
|
member.send({
|
||||||
|
content: interaction.translate("moderation/ban:BANNED_DM", {
|
||||||
|
user: member.user,
|
||||||
|
moderator: interaction.user.getUsername(),
|
||||||
|
server: interaction.guild.name,
|
||||||
|
reason,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
caseInfo.type = "ban";
|
||||||
|
|
||||||
|
embed
|
||||||
|
.setAuthor({
|
||||||
|
name: interaction.translate("moderation/warn:BAN"),
|
||||||
|
})
|
||||||
|
.setColor(client.config.embed.color);
|
||||||
|
|
||||||
|
interaction.guild.members.ban(member).catch(() => {});
|
||||||
|
|
||||||
|
interaction.followUp({
|
||||||
|
content: interaction.translate("moderation/setwarns:AUTO_BAN", {
|
||||||
|
user: member.user.getUsername(),
|
||||||
|
count: `${banCount} ${client.functions.getNoun(banCount, interaction.translate("misc:NOUNS:WARNS:1"), interaction.translate("misc:NOUNS:WARNS:2"), interaction.translate("misc:NOUNS:WARNS:5"))}`,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kickCount) {
|
||||||
|
if (sanctions >= kickCount) {
|
||||||
|
member.send({
|
||||||
|
content: interaction.translate("moderation/kick:KICKED_DM", {
|
||||||
|
user: member.user,
|
||||||
|
moderator: interaction.user.getUsername(),
|
||||||
|
server: interaction.guild.name,
|
||||||
|
reason,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
caseInfo.type = "kick";
|
||||||
|
|
||||||
|
embed
|
||||||
|
.setAuthor({
|
||||||
|
name: interaction.translate("moderation/warn:KICK"),
|
||||||
|
})
|
||||||
|
.setColor(client.config.embed.color);
|
||||||
|
|
||||||
|
member.kick().catch(() => {});
|
||||||
|
|
||||||
|
interaction.followUp({
|
||||||
|
content: interaction.translate("moderation/setwarns:AUTO_KICK", {
|
||||||
|
user: member.user.getUsername(),
|
||||||
|
count: `${kickCount} ${client.functions.getNoun(kickCount, interaction.translate("misc:NOUNS:WARNS:1"), interaction.translate("misc:NOUNS:WARNS:2"), interaction.translate("misc:NOUNS:WARNS:5"))}`,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await member.send({
|
await member.send({
|
||||||
content: interaction.translate("moderation/warn:WARNED_DM", {
|
content: interaction.translate("moderation/warn:WARNED_DM", {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Warns extends BaseCommand {
|
class Warns extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Warns extends BaseCommand {
|
||||||
uk: client.translate("moderation/warns:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("moderation/warns:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("moderation/warns:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("moderation/warns:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Back extends BaseCommand {
|
class Back extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Back extends BaseCommand {
|
||||||
uk: client.translate("music/back:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/back:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/back:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/back:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js"),
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js"),
|
||||||
{ QueryType } = require("discord-player");
|
{ QueryType } = require("discord-player");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fs = require("fs");
|
fs = require("fs");
|
||||||
|
@ -17,8 +17,7 @@ class Clips extends BaseCommand {
|
||||||
uk: client.translate("music/clips:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/clips:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/clips:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/clips:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("query")
|
.setName("query")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js"),
|
const { SlashCommandBuilder } = require("discord.js"),
|
||||||
{ QueueRepeatMode } = require("discord-player");
|
{ QueueRepeatMode } = require("discord-player");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Loop extends BaseCommand {
|
||||||
uk: client.translate("music/loop:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/loop:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/loop:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/loop:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("option")
|
.setName("option")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js"),
|
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder, StringSelectMenuOptionBuilder } = require("discord.js"),
|
||||||
{ QueueRepeatMode } = require("discord-player");
|
{ QueueRepeatMode } = require("discord-player");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Nowplaying extends BaseCommand {
|
||||||
uk: client.translate("music/nowplaying:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/nowplaying:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/nowplaying:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/nowplaying:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { ContextMenuCommandBuilder, ApplicationCommandType, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { ContextMenuCommandBuilder, ApplicationCommandType, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class PlayContext extends BaseCommand {
|
class PlayContext extends BaseCommand {
|
||||||
|
@ -11,8 +11,7 @@ class PlayContext extends BaseCommand {
|
||||||
command: new ContextMenuCommandBuilder()
|
command: new ContextMenuCommandBuilder()
|
||||||
.setName("Add to Queue")
|
.setName("Add to Queue")
|
||||||
.setType(ApplicationCommandType.Message)
|
.setType(ApplicationCommandType.Message)
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
@ -41,6 +40,8 @@ class PlayContext extends BaseCommand {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!searchResult.hasTracks()) {
|
if (!searchResult.hasTracks()) {
|
||||||
|
console.log(searchResult);
|
||||||
|
|
||||||
return interaction.error("music/play:NO_RESULT", { query }, { edit: true });
|
return interaction.error("music/play:NO_RESULT", { query }, { edit: true });
|
||||||
} else {
|
} else {
|
||||||
await client.player.play(voice, searchResult, {
|
await client.player.play(voice, searchResult, {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js"),
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js"),
|
||||||
{ QueryType } = require("discord-player");
|
{ QueryType } = require("discord-player");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class Play extends BaseCommand {
|
||||||
uk: client.translate("music/play:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/play:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/play:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/play:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("query")
|
.setName("query")
|
||||||
|
@ -50,11 +49,14 @@ class Play extends BaseCommand {
|
||||||
if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return interaction.error("music/play:VOICE_CHANNEL_CONNECT", null, { edit: true });
|
if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return interaction.error("music/play:VOICE_CHANNEL_CONNECT", null, { edit: true });
|
||||||
|
|
||||||
const searchResult = await client.player.search(query, {
|
const searchResult = await client.player.search(query, {
|
||||||
requestedBy: interaction.member,
|
requestedBy: interaction.user,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!searchResult.hasTracks()) return interaction.error("music/play:NO_RESULT", { query }, { edit: true, ephemeral: true });
|
if (!searchResult.hasTracks()) {
|
||||||
else {
|
console.log(searchResult);
|
||||||
|
|
||||||
|
return interaction.error("music/play:NO_RESULT", { query }, { edit: true });
|
||||||
|
} else {
|
||||||
await client.player.play(voice, searchResult, {
|
await client.player.play(voice, searchResult, {
|
||||||
nodeOptions: {
|
nodeOptions: {
|
||||||
metadata: interaction,
|
metadata: interaction,
|
||||||
|
@ -83,8 +85,7 @@ class Play extends BaseCommand {
|
||||||
*/
|
*/
|
||||||
async autocompleteRun(client, interaction) {
|
async autocompleteRun(client, interaction) {
|
||||||
const query = interaction.options.getString("query");
|
const query = interaction.options.getString("query");
|
||||||
if (query === "" || query === null) return interaction.respond([ { name: "No Query Provided", value: "" } ]);
|
if (query === "" || query === null) return;
|
||||||
if (query.startsWith("http")) return interaction.respond([ { name: "Current Link", value: query } ]);
|
|
||||||
|
|
||||||
const youtubeResults = await client.player.search(query, { searchEngine: QueryType.YOUTUBE });
|
const youtubeResults = await client.player.search(query, { searchEngine: QueryType.YOUTUBE });
|
||||||
const spotifyResults = await client.player.search(query, { searchEngine: QueryType.SPOTIFY_SEARCH });
|
const spotifyResults = await client.player.search(query, { searchEngine: QueryType.SPOTIFY_SEARCH });
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, ButtonBuilder, ButtonStyle, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Queue extends BaseCommand {
|
class Queue extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Queue extends BaseCommand {
|
||||||
uk: client.translate("music/queue:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/queue:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/queue:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/queue:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Seek extends BaseCommand {
|
class Seek extends BaseCommand {
|
||||||
|
@ -15,8 +15,6 @@ class Seek extends BaseCommand {
|
||||||
uk: client.translate("music/seek:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/seek:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/seek:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/seek:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addIntegerOption(option =>
|
.addIntegerOption(option =>
|
||||||
option
|
option
|
||||||
.setName("time")
|
.setName("time")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Shuffle extends BaseCommand {
|
class Shuffle extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Shuffle extends BaseCommand {
|
||||||
uk: client.translate("music/shuffle:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/shuffle:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/shuffle:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/shuffle:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Skip extends BaseCommand {
|
class Skip extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Skip extends BaseCommand {
|
||||||
uk: client.translate("music/skip:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/skip:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/skip:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/skip:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addIntegerOption(option =>
|
.addIntegerOption(option =>
|
||||||
option
|
option
|
||||||
.setName("position")
|
.setName("position")
|
||||||
|
@ -24,7 +23,8 @@ class Skip extends BaseCommand {
|
||||||
.setDescriptionLocalizations({
|
.setDescriptionLocalizations({
|
||||||
uk: client.translate("music/skip:POSITION", null, "uk-UA"),
|
uk: client.translate("music/skip:POSITION", null, "uk-UA"),
|
||||||
ru: client.translate("music/skip:POSITION", null, "ru-RU"),
|
ru: client.translate("music/skip:POSITION", null, "ru-RU"),
|
||||||
}),
|
})
|
||||||
|
.setRequired(false),
|
||||||
),
|
),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Stop extends BaseCommand {
|
class Stop extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Stop extends BaseCommand {
|
||||||
uk: client.translate("music/stop:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/stop:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/stop:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/stop:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false),
|
||||||
.setContexts([InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Volume extends BaseCommand {
|
class Volume extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Volume extends BaseCommand {
|
||||||
uk: client.translate("music/volume:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("music/volume:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("music/volume:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("music/volume:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addIntegerOption(option =>
|
.addIntegerOption(option =>
|
||||||
option
|
option
|
||||||
.setName("int")
|
.setName("int")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, StringSelectMenuBuilder, AttachmentBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, StringSelectMenuBuilder, AttachmentBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
fetch = require("node-fetch");
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
@ -16,8 +16,7 @@ class NSFW extends BaseCommand {
|
||||||
uk: client.translate("nsfw/nsfw:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("nsfw/nsfw:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("nsfw/nsfw:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("nsfw/nsfw:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
|
@ -39,7 +38,7 @@ class NSFW extends BaseCommand {
|
||||||
|
|
||||||
const tag = interaction?.values[0],
|
const tag = interaction?.values[0],
|
||||||
splitted = tag.split("_"),
|
splitted = tag.split("_"),
|
||||||
res = await fetch(`https://nsfw-api.jonnybro.ru/media/${splitted[0].charAt(0).toLowerCase()}/${splitted[1].toLowerCase()}`).then(async r => await r.buffer()),
|
res = await fetch(`https://nsfw-api.jababot.ru/media/${splitted[0].charAt(0).toLowerCase()}/${splitted[1].toLowerCase()}`).then(async r => await r.buffer()),
|
||||||
image = new AttachmentBuilder(res, { name: "image.jpeg" });
|
image = new AttachmentBuilder(res, { name: "image.jpeg" });
|
||||||
|
|
||||||
const embed = client.embed({
|
const embed = client.embed({
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Debug extends BaseCommand {
|
class Debug extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Debug extends BaseCommand {
|
||||||
uk: client.translate("owner/debug:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("owner/debug:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("owner/debug:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("owner/debug:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addSubcommand(subcommand =>
|
.addSubcommand(subcommand =>
|
||||||
subcommand
|
subcommand
|
||||||
.setName("set")
|
.setName("set")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Eval extends BaseCommand {
|
class Eval extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Eval extends BaseCommand {
|
||||||
uk: client.translate("owner/eval:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("owner/eval:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("owner/eval:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("owner/eval:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("code")
|
.setName("code")
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand"),
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
i18next = require("i18next");
|
i18next = require("i18next");
|
||||||
|
// autoUpdateDocs = require("../../helpers/autoUpdateDocs");
|
||||||
|
|
||||||
class Reload extends BaseCommand {
|
class Reload extends BaseCommand {
|
||||||
/**
|
/**
|
||||||
|
@ -16,8 +17,7 @@ class Reload extends BaseCommand {
|
||||||
uk: client.translate("owner/reload:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("owner/reload:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("owner/reload:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("owner/reload:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true)
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("command")
|
.setName("command")
|
||||||
|
@ -40,21 +40,19 @@ class Reload extends BaseCommand {
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
*/
|
*/
|
||||||
async execute(client, interaction) {
|
async execute(client, interaction) {
|
||||||
await interaction.deferReply({ ephemeral: true });
|
|
||||||
|
|
||||||
const command = interaction.options.getString("command"),
|
const command = interaction.options.getString("command"),
|
||||||
cmd = client.commands.get(command);
|
cmd = client.commands.get(command);
|
||||||
if (!cmd) return interaction.error("owner/reload:NOT_FOUND", { command }, { ephemeral: true });
|
if (!cmd) return interaction.error("owner/reload:NOT_FOUND", { command }, { ephemeral: true });
|
||||||
|
|
||||||
client.unloadCommand(`../commands/${cmd.category}`, cmd.command.name);
|
await client.unloadCommand(`../commands/${cmd.category}`, cmd.command.name);
|
||||||
|
|
||||||
await client.loadCommand(`../commands/${cmd.category}`, cmd.command.name);
|
await client.loadCommand(`../commands/${cmd.category}`, cmd.command.name);
|
||||||
|
|
||||||
i18next.reloadResources(["ru-RU", "uk-UA", "en-US"]);
|
i18next.reloadResources(["ru-RU", "uk-UA", "en-US"]);
|
||||||
|
// autoUpdateDocs.update(client);
|
||||||
|
|
||||||
interaction.success("owner/reload:SUCCESS", {
|
interaction.success("owner/reload:SUCCESS", {
|
||||||
command: cmd.command.name,
|
command: cmd.command.name,
|
||||||
}, { edit: true });
|
}, { ephemeral: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Say extends BaseCommand {
|
class Say extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Say extends BaseCommand {
|
||||||
uk: client.translate("owner/say:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("owner/say:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("owner/say:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("owner/say:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.addStringOption(option =>
|
.addStringOption(option =>
|
||||||
option
|
option
|
||||||
.setName("message")
|
.setName("message")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class Servers extends BaseCommand {
|
class Servers extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class Servers extends BaseCommand {
|
||||||
uk: client.translate("owner/servers:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("owner/servers:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("owner/servers:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("owner/servers:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall, ApplicationIntegrationType.UserInstall])
|
.setDMPermission(true),
|
||||||
.setContexts([InteractionContextType.BotDM, InteractionContextType.PrivateChannel, InteractionContextType.Guild]),
|
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: true,
|
ownerOnly: true,
|
||||||
});
|
});
|
||||||
|
@ -31,7 +30,7 @@ class Servers extends BaseCommand {
|
||||||
await interaction.deferReply({ ephemeral: true });
|
await interaction.deferReply({ ephemeral: true });
|
||||||
|
|
||||||
let currentPage = 0;
|
let currentPage = 0;
|
||||||
const embeds = generateGuildsEmbeds(interaction, client.guilds.cache);
|
const embeds = generateServersEmbeds(interaction, client.guilds.cache);
|
||||||
|
|
||||||
const row = new ActionRowBuilder().addComponents(
|
const row = new ActionRowBuilder().addComponents(
|
||||||
new ButtonBuilder().setCustomId("servers_prev_page").setStyle(ButtonStyle.Primary).setEmoji("⬅️"),
|
new ButtonBuilder().setCustomId("servers_prev_page").setStyle(ButtonStyle.Primary).setEmoji("⬅️"),
|
||||||
|
@ -94,15 +93,15 @@ class Servers extends BaseCommand {
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
* @param {Array[import("discord.js").Guild]} guilds
|
* @param {Array} servers
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
function generateGuildsEmbeds(interaction, guilds) {
|
function generateServersEmbeds(interaction, servers) {
|
||||||
const embeds = [];
|
const embeds = [];
|
||||||
let k = 10;
|
let k = 10;
|
||||||
|
|
||||||
for (let i = 0; i < guilds.size; i += 10) {
|
for (let i = 0; i < servers.size; i += 10) {
|
||||||
const current = guilds
|
const current = servers
|
||||||
.sort((a, b) => b.memberCount - a.memberCount)
|
.sort((a, b) => b.memberCount - a.memberCount)
|
||||||
.map(g => g)
|
.map(g => g)
|
||||||
.slice(i, k);
|
.slice(i, k);
|
||||||
|
@ -111,9 +110,9 @@ function generateGuildsEmbeds(interaction, guilds) {
|
||||||
|
|
||||||
const info = current
|
const info = current
|
||||||
.map(
|
.map(
|
||||||
guild =>
|
server =>
|
||||||
`${++j}. ${guild.name} (${guild.id}) | ${guild.memberCount} ${interaction.client.functions.getNoun(
|
`${++j}. ${server.name} | ${server.memberCount} ${interaction.client.functions.getNoun(
|
||||||
guild.memberCount,
|
server.memberCount,
|
||||||
interaction.translate("misc:NOUNS:MEMBERS:1"),
|
interaction.translate("misc:NOUNS:MEMBERS:1"),
|
||||||
interaction.translate("misc:NOUNS:MEMBERS:2"),
|
interaction.translate("misc:NOUNS:MEMBERS:2"),
|
||||||
interaction.translate("misc:NOUNS:MEMBERS:5"),
|
interaction.translate("misc:NOUNS:MEMBERS:5"),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class AddUser extends BaseCommand {
|
class AddUser extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class AddUser extends BaseCommand {
|
||||||
uk: client.translate("tickets/adduser:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("tickets/adduser:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("tickets/adduser:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("tickets/adduser:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, ButtonBuilder, ButtonStyle, ActionRowBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField, ButtonBuilder, ButtonStyle, ActionRowBuilder } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class CloseTicket extends BaseCommand {
|
class CloseTicket extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class CloseTicket extends BaseCommand {
|
||||||
uk: client.translate("tickets/closeticket:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("tickets/closeticket:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("tickets/closeticket:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("tickets/closeticket:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages),
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, ButtonBuilder, ButtonStyle, ActionRowBuilder, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField, ButtonBuilder, ButtonStyle, ActionRowBuilder, ChannelType } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class CreateTicketEmbed extends BaseCommand {
|
class CreateTicketEmbed extends BaseCommand {
|
||||||
|
@ -15,14 +15,193 @@ class CreateTicketEmbed extends BaseCommand {
|
||||||
uk: client.translate("tickets/createticketembed:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("tickets/createticketembed:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("tickets/createticketembed:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("tickets/createticketembed:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild),
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild),
|
||||||
dirname: __dirname,
|
dirname: __dirname,
|
||||||
ownerOnly: false,
|
ownerOnly: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
*/
|
||||||
|
async onLoad(client) {
|
||||||
|
client.on("interactionCreate", async interaction => {
|
||||||
|
if (!interaction.isButton()) return;
|
||||||
|
|
||||||
|
interaction.data = [];
|
||||||
|
interaction.data.guild = await client.getGuildData(interaction.guildId);
|
||||||
|
|
||||||
|
const button = interaction.component;
|
||||||
|
|
||||||
|
if (button.customId === "support_ticket") {
|
||||||
|
const guildData = interaction.data.guild,
|
||||||
|
ticketsCategory = guildData.plugins.tickets.ticketsCategory,
|
||||||
|
ticketLogs = guildData.plugins.tickets.ticketLogs;
|
||||||
|
|
||||||
|
if (interaction.guild.channels.cache.get(ticketsCategory).children.cache.size >= 50) {
|
||||||
|
const sorted = interaction.guild.channels.cache.get(ticketsCategory).children.cache.sort((ch1, ch2) => ch1.createdTimestamp - ch2.createdTimestamp);
|
||||||
|
|
||||||
|
await sorted.first().delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (guildData.plugins.tickets.count === undefined) guildData.plugins.tickets.count = 0;
|
||||||
|
|
||||||
|
guildData.plugins.tickets.count++;
|
||||||
|
|
||||||
|
const channel = await interaction.guild.channels.create({
|
||||||
|
name: `${interaction.user.username}-support-${guildData.plugins.tickets.count}`,
|
||||||
|
topic: interaction.user.id,
|
||||||
|
type: ChannelType.GuildText,
|
||||||
|
parent: ticketsCategory,
|
||||||
|
permissionOverwrites: [
|
||||||
|
{
|
||||||
|
id: interaction.user.id,
|
||||||
|
allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: interaction.guild.roles.everyone,
|
||||||
|
deny: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const logChannel = interaction.guild.channels.cache.get(ticketLogs);
|
||||||
|
const logEmbed = client.embed({
|
||||||
|
title: interaction.translate("tickets/createticketembed:TICKET_CREATED_TITLE"),
|
||||||
|
description: `${interaction.user.toString()} (${channel.toString()})`,
|
||||||
|
});
|
||||||
|
|
||||||
|
await logChannel.send({ embeds: [logEmbed] });
|
||||||
|
await interaction.success("tickets/createticketembed:TICKET_CREATED", {
|
||||||
|
channel: channel.toString(),
|
||||||
|
}, { ephemeral: true });
|
||||||
|
|
||||||
|
await channel.send(`<@${interaction.user.id}>`);
|
||||||
|
|
||||||
|
const embed = client.embed({
|
||||||
|
author: {
|
||||||
|
name: interaction.user.getUsername(),
|
||||||
|
iconURL: interaction.user.displayAvatarURL(),
|
||||||
|
},
|
||||||
|
title: "Support Ticket",
|
||||||
|
description: interaction.translate("tickets/createticketembed:TICKET_CREATED_DESC"),
|
||||||
|
});
|
||||||
|
|
||||||
|
const closeButton = new ButtonBuilder()
|
||||||
|
.setCustomId("close_ticket")
|
||||||
|
.setLabel(interaction.translate("tickets/closeticket:CLOSE_TICKET"))
|
||||||
|
.setStyle(ButtonStyle.Danger);
|
||||||
|
const transcriptButton = new ButtonBuilder()
|
||||||
|
.setCustomId("transcript_ticket")
|
||||||
|
.setLabel(interaction.translate("tickets/closeticket:TRANSCRIPT_TICKET"))
|
||||||
|
.setStyle(ButtonStyle.Secondary);
|
||||||
|
const row = new ActionRowBuilder().addComponents(closeButton, transcriptButton);
|
||||||
|
|
||||||
|
await guildData.save();
|
||||||
|
|
||||||
|
await channel.send({ embeds: [embed], components: [row] });
|
||||||
|
} else if (button.customId === "close_ticket") {
|
||||||
|
const embed = client.embed({
|
||||||
|
title: interaction.translate("tickets/closeticket:CLOSING_TITLE"),
|
||||||
|
description: interaction.translate("tickets/closeticket:CLOSING_DESC"),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: interaction.translate("common:TICKET"),
|
||||||
|
value: interaction.channel.name,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: interaction.translate("tickets/closeticket:CLOSING_BY"),
|
||||||
|
value: interaction.user.getUsername(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const button = new ButtonBuilder().setCustomId("cancel_closing").setLabel(interaction.translate("common:CANCEL")).setStyle(ButtonStyle.Danger);
|
||||||
|
const row = new ActionRowBuilder().addComponents(button);
|
||||||
|
|
||||||
|
await interaction.reply({
|
||||||
|
embeds: [embed],
|
||||||
|
components: [row],
|
||||||
|
});
|
||||||
|
|
||||||
|
const filter = i => i.customId === "cancel_closing";
|
||||||
|
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 5000 });
|
||||||
|
|
||||||
|
collector.on("collect", async i => {
|
||||||
|
await i.update({ content: interaction.translate("tickets/closeticket:CLOSING_CANCELED"), components: [] });
|
||||||
|
collector.stop("canceled");
|
||||||
|
});
|
||||||
|
|
||||||
|
collector.on("end", async (_, reason) => {
|
||||||
|
if (reason !== "canceled") {
|
||||||
|
const reversedMessages = (await interaction.channel.messages.fetch()).filter(m => !m.author.bot),
|
||||||
|
messages = Array.from(reversedMessages.values()).reverse(),
|
||||||
|
transcriptionLogs = interaction.data.guild.plugins.tickets.transcriptionLogs,
|
||||||
|
ticketLogs = interaction.data.guild.plugins.tickets.ticketLogs;
|
||||||
|
|
||||||
|
if (messages.length > 1) {
|
||||||
|
let transcript = "---- TICKET CREATED ----\n";
|
||||||
|
messages.forEach(message => {
|
||||||
|
transcript += `[${client.functions.printDate(client, message.createdTimestamp, null, interaction.getLocale())}] ${message.author.getUsername()}: ${message.content}\n`;
|
||||||
|
});
|
||||||
|
transcript += "---- TICKET CLOSED ----\n";
|
||||||
|
|
||||||
|
if (transcriptionLogs !== null) interaction.guild.channels.cache.get(transcriptionLogs).send({ content: interaction.translate("tickets/closeticket:TRANSCRIPT", { channel: `<#${interaction.channelId}>` }), files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }] });
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.user.send({
|
||||||
|
content: interaction.translate("tickets/closeticket:TRANSCRIPT", { channel: interaction.channel.name }),
|
||||||
|
files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }],
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
interaction.followUp({ content: interaction.translate("misc:CANT_DM"), ephemeral: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const logChannel = interaction.guild.channels.cache.get(ticketLogs);
|
||||||
|
const logEmbed = client.embed({
|
||||||
|
title: interaction.translate("tickets/createticketembed:TICKET_CLOSED_TITLE"),
|
||||||
|
description: `${interaction.user.toString()} (${interaction.channel.toString()})`,
|
||||||
|
});
|
||||||
|
|
||||||
|
logChannel.send({ embeds: [logEmbed] });
|
||||||
|
|
||||||
|
interaction.channel.send("Closed!");
|
||||||
|
|
||||||
|
const member = interaction.guild.members.cache.find(u => u.user.id === interaction.channel.topic);
|
||||||
|
|
||||||
|
await interaction.channel.permissionOverwrites.edit(member, { ViewChannel: false, SendMessages: null });
|
||||||
|
await interaction.channel.setName(`${interaction.channel.name}-closed`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (button.customId === "transcript_ticket") {
|
||||||
|
await interaction.deferUpdate();
|
||||||
|
|
||||||
|
const reversedMessages = (await interaction.channel.messages.fetch()).filter(m => !m.author.bot);
|
||||||
|
const messages = Array.from(reversedMessages.values()).reverse();
|
||||||
|
|
||||||
|
if (messages.length > 1) {
|
||||||
|
let transcript = "---- TICKET CREATED ----\n";
|
||||||
|
messages.forEach(message => {
|
||||||
|
transcript += `[${client.functions.printDate(client, message.createdTimestamp, null, interaction.getLocale())}] ${message.author.getUsername()}: ${message.content}\n`;
|
||||||
|
});
|
||||||
|
transcript += "---- TICKET CLOSED ----\n";
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.user.send({
|
||||||
|
content: interaction.translate("tickets/closeticket:TRANSCRIPT", { channel: `<#${interaction.channelId}>` }),
|
||||||
|
files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }],
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
interaction.followUp({ content: interaction.translate("misc:CANT_DM"), ephemeral: true });
|
||||||
|
}
|
||||||
|
} else return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {import("../../base/Client")} client
|
* @param {import("../../base/Client")} client
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { SlashCommandBuilder, PermissionsBitField, InteractionContextType, ApplicationIntegrationType } = require("discord.js");
|
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
|
||||||
const BaseCommand = require("../../base/BaseCommand");
|
const BaseCommand = require("../../base/BaseCommand");
|
||||||
|
|
||||||
class RemoveUser extends BaseCommand {
|
class RemoveUser extends BaseCommand {
|
||||||
|
@ -15,8 +15,7 @@ class RemoveUser extends BaseCommand {
|
||||||
uk: client.translate("tickets/removeuser:DESCRIPTION", null, "uk-UA"),
|
uk: client.translate("tickets/removeuser:DESCRIPTION", null, "uk-UA"),
|
||||||
ru: client.translate("tickets/removeuser:DESCRIPTION", null, "ru-RU"),
|
ru: client.translate("tickets/removeuser:DESCRIPTION", null, "ru-RU"),
|
||||||
})
|
})
|
||||||
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
|
.setDMPermission(false)
|
||||||
.setContexts([InteractionContextType.Guild])
|
|
||||||
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
|
||||||
.addUserOption(option =>
|
.addUserOption(option =>
|
||||||
option
|
option
|
||||||
|
|
91
commands/beatrun.ru/courses.js
Normal file
91
commands/beatrun.ru/courses.js
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
|
const BaseCommand = require("../../base/BaseCommand"),
|
||||||
|
fetch = require("node-fetch");
|
||||||
|
|
||||||
|
class Courses extends BaseCommand {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../base/Client")} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
super({
|
||||||
|
command: new SlashCommandBuilder()
|
||||||
|
.setName("courses")
|
||||||
|
.setDescription(client.translate("beatrun.ru/courses:DESCRIPTION"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("beatrun.ru/courses:DESCRIPTION", null, "uk-UA"),
|
||||||
|
ru: client.translate("beatrun.ru/courses:DESCRIPTION", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setDMPermission(false)
|
||||||
|
.addStringOption(option =>
|
||||||
|
option
|
||||||
|
.setName("code")
|
||||||
|
.setDescription(client.translate("common:CODE"))
|
||||||
|
.setDescriptionLocalizations({
|
||||||
|
uk: client.translate("common:CODE", null, "uk-UA"),
|
||||||
|
ru: client.translate("common:CODE", null, "ru-RU"),
|
||||||
|
})
|
||||||
|
.setRequired(true),
|
||||||
|
),
|
||||||
|
dirname: __dirname,
|
||||||
|
ownerOnly: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import("../../base/Client")} client
|
||||||
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
||||||
|
* @param {Object} data
|
||||||
|
*/
|
||||||
|
async execute(client, interaction) {
|
||||||
|
await interaction.deferReply();
|
||||||
|
|
||||||
|
const code = interaction.options.getString("code");
|
||||||
|
|
||||||
|
const response = await fetch(`https://courses.jonnybro.ru/api/info/${code}`).then(res => res.json());
|
||||||
|
const course = response.data;
|
||||||
|
|
||||||
|
if (response.res === 401) return interaction.error("beatrun.ru/courses:NOT_FOUND", null, { ephemeral: true, edit: true });
|
||||||
|
|
||||||
|
const embed = client.embed({
|
||||||
|
title: code,
|
||||||
|
description: `[${interaction.translate("beatrun.ru/courses:DOWNLOAD")}](https://courses.jonnybro.ru/${course.path})`,
|
||||||
|
thumbnail: course.mapimg,
|
||||||
|
url: `https://courses.beatrun.ru/?search=${code}`,
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: interaction.translate("beatrun.ru/courses:MAP"),
|
||||||
|
value: `[${course.map}](https://steamcommunity.com/sharedfiles/filedetails/?id=${course.mapid})`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: interaction.translate("beatrun.ru/courses:UPLOADER"),
|
||||||
|
value: `[${course.uploader.name || course.uploader.userid}](https://steamcommunity.com/profiles/${course.uploader.userid})`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "\u200B",
|
||||||
|
value: "\u200B",
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: interaction.translate("beatrun.ru/courses:DATE"),
|
||||||
|
value: `<t:${Math.floor(course.time / 1000)}:D>`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: interaction.translate("beatrun.ru/courses:PLAYS"),
|
||||||
|
value: `${course.plays || 0}`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
interaction.editReply({
|
||||||
|
embeds: [embed],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Courses;
|
|
@ -13,8 +13,6 @@ module.exports = {
|
||||||
clientId: "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
clientId: "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
||||||
clientSecret: "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
clientSecret: "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
||||||
},
|
},
|
||||||
/* YouTube Cookie */
|
|
||||||
youtubeCookie: "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
||||||
/* Support server */
|
/* Support server */
|
||||||
support: {
|
support: {
|
||||||
id: "123456789098765432", // The ID of the support server
|
id: "123456789098765432", // The ID of the support server
|
||||||
|
@ -43,6 +41,6 @@ module.exports = {
|
||||||
},
|
},
|
||||||
/* Add your own API keys here */
|
/* Add your own API keys here */
|
||||||
apiKeys: {
|
apiKeys: {
|
||||||
shlink: "12345678-1234-1234-1234-123456789098" /* Shlink.io REST API key */,
|
shlink: "12345678-1234-1234-1234-123456789098", /* Shlink.io REST API key */
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
8
dashboard/.env.example
Normal file
8
dashboard/.env.example
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
BOT_CLIENT_ID="<YOUR_BOT_CLIENT_ID>"
|
||||||
|
BOT_CLIENT_SECRET="<YOUR_BOT_CLIENT_SECRET>"
|
||||||
|
|
||||||
|
# The absolute url of the dashboard (Production)
|
||||||
|
APP_URL="http://localhost:3000"
|
||||||
|
|
||||||
|
# The absolute url of the api endpoint of your bot (Production)
|
||||||
|
NEXT_PUBLIC_API_ENDPOINT="http://localhost:8080"
|
3
dashboard/.eslintrc.json
Normal file
3
dashboard/.eslintrc.json
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"extends": ["next/core-web-vitals", "prettier"]
|
||||||
|
}
|
37
dashboard/.gitignore
vendored
Normal file
37
dashboard/.gitignore
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
/node_modules
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# next.js
|
||||||
|
/.next/
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# debug
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
|
||||||
|
# local env files
|
||||||
|
.env
|
||||||
|
.env*.local
|
||||||
|
|
||||||
|
# vercel
|
||||||
|
.vercel
|
||||||
|
|
||||||
|
# typescript
|
||||||
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
213
dashboard/README.md
Normal file
213
dashboard/README.md
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
# Discord Bot Dashboard Template
|
||||||
|
|
||||||
|
> Forked from [here](https://github.com/FileEditor97/discord-bot-dashboard)
|
||||||
|
|
||||||
|
Using Typescript, Next.js 13, React 18 and Chakra ui 2.0
|
||||||
|
|
||||||
|
- Support Light/Dark theme
|
||||||
|
- Multi languages support (i18n)
|
||||||
|
- Typescript support
|
||||||
|
- Nice UI & UX + Fast performance
|
||||||
|
- Flexiable and Customizable
|
||||||
|
- Detailed Documentation
|
||||||
|
|
||||||
|
**Video:** <https://youtu.be/IdMPjT5PzVk>\
|
||||||
|
**Live Demo:** <https://demo-bot.vercel.app>
|
||||||
|
|
||||||
|
- Only 'Welcome message' Feature is Supported
|
||||||
|
|
||||||
|
## Review (not the latest version)
|
||||||
|
|
||||||
|
| Light | Dark |
|
||||||
|
| :--------------------------------------: | :------------------------------------: |
|
||||||
|
| ![light-mode](./document/home-light.png) | ![dark-mode](./document/home-dark.png) |
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
As a template, you need to customize a few things in order to get it work
|
||||||
|
|
||||||
|
### Before that
|
||||||
|
|
||||||
|
- Install Node.js, and a Package Manager (ex: npm or pnpm)
|
||||||
|
|
||||||
|
### Required Skills
|
||||||
|
|
||||||
|
- Basic knowledge about React.js
|
||||||
|
- Able to read javascript/typescript
|
||||||
|
|
||||||
|
### Set up
|
||||||
|
|
||||||
|
1. **Clone the repo**
|
||||||
|
\
|
||||||
|
`git clone https://github.com/fuma_nama/discord-bot-dashboard-next.git`
|
||||||
|
2. **Install dependencies**
|
||||||
|
\
|
||||||
|
We always prefer [`PNpm`](https://pnpm.io)
|
||||||
|
|
||||||
|
| NPM | PNPM |
|
||||||
|
| :-----------: | :------------: |
|
||||||
|
| `npm install` | `pnpm install` |
|
||||||
|
|
||||||
|
3. **Customize files**
|
||||||
|
\
|
||||||
|
The file structure of this project
|
||||||
|
| Path | Description |
|
||||||
|
| ------------------------------------- | ------------- |
|
||||||
|
| [src/pages/\*](./src/pages) | All the pages |
|
||||||
|
| [src/components/\*](./src/components) | Components |
|
||||||
|
| [src/api/\*](./src/api) | API utils |
|
||||||
|
| [src/config/\*](./src/api) | Common configurations |
|
||||||
|
4. **Define Features**
|
||||||
|
\
|
||||||
|
The dashboard has built-in support for configuring features
|
||||||
|
\
|
||||||
|
Users are able to enable/disable features and config the feature after enabling it
|
||||||
|
|
||||||
|
**Customize all typings in [src/config/types/custom-types.ts](./src/config/types/custom-types.ts)**
|
||||||
|
\
|
||||||
|
`CustomFeatures` is used for defining features and options, see the example for more details
|
||||||
|
|
||||||
|
**Open [src/config/features](./src/config/features.tsx)**
|
||||||
|
\
|
||||||
|
You can see how a feature is configured
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
'feature-id': {
|
||||||
|
name: 'Feature name',
|
||||||
|
description: 'Description about this feature',
|
||||||
|
icon: <Icon as={BsMusicNoteBeamed} />, //give it a cool icon
|
||||||
|
useRender: (data) => {
|
||||||
|
//render the form
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `useRender` property is used to render Feature Configuration Panel \
|
||||||
|
Take a look at [here](./src/config/example/WelcomeMessageFeature.tsx) for examples
|
||||||
|
|
||||||
|
5. **Configure General Information**
|
||||||
|
\
|
||||||
|
Modify [src/config/common.tsx](./src/config/common.tsx)
|
||||||
|
- Bot name & icon
|
||||||
|
- Invite url _(example: <https://discord.com/oauth2/authorize?client_id=1234&scope=bot>)_
|
||||||
|
- Guild settings
|
||||||
|
6. **Configure Environment variables**
|
||||||
|
\
|
||||||
|
Those variables in [.env.example](./.env.example) are required
|
||||||
|
\
|
||||||
|
You can define environment variables by creating a `.env` file
|
||||||
|
7. **Setup Backend Server**
|
||||||
|
\
|
||||||
|
In order to let the dashboard connected with your discord bot, you will need a backend server
|
||||||
|
\
|
||||||
|
You can implement it in any programming languages
|
||||||
|
|
||||||
|
Read [here](#backend-development) for a guide to develop your own server
|
||||||
|
|
||||||
|
8. **Done!**
|
||||||
|
\
|
||||||
|
Start the app by `pnpm run dev` _(depends on your package manager)_
|
||||||
|
\
|
||||||
|
Then you should see the app started in port `3000`
|
||||||
|
|
||||||
|
[Localization](./document/localization.md) | [Forms](./document/form.md)
|
||||||
|
|
||||||
|
## Authorization
|
||||||
|
|
||||||
|
We are using the [API Routes](https://nextjs.org/docs/api-routes/introduction) of Next.js to handle Authorization
|
||||||
|
|
||||||
|
### Configure the Application
|
||||||
|
|
||||||
|
1. Open Discord Developer Portal
|
||||||
|
2. Create your OAuth2 application in <https://discord.com/developers/applications>
|
||||||
|
3. In `<Your Application>` -> OAuth2 -> Redirects
|
||||||
|
|
||||||
|
Add `<APP_URL>/api/auth/callback` url to the redirects
|
||||||
|
|
||||||
|
For Example: `http://localhost:3000/api/auth/callback` \
|
||||||
|
**This is required for Authorization**
|
||||||
|
|
||||||
|
### Authorization Flow
|
||||||
|
|
||||||
|
**`Login -> Discord OAuth -> API Routes -> Client`**
|
||||||
|
|
||||||
|
- Login (`/api/auth/login`)
|
||||||
|
\
|
||||||
|
- Redirects user to discord oauth url
|
||||||
|
- Open Discord OAuth url
|
||||||
|
- User authorizes the application
|
||||||
|
- Redirect back to `/api/auth/callback`
|
||||||
|
- API Routes
|
||||||
|
- Store the access token in http-only cookies
|
||||||
|
- Redirect back to home page
|
||||||
|
|
||||||
|
### Token Expiration
|
||||||
|
|
||||||
|
The Discord access token can be expired or unauthorized by the user \
|
||||||
|
We will require the user to login again after getting `401` error from the Discord API
|
||||||
|
|
||||||
|
The refresh token won't be used, but you are able to customize the Authorization Flow
|
||||||
|
|
||||||
|
## Backend Development
|
||||||
|
|
||||||
|
Check [src/api/bot.ts](./src/api/bot.ts), it defined a built-in API for fetching data
|
||||||
|
|
||||||
|
You can use `express.js` (Node.js), `Rocket` (Rust) or any libraries/languages to develop your own server
|
||||||
|
\
|
||||||
|
Usually the server runs along with your discord bot (in the same program)
|
||||||
|
\
|
||||||
|
Moreover, you can use redis instead of connecting to the bot server directly
|
||||||
|
|
||||||
|
### Official Example
|
||||||
|
|
||||||
|
[Node.js (Typescript)](https://github.com/fuma-nama/discord-dashboard-backend-next)
|
||||||
|
|
||||||
|
### Authorization Header
|
||||||
|
|
||||||
|
The client will pass their access token via the `Authorization` header
|
||||||
|
|
||||||
|
`Bearer MY_TOKEN_1212112`
|
||||||
|
|
||||||
|
### Required Routes
|
||||||
|
|
||||||
|
You may extend it for more functions
|
||||||
|
|
||||||
|
GET `/guilds/{guild}`
|
||||||
|
|
||||||
|
- Get guild info (`custom-types.ts > CustomGuildInfo`)
|
||||||
|
- **Respond 404 or `null` if bot hasn't joined the guild**
|
||||||
|
|
||||||
|
GET `/guilds/{guild}/features/{feature}`
|
||||||
|
|
||||||
|
- Get Feature options (`custom-types.ts > CustomFeatures[K]`)
|
||||||
|
- **Respond 404 if not enabled**
|
||||||
|
|
||||||
|
PATCH `/guilds/{guild}/features/{feature}`
|
||||||
|
|
||||||
|
- Update feature options
|
||||||
|
- With custom body (defined in `config/features`)
|
||||||
|
- Respond updated feature options
|
||||||
|
|
||||||
|
POST `/guilds/{guild}/features/{feature}`
|
||||||
|
|
||||||
|
- Enable a feature
|
||||||
|
|
||||||
|
DELETE `/guilds/{guild}/features/{feature}`
|
||||||
|
|
||||||
|
- Disable a feature
|
||||||
|
|
||||||
|
GET `/guilds/{guild}/roles`
|
||||||
|
|
||||||
|
- Get Roles of the guild
|
||||||
|
- Responds a list of [Role Object](https://discord.com/developers/docs/topics/permissions#role-object) _(Same as discord documentation)_
|
||||||
|
|
||||||
|
GET `/guilds/{guild}/channels`
|
||||||
|
|
||||||
|
- Get Channels of the guild
|
||||||
|
- Responds a list of [Guild Channel](https://discord.com/developers/docs/resources/channel#channel-object) _(Same as discord documentation)_
|
||||||
|
|
||||||
|
## Any issues?
|
||||||
|
|
||||||
|
Feel free to ask a question by opening a issue
|
||||||
|
|
||||||
|
**Love this project?** Give this repo a star!
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 42cb44000f844f17b0d9e12e15a45ab60f3dcdb7
|
|
31
dashboard/document/form.md
Normal file
31
dashboard/document/form.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# The `useForm` hook
|
||||||
|
|
||||||
|
We are using [`react-hook-form`](https://react-hook-form.com/) for forms, including feature configuration or settings page
|
||||||
|
|
||||||
|
## Built-in Components
|
||||||
|
|
||||||
|
There're some common components such as `<FilePicker />` in the [src/components/forms/\*](./src/components/forms) folder
|
||||||
|
|
||||||
|
## Controller
|
||||||
|
|
||||||
|
We add `useController` into custom components so as to provides better code quality
|
||||||
|
|
||||||
|
Therefore, You don't have to wrap the inputs into the `<Controller />` component
|
||||||
|
|
||||||
|
For example, the Color picker & Switch field can be used in this way
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
<ColorPickerForm
|
||||||
|
control={{
|
||||||
|
label: 'Color',
|
||||||
|
description: 'The color of message',
|
||||||
|
}}
|
||||||
|
controller={{ control, name: 'color' }} //from the useForm hook
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
[Learn More](https://react-hook-form.com/api/usecontroller/)
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Take a look at [here](./src/config/example/WelcomeMessageFeature.tsx) for examples
|
BIN
dashboard/document/home-dark.png
Normal file
BIN
dashboard/document/home-dark.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 244 KiB |
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue