如何制作带移除邀请功能的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
相关产品推荐
相关产品推荐

