You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:35:23