Discord Bot开发:实现/duty与/offduty指令及Embed执勤日志功能
实现/duty和/offduty指令的代码示例
假设你使用的是discord.js v14(当前Discord Bot开发的主流版本),以下是可直接整合到现有代码中的实现方案:
核心指令代码
你可以将以下代码拆分为两个独立的指令文件(duty.js、offduty.js),或者根据现有Bot结构整合到对应模块中:
/duty 指令代码
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); const moment = require('moment-timezone'); // 可选,用于匹配FiveM服务器时区 module.exports = { data: new SlashCommandBuilder() .setName('duty') .setDescription('记录PD开始执勤时间'), async execute(interaction) { // 获取当前时间,可替换为服务器时区(比如美国东部时区) const dutyTime = moment().tz('America/New_York').format('YYYY-MM-DD HH:mm:ss'); // 无需时区的话用默认格式:new Date().toLocaleString() // 构建执勤上线Embed日志 const dutyEmbed = new EmbedBuilder() .setColor('#00ff00') .setTitle('PD执勤上线记录') .setDescription(`**警员${interaction.user.tag}** 已开始执勤`) .addFields( { name: '上线时间', value: dutyTime, inline: true }, { name: '警员ID', value: interaction.user.id, inline: true } ) .setTimestamp(); // 发送到指定日志频道(替换为你的实际频道ID) const logChannel = interaction.guild.channels.cache.get('你的日志频道ID'); if (logChannel) await logChannel.send({ embeds: [dutyEmbed] }); // 给用户发送私密确认 await interaction.reply({ content: `已记录上线时间:${dutyTime}`, ephemeral: true }); }, };
/offduty 指令代码
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); const moment = require('moment-timezone'); module.exports = { data: new SlashCommandBuilder() .setName('offduty') .setDescription('记录PD结束执勤时间'), async execute(interaction) { const offDutyTime = moment().tz('America/New_York').format('YYYY-MM-DD HH:mm:ss'); // 构建执勤下线Embed日志 const offDutyEmbed = new EmbedBuilder() .setColor('#ff0000') .setTitle('PD执勤下线记录') .setDescription(`**警员${interaction.user.tag}** 已结束执勤`) .addFields( { name: '下线时间', value: offDutyTime, inline: true }, { name: '警员ID', value: interaction.user.id, inline: true } ) .setTimestamp(); const logChannel = interaction.guild.channels.cache.get('你的日志频道ID'); if (logChannel) await logChannel.send({ embeds: [offDutyEmbed] }); await interaction.reply({ content: `已记录下线时间:${offDutyTime}`, ephemeral: true }); }, };
关键细节说明
- 时区匹配:如果FiveM服务器和Bot所在时区不同,安装
moment-timezone依赖后可精准设置服务器时区,避免时间记录混乱。无需时区的话直接用new Date().toLocaleString()即可。 - 权限配置:确保Bot拥有「查看频道」「发送消息」「嵌入链接」的权限,且日志频道已正确设置。
- 指令注册:如果你的Bot还没配置指令自动注册,可添加以下代码到主文件(替换对应环境变量):
const fs = require('fs'); const path = require('path'); const { REST, Routes } = require('discord.js'); const commands = []; const commandsPath = path.join(__dirname, 'commands'); const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js')); for (const file of commandFiles) { const filePath = path.join(commandsPath, file); const command = require(filePath); commands.push(command.data.toJSON()); } const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN); (async () => { try { await rest.put( Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID), { body: commands }, ); console.log('指令注册完成'); } catch (error) { console.error(error); } })();
依赖安装(可选)
如果使用时区功能,执行以下命令安装依赖:
npm install moment-timezone
内容的提问来源于stack exchange,提问作者Second City
相关产品推荐
相关产品推荐

