我想在机器人关闭或打开的某个频道中发送一条消息

Posted

技术标签:

【中文标题】我想在机器人关闭或打开的某个频道中发送一条消息【英文标题】:I would like to have a message sent in a certain channel that the bot is turning off or on 【发布时间】:2019-10-21 12:46:19 【问题描述】:

所以我是制作机器人和编码之类的新手,这可能是一个新手问题,但无论如何,我的机器人没有托管服务器,所以我想也许当机器人关闭时它会发送频道中的消息但我不知道如何做到这一点或是否可能。我能够在机器人打开时发生它,但我不知道如何在机器人关闭时发生它。

我什至不知道从哪里开始。到目前为止,我输入的是 node 。在终端中,机器人打开,告诉控制台日志,然后告诉服务器。但我不知道如何关闭机器人。

bot.on('ready', () =>
bot.channels.get("488916182406004747").send("The cloud has lifted");

)

【问题讨论】:

只有在机器人因给定原因关闭时才能实现。例如,如果您向其发出关闭命令。但是,如果它是由于其他原因发生的,例如崩溃,或者您的电源中断,它就不会发送消息。 这取决于机器人的启动方式您可能能够在系统端捕获崩溃并向您创建的 webhook url 发送请求,以便 webhook 将在通道中发送消息但这取决于关于机器人如何/为什么离线。如果是因为命令,正如@MegaEmailman 所说,您可以发送消息。你也可以用艰难的方式杀死它并处理它(寻找this question) 【参考方案1】:

关机命令

如 cmets 中所述,您可以创建一个简单的命令来关闭您的客户端,这将发送所需的消息。

例子:

// Async context required to use keyword 'await'

try 
  await message.channel.send('Goodbye');    // Send the message

  await message.delete();                   // Delete the command message
  await client.user.setStatus('invisible'); // Mark the client as offline (instead of waiting)
  await client.destroy();                   // Remove the client instance
 catch(err) 
  console.error(err);                       // Return any errors from rejected promises

网络钩子

如果您希望在 Node 进程退出时发送消息出于任何原因(即客户端注销,计算机已关闭,CTRL + C,等),您可以创建一个Webhook 并在进程的beforeExit 事件中使用它。

要创建 Webhook,请导航到您希望在其中发送消息的通道的选项。转到 Webhook,单击创建 Webhook,自定义选项,复制 Webhook URL,然后单击保存。在 URL 中,ID 是仅在/webhooks/ 之后的第一组数字,而令牌在下一个/ 之后。

例子:

const  id, token  = require('./webhook.json'); // json file with Webhook's ID and token 
// const Discord = require('discord.js');

// const client = new Discord.Client();
const webhook = new Discord.WebhookClient(id, token);

process.once('beforeExit', () => 
  webhook.send(`$client.user has gone offline.`)
    .catch(console.error);
);

奖励:您还可以在 ready 事件中使用 Webhook 来发送“就绪”消息。

client.once('ready', () => 
  webhook.send(`$client.user is now online.`)
    .catch(console.error);
);

编辑:

beforeExit 事件在 Node.js 进程意外退出时发出,例如在您关闭控制台窗口时。因此,唯一您会发现 Webhook 选项有用的情况是当您的客户端崩溃或您在控制台窗口中使用 CTRL/CMD + C 时。

我的建议是坚持关闭命令。要在没有适当托管的情况下保持机器人运行,您可以尝试使用进程管理器或创建 Windows 服务。

【讨论】:

很抱歉,但我无法让它工作 您是指 Webhook 吗?有没有错误?会发生什么? 嗯,没有任何错误。它只是不发送任何东西。这就是我的样子 const id, webtoken = require('./webhook.json'); const webhook = new Discord.WebhookClient(id, webtoken); process.once('beforeExit', () => webhook.send($bot.user 已下线。) .catch(console.error); ); 我很抱歉;经过我自己的一些测试,在强制停止 Node.js 进程时不会发出beforeExit。当机器人崩溃时,您的消息仍会发送,但如果您关闭命令提示符窗口则不会发送。我的建议是坚持关闭命令。

以上是关于我想在机器人关闭或打开的某个频道中发送一条消息的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的机器人在特定频道中发送消息,然后在一段时间后将其删除

关于新角色不和谐的消息[关闭]

如何让机器人将消息发送到“通用”频道或消息最多的频道?

如何删除我的不和谐机器人在特定频道中发送的先前消息?

Discord.js 机器人在频道中的 10 条消息后发送消息

如何查找机器人在特定频道中发送的消息? [discord.js]