Reputation: 19
How can I make a leave message that displays if the user left, got banned or got kicked? I already tried doing this with guildBanAdd and guildMemberRemove, and it mostly works - but if you get banned, it says that you both left AND got banned, which is not what I want. Code:
// member got kicked/left the server
bot.on('guildMemberRemove', async member => {
const fetchedLogs1 = await member.guild.fetchAuditLogs({ // get audit log entry
limit: 1,
type: 'MEMBER_KICK',
});
const fetchedLogs2 = await member.guild.fetchAuditLogs({
limit: 1,
type: 'MEMBER_BAN_ADD',
});
const kickLog = fetchedLogs1.entries.first() // get the first log
const banLog = fetchedLogs2.entries.first()
if(kickLog.target.id != member.id || kickLog.createdAt < member.joinedAt){
if(banLog.target.id != member.id || banLog.createdAt < member.joinedAt){
return member.guild.channels.cache.get(bsCBots.channels['entryway'].id).send(member.user.tag+" left") // no log, so user left
}
else{
return
}
}
const { executor, target } = kickLog // get args
if(!kickLog.createdAt < member.joinedAt){
if(target.id === member.id) { // if the log is about the kicked member
member.guild.channels.cache.get(bsCBots.channels['entryway'].id).send(member.user.tag+" got kicked by "+executor.tag+", L") // user got kicked
}
else{
}
}
});
// member got banned
bot.on('guildBanAdd', async (guild, user) => {
const fetchedLogs = await guild.fetchAuditLogs({
limit: 1,
type: 'MEMBER_BAN_ADD',
});
// Since we only have 1 audit log entry in this collection, we can simply grab the first one
const banLog = fetchedLogs.entries.first()
// Let's perform a coherence check here and make sure we got *something*
if (!banLog) return guild.channels.cache.get(bsCBots.channels['entryway'].id).send(user.tag+" got banned") // user left idk
// We now grab the user object of the person who banned the user
// Let us also grab the target of this action to double check things
const { executor, target } = banLog
// And now we can update our output with a bit more information
// We will also run a check to make sure the log we got was for the same kicked member
if (target.id === user.id) {
guild.channels.cache.get(bsCBots.channels['entryway'].id).send(target.tag+" got banned by "+executor.tag+", big fat L to you mister") // user left idk
}
else{
}
});
Am I doing this wrong? Please help!
EDIT: This is now the code:
// member got kicked/left the server
bot.on('guildMemberRemove', async member => {
const fetchedLogs1 = await member.guild.fetchAuditLogs({ // get audit log entry for kicks
limit: 1,
type: 'MEMBER_KICK',
});
const fetchedLogs2 = await member.guild.fetchAuditLogs({ // get audit log entry for bans
limit: 1,
type: 'MEMBER_BAN_ADD',
});
const kickLog = fetchedLogs1.entries.first() // get the first kick log
const banLog = fetchedLogs2.entries.first() // get the first ban log
if(kickLog.target.id === member.user.id && kickLog.createdAt > member.joinedAt){ // is the kick log valid?
var reason = "*No reason provided*"
if(kickLog.reason){
reason = kickLog.reason
}
const embed = { // make embed
"title": ":hiking_boot: GET OUT",
"color": 11141120,
"thumbnail": {
"url": member.user.displayAvatarURL()
},
"fields": [
{
"name": member.user.tag,
"value": "(id: "+member.user.id+")"
},
{
"name": "Has been **KICKED** from the server by "+kickLog.executor.tag+" with reason:",
"value": reason
}
]
};
return member.guild.channels.cache.get(bsCBots.channels['entryway'].id).send({ embed }) // user got kicked
}
else{ // kick log is not valid
if(banLog.target.id === member.user.id && banLog.createdAt > member.joinedAt){ // is ban log valid?
var reason = "*No reason provided*"
if(banLog.reason){
reason = banLog.reason
}
const embed = { // make embed
"title": ":banHammer: DONT COME BACK",
"color": 11141120,
"thumbnail": {
"url": member.user.displayAvatarURL()
},
"fields": [
{
"name": member.user.tag,
"value": "(id: "+member.user.id+")"
},
{
"name": "Has been ***BANNED*** from the server by "+banLog.executor.tag+" with reason:",
"value": reason
}
]
};
return member.guild.channels.cache.get(bsCBots.channels['entryway'].id).send({ embed }) // user got banned
}
else{ // ban log not valid
const embed = { // make embed
"title": ":wave: Goodbye!",
"color": 11141120,
"thumbnail": {
"url": member.user.displayAvatarURL()
},
"fields": [
{
"name": member.user.tag,
"value": "(id: "+member.user.id+")"
},
{
"name": "Has left the server",
"value": "See you around!"
}
]
};
return member.guild.channels.cache.get(bsCBots.channels['entryway'].id).send({ embed }) // no log, so user left
}
}
});
It works, but sometimes doesnt detect if user got banned, it just says the left
Upvotes: 0
Views: 708
Reputation: 19
Ehhh forget it, Ill just go the simple way, without the kick/ban thing.
But of course, if you have an answer, feel free to post it!
Upvotes: 0
Reputation: 825
The guildBanAdd
fires whenever a new ban is added to the ban list, so if you just remove that bit of the code you should be fine, guildMemberRemove can be classified as kick/ban/leave using the audit logs as you have done.
Upvotes: 1