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

如何制作带移除邀请功能的MongoDB邀请追踪机器人

使用Discord.js + MongoDB处理guildMemberAdd/guildMemberRemove事件

先把必要的依赖装上:

npm install discord.js mongoose

1. 连接MongoDB

在你的主文件(比如index.js)里添加数据库连接逻辑:

const { Client, GatewayIntentBits } = require('discord.js');
const mongoose = require('mongoose');
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMembers // 必须开启这个意图才能监听成员事件
  ]
});

// 连接MongoDB,替换成你的数据库地址和名称
mongoose.connect('mongodb://localhost:27017/your-db-name')
  .then(() => console.log('已连接到MongoDB'))
  .catch(err => console.error('MongoDB连接失败:', err));

client.login('你的Bot令牌');

2. 创建成员数据模型

新建models/GuildMember.js,定义要存储的字段:

const mongoose = require('mongoose');

const guildMemberSchema = new mongoose.Schema({
  userId: { type: String, required: true, unique: true },
  guildId: { type: String, required: true },
  joinAt: { type: Date, default: Date.now },
  leaveAt: { type: Date, default: null }
});

module.exports = mongoose.model('GuildMember', guildMemberSchema);

3. 处理guildMemberAdd事件

新建events/guildMemberAdd.js,当成员加入时写入/更新数据库:

const { Events } = require('discord.js');
const GuildMember = require('../models/GuildMember');

module.exports = {
  name: Events.GuildMemberAdd,
  async execute(member) {
    try {
      // 检查用户是否已有记录
      const existingMember = await GuildMember.findOne({ userId: member.user.id, guildId: member.guild.id });
      if (!existingMember) {
        // 无记录则创建新条目
        await GuildMember.create({
          userId: member.user.id,
          guildId: member.guild.id,
          joinAt: member.joinedAt
        });
        console.log(`已记录成员 ${member.user.tag} 加入服务器`);
      } else {
        // 有记录则更新加入时间、清空离开时间
        existingMember.joinAt = member.joinedAt;
        existingMember.leaveAt = null;
        await existingMember.save();
        console.log(`已更新成员 ${member.user.tag} 的加入记录`);
      }
    } catch (err) {
      console.error('处理成员加入事件出错:', err);
    }
  }
};

4. 处理guildMemberRemove事件

新建events/guildMemberRemove.js,当成员离开时更新数据库:

const { Events } = require('discord.js');
const GuildMember = require('../models/GuildMember');

module.exports = {
  name: Events.GuildMemberRemove,
  async execute(member) {
    try {
      const existingMember = await GuildMember.findOne({ userId: member.user.id, guildId: member.guild.id });
      if (existingMember) {
        // 有记录则更新离开时间
        existingMember.leaveAt = new Date();
        await existingMember.save();
        console.log(`已记录成员 ${member.user.tag} 离开服务器`);
      } else {
        // 可选:无记录时也创建条目(仅存离开时间)
        await GuildMember.create({
          userId: member.user.id,
          guildId: member.guild.id,
          leaveAt: new Date()
        });
        console.log(`已记录成员 ${member.user.tag} 离开服务器(未记录加入时间)`);
      }
    } catch (err) {
      console.error('处理成员离开事件出错:', err);
    }
  }
};

注册事件到Bot

在主文件index.js里添加事件加载逻辑:

const fs = require('node:fs');
const path = require('node:path');

const eventsPath = path.join(__dirname, 'events');
const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js'));

for (const file of eventFiles) {
  const filePath = path.join(eventsPath, file);
  const event = require(filePath);
  if (event.once) {
    client.once(event.name, (...args) => event.execute(...args));
  } else {
    client.on(event.name, (...args) => event.execute(...args));
  }
}

注意事项:

  • 必须在Discord开发者门户给Bot开启Server Members Intent权限
  • 替换代码里的数据库地址、Bot令牌为你的实际信息

内容的提问来源于stack exchange,提问作者Gaming HMS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:42:51