Martin
Martin

Reputation: 89

Discord Bot Logger

Could someone help me to get that script working? I guess it's not updated to the newest Discord API.

I just need three things: A logger with nickname change, username change and avatar change.

Already made myself working logger with a role change and a welcome message when someone new just gets in but these three seems to be broken as hell.

bot.on('guildMemberUpdate', function(guild, oldMember, newMember) {

    //declare changes
    var Changes = {
        unknown: 0,
        addedRole: 1,
        removedRole: 2,
        username: 3,
        nickname: 4,
        avatar: 5
    };
    var change = Changes.unknown;

    //check if username changed
    if (newMember.user.username != oldMember.user.username)
        change = Changes.username;

    //check if nickname changed
    if (newMember.nickname != oldMember.nickname)
        change = Changes.nickname;

    //check if avatar changed
    if (newMember.user.avatarURL != oldMember.user.avatarURL)
        change = Changes.avatar;

    //log to console
    switch (change) {
        case Changes.unknown:
            console.log('[' + guild.name + '][UPDUSR] ' + newMember.user.username + '#' + newMember.user.discriminator);
            break;


        case Changes.username:
            console.log('[' + guild.name + '][UPDUSRNM] ' + oldMember.user.username + '#' + oldMember.user.discriminator +
                ' is now ' + newMember.user.username + '#' + newMember.user.discriminator);
            break;
        case Changes.nickname:
            console.log('[' + guild.name + '][UPDUSRNK] ' + newMember.user.username + '#' + newMember.user.discriminator +
                (oldMember.nickname != null ? ' (' + oldMember.nickname + ')' : '') +
                (newMember.nickname != null ? ' is now ' + newMember.nickname : ' no longer has a nickname.'));
            break;
        case Changes.avatar:
            console.log('[' + guild.name + '][UPDAVT] ' + newMember.user.username + '#' + newMember.user.discriminator);
            break;
    }

    //post in the guild's log channel
    var log = guild.channels.find('name', CHANNEL);
    if (log != null) {
        switch (change) {
            case Changes.unknown:
                log.sendMessage('**[User Update]** ' + newMember);
                break;


            case Changes.username:
                log.sendMessage('**[User Username Changed]** ' + newMember + ': Username changed from ' +
                    oldMember.user.username + '#' + oldMember.user.discriminator + ' to ' +
                    newMember.user.username + '#' + newMember.user.discriminator);
                break;
            case Changes.nickname:
                log.sendMessage('**[User Nickname Changed]** ' + newMember + ': ' +
                    (oldMember.nickname != null ? 'Changed nickname from ' + oldMember.nickname +
                        +newMember.nickname : 'Set nickname') + ' to ' +
                    (newMember.nickname != null ? newMember.nickname + '.' : 'original username.'));
                break;
            case Changes.avatar:
                log.sendMessage('**[User Avatar Changed]** ' + newMember);
                break;
        }
    }

});

Upvotes: 0

Views: 704

Answers (2)

Daemon Beast
Daemon Beast

Reputation: 2909

There are a few issues:

  1. The guildMemberUpdate event only passes two parameters: oldMember and newMember. It does not pass a guild parameter as shown in your code.
  2. Since no guild parameter is passed, you need to change all references to guild with newMember.guild.
  3. guild.channels now requires .cache to be appended on the end: guild.channels.cache. For more information, read the Discord.js migration guide.
  4. The Discord.Collection() .find() method now only accepts a function.
  5. .sendMessage() needs to be replaced with .send().
  6. .avatarURL needs to be replaced with .displayAvatarURL().

Side Note: why don't you use newMember.user.tag instead of newMember.user.username + '#' + newMember.user.discriminator?

Here is the modified code:

bot.on('guildMemberUpdate', function(oldMember, newMember) {

    //declare changes
    var Changes = {
        unknown: 0,
        addedRole: 1,
        removedRole: 2,
        username: 3,
        nickname: 4,
        avatar: 5
    };
    var change = Changes.unknown;

    //check if username changed
    if (newMember.user.username !== oldMember.user.username)
        change = Changes.username;

    //check if nickname changed
    if (newMember.nickname !== oldMember.nickname)
        change = Changes.nickname;

    //check if avatar changed
    if (newMember.user.displayAvatarURL() !== oldMember.user.displayAvatarURL())
        change = Changes.avatar;

    //log to console
    switch (change) {
        case Changes.unknown:
            console.log('[' + newMember.guild.name + '][UPDUSR] ' + newMember.user.username + '#' + newMember.user.discriminator);
            break;


        case Changes.username:
            console.log('[' + newMember.guild.name + '][UPDUSRNM] ' + oldMember.user.username + '#' + oldMember.user.discriminator +
                ' is now ' + newMember.user.username + '#' + newMember.user.discriminator);
            break;
        case Changes.nickname:
            console.log('[' + newMember.guild.name + '][UPDUSRNK] ' + newMember.user.username + '#' + newMember.user.discriminator +
                (oldMember.nickname != null ? ' (' + oldMember.nickname + ')' : '') +
                (newMember.nickname != null ? ' is now ' + newMember.nickname : ' no longer has a nickname.'));
            break;
        case Changes.avatar:
            console.log('[' + newMember.guild.name + '][UPDAVT] ' + newMember.user.username + '#' + newMember.user.discriminator);
            break;
    }

    //post in the guild's log channel
    var log = newMember.guild.channels.cache.find(channel => channel.name === CHANNEL);
    if (log) {
        switch (change) {
            case Changes.unknown:
                log.send('**[User Update]** ' + newMember);
                break;


            case Changes.username:
                log.send('**[User Username Changed]** ' + newMember + ': Username changed from ' +
                    oldMember.user.username + '#' + oldMember.user.discriminator + ' to ' +
                    newMember.user.username + '#' + newMember.user.discriminator);
                break;
            case Changes.nickname:
                log.send('**[User Nickname Changed]** ' + newMember + ': ' +
                    (oldMember.nickname != null ? 'Changed nickname from ' + oldMember.nickname +
                        +newMember.nickname : 'Set nickname') + ' to ' +
                    (newMember.nickname != null ? newMember.nickname + '.' : 'original username.'));
                break;
            case Changes.avatar:
                log.send('**[User Avatar Changed]** ' + newMember);
                break;
        }
    }

});

Upvotes: 0

Static
Static

Reputation: 786

The following line is causing your program to error:

    var log = guild.channels.find('name', CHANNEL);

In discord.js v12, you need to use a function and use the .cache.

Here is the corrected ver:

    var log = guild.channels.cache.find(c => c.name == CHANNEL);

Upvotes: 2

Related Questions