BackspaceRGB
BackspaceRGB

Reputation: 19

Leave message with kick/ban/leave

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

Answers (2)

BackspaceRGB
BackspaceRGB

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

Jytesh
Jytesh

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

Related Questions