尝试向我的 mongodb 添加一个警告系统,它有效但说应用程序没有响应
Trying to add a warning system to my mongodb, it works but says application didn't respond
const {Client, CommandInteraction, MessageEmbed} = require("discord.js");
const db = require("../../Structures/Schemas/InfractionDB");
module.exports = {
name: "warnings",
description: "Give a warning",
permission: "ADMINISTRATOR",
options: [
{
name: "target",
description: "Select a target.",
type: "USER",
required: true
},
{
name: "reason",
description: "Provide a reason.",
type: "STRING",
required: true
},
{
name: "evidence",
description: "Provide evidence.",
type: "STRING",
required: false
},
],
/**
*
* @param {CommandInteraction} interaction
* @param {Client} client
*/
execute(interaction, client) {
const{guild, member, options} = interaction
const Target = options.getMember("target");
const Reason = options.getString("reason");
const Evidence = options.getString("evidence") || "None provided";
const Response = new MessageEmbed()
.setColor("RED")
.setAuthor({name: "MOD BOT", iconURL: guild.iconURL()});
db.findOne({GuildID: guild.id, UserID: Target.id}, async (err,data)=> {
if(err) throw err;
if(!data || !data.WarnData) {
data = new db({
GuildID: guild.id,
UserID: Target.id,
WarnData: [
{
ExecuterID: member.id,
ExecuterTag: member.user.tag,
TargetID: Target.id,
TargetTag: Target.user.tag,
Reason: Reason,
Evidence: Evidence,
Date: parseInt(interaction.createdTimestamp / 1000)
}
],
})
} else {
const WarnDataObject ={
ExecuterID: member.id,
ExecuterTag: member.user.tag,
TargetID: Target.id,
TargetTag: Target.user.tag,
Reason: Reason,
Evidence: Evidence,
Date: parseInt(interaction.createdTimestamp / 1000)
}
data.WarnData.push(WarnDataObject)
}
data.save()
});
Response.setDescription(`Warning Added: ${Target.user.tag} | ||${Target.id}||\n**Reason**: ${Reason}\n**Evidence**:${Evidence}`);
guild.channels.cache.get("946217387336818699").send({embeds:[Response]});
}}
最初这是路由到我的数据库中的另一个集合。我试着转换它,这样我就可以在一个地方看到所有的东西。但这花了我几个小时而且似乎没有任何进展。就像我说的,数据存储在数据库中,但响应失败。任何想法如何解决这一问题?终端没有错误
我认为错误是您的应用程序响应时间过长。
你只有 3 秒的时间来做出反应。
为此,我建议您将交互作为异步函数执行
在尝试在数据库中找到它之前,您应该使用 await 。因为在数据库中查找数据可能需要一些时间。
数据存储在数据库中,因为它与响应时间无关,但 discord api 想要在 3 秒内回复,否则它将失败。
我已经阅读了你的代码。好像还可以
我建议您使用更简单的方法而不是使用对象或 json 表单来创建命令。
来自 @discordjs/builders
的 SlashCommandBuilder
它简单易用。
这里有一个示例,说明如果您使用 SlashCommandBuilder 是多么容易
const { SlashCommandBuilder } = require('@discordjs/builders');
const data = new SlashCommandBuilder()
.setName('gif')
.setDescription('Sends a random gif!')
.addStringOption(option =>
option.setName('category')
.setDescription('The gif category')
.setRequired(true)
.addChoice('Funny', 'gif_funny')
.addChoice('Meme', 'gif_meme')
.addChoice('Movie', 'gif_movie'));
您可以使用
安装所有依赖项
npm install discord.js @discordjs/rest discord-api-types
const {Client, CommandInteraction, MessageEmbed} = require("discord.js");
const db = require("../../Structures/Schemas/InfractionDB");
module.exports = {
name: "warnings",
description: "Give a warning",
permission: "ADMINISTRATOR",
options: [
{
name: "target",
description: "Select a target.",
type: "USER",
required: true
},
{
name: "reason",
description: "Provide a reason.",
type: "STRING",
required: true
},
{
name: "evidence",
description: "Provide evidence.",
type: "STRING",
required: false
},
],
/**
*
* @param {CommandInteraction} interaction
* @param {Client} client
*/
execute(interaction, client) {
const{guild, member, options} = interaction
const Target = options.getMember("target");
const Reason = options.getString("reason");
const Evidence = options.getString("evidence") || "None provided";
const Response = new MessageEmbed()
.setColor("RED")
.setAuthor({name: "MOD BOT", iconURL: guild.iconURL()});
db.findOne({GuildID: guild.id, UserID: Target.id}, async (err,data)=> {
if(err) throw err;
if(!data || !data.WarnData) {
data = new db({
GuildID: guild.id,
UserID: Target.id,
WarnData: [
{
ExecuterID: member.id,
ExecuterTag: member.user.tag,
TargetID: Target.id,
TargetTag: Target.user.tag,
Reason: Reason,
Evidence: Evidence,
Date: parseInt(interaction.createdTimestamp / 1000)
}
],
})
} else {
const WarnDataObject ={
ExecuterID: member.id,
ExecuterTag: member.user.tag,
TargetID: Target.id,
TargetTag: Target.user.tag,
Reason: Reason,
Evidence: Evidence,
Date: parseInt(interaction.createdTimestamp / 1000)
}
data.WarnData.push(WarnDataObject)
}
data.save()
});
Response.setDescription(`Warning Added: ${Target.user.tag} | ||${Target.id}||\n**Reason**: ${Reason}\n**Evidence**:${Evidence}`);
guild.channels.cache.get("946217387336818699").send({embeds:[Response]});
}}
最初这是路由到我的数据库中的另一个集合。我试着转换它,这样我就可以在一个地方看到所有的东西。但这花了我几个小时而且似乎没有任何进展。就像我说的,数据存储在数据库中,但响应失败。任何想法如何解决这一问题?终端没有错误
我认为错误是您的应用程序响应时间过长。 你只有 3 秒的时间来做出反应。 为此,我建议您将交互作为异步函数执行 在尝试在数据库中找到它之前,您应该使用 await 。因为在数据库中查找数据可能需要一些时间。 数据存储在数据库中,因为它与响应时间无关,但 discord api 想要在 3 秒内回复,否则它将失败。
我已经阅读了你的代码。好像还可以 我建议您使用更简单的方法而不是使用对象或 json 表单来创建命令。
来自 @discordjs/builders
的 SlashCommandBuilder它简单易用。
这里有一个示例,说明如果您使用 SlashCommandBuilder 是多么容易
const { SlashCommandBuilder } = require('@discordjs/builders');
const data = new SlashCommandBuilder()
.setName('gif')
.setDescription('Sends a random gif!')
.addStringOption(option =>
option.setName('category')
.setDescription('The gif category')
.setRequired(true)
.addChoice('Funny', 'gif_funny')
.addChoice('Meme', 'gif_meme')
.addChoice('Movie', 'gif_movie'));
您可以使用
安装所有依赖项npm install discord.js @discordjs/rest discord-api-types