What are flags, discord js - discord.js

'id' => User {
id: 'id',
username: 'name',
bot: false,
discriminator: '5934',
avatar: 'a35fb962a0cc48d957a07ce36ab73a9c',
flags: [UserFlags],
lastMessageID: null,
lastMessageChannelID: null
What does flags: [UserFlags] mean ?
I removed the id and name for privacy purposes.

Per the Discord.js and Discord documentation, flags are the "badges" on your profile for things such as HypeSquad and Discord Employees.

Related

A Discord Bot Embed Error: DiscordAPIError: Cannot send an empty message

I've tried writing a discord bot, nearly finished it but this error just appeared and I don't know what's wrong with the code.
The Error:
DiscordAPIError: Cannot send an empty message
at RequestHandler.execute (C:\Users\user\OneDrive\Desktop\discordbot\node_modules\discord.js\src\rest\RequestHandler.js:350:13)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async RequestHandler.push (C:\Users\user\OneDrive\Desktop\discordbot\node_modules\discord.js\src\rest\RequestHandler.js:51:14)
at async TextChannel.send (C:\Users\user\OneDrive\Desktop\discordbot\node_modules\discord.js\src\structures\interfaces\TextBasedChannel.js:176:15) {
method: 'post',
path: '/channels/991019562625552466/messages',
code: 50006,
httpStatus: 400,
requestData: {
json: {
content: undefined,
tts: false,
nonce: undefined,
embeds: undefined,
components: undefined,
username: undefined,
avatar_url: undefined,
allowed_mentions: undefined,
flags: undefined,
message_reference: undefined,
attachments: undefined,
sticker_ids: undefined
},
files: []
}
}
The code:
module.exports = {
name: 'command',
description: "Embeds!",
execute(message, args, Discord) {
const newEmbed = new Discord.MessageEmbed()
.setColor('#FF0000')
.setTitle('This is a title.')
.setURL('https://www.youtube.com')
.setDescription('This is an embed.')
.addFields(
{name: 'Field 1', value: 'Text 1'},
{name: 'Field 2', value: 'Text 2'},
{name: 'Field 3', value: 'Text 3'}
)
.setImage('https://upload.wikimedia.org/wikipedia/commons/9/9a/Gull_portrait_ca_usa.jpg')
message.channel.send(newEmbed);
}
}
What's the problem?
As of discord.js v13 embeds are sent via the MessageOptions object passed to the send method.
Updated code would be:
message.channel.send({embeds: [newEmbed]});
Documentation:
BaseGuildTextChannel#send takes
<MessageOptions> extends <BaseMessageOptions>

How do you lock slash commands for everyone?

Right now all my discord.js slash commands are usable by everyone but I want to lock some to being used only by admins. My code (in my index.js) is below but it's not doing anything because I can't figure out how to set everyone's perms to false as a base. Where am I going wrong?
const modperms = [
{
id: '123456789012345678',
permissions: [{
id: '123456789012345678',
type: 'ROLE',
permission: false,
}],
},
{
id: '123456789012345678',
permissions: [{
id: 'aroleid',
type: 'ROLE',
permission: true,
}],
}
];
client.guilds.cache.get('aguildid')?.commands.fetch('about').permissions.add({ modperms });```
Check out the official guide.
If you set defaultPermission: false when creating a command, you can
immediately disable it for everyone, including guild administrators
and yourself.
And then enable it for a specific role
const permissions = [
{
id: '123456789012345678',
type: 'ROLE',
permission: true,
},
];
await command.permissions.add({ permissions });

Discord.js V13 msg.author.id returning undefined

I have this message, and it has multiple values inside of it, and I'm trying to access the author.id part. I thought I was supposed to do something like msg.author.id, but that just returns undefined.
[
'918149237416558622',
<ref *1> Message {
channelId: '918144635782701097',
guildId: '906210773989203990',
deleted: false,
id: '918149237416558622',
createdTimestamp: 1638974236588,
type: 'DEFAULT',
system: false,
content: 'jamaal',
author: User {
id: '346315018696130563',
bot: false,
system: false,
flags: [UserFlags],
username: 'yAy',
discriminator: '4998',
avatar: 'ddaae73d9a3c8ebf564f2dd1c664bcb4',
banner: undefined,
accentColor: undefined
},
pinned: false,
tts: false,
nonce: null,
embeds: [],
components: [],
attachments: Collection(0) [Map] {},
stickers: Collection(0) [Map] {},
editedTimestamp: null,
reactions: ReactionManager { message: [Circular *1] },
mentions: MessageMentions {
everyone: false,
users: Collection(0) [Map] {},
roles: Collection(0) [Map] {},
_members: null,
_channels: null,
crosspostedChannels: Collection(0) [Map] {},
repliedUser: null
},
webhookId: null,
groupActivityApplication: null,
applicationId: null,
activity: null,
flags: MessageFlags { bitfield: 0 },
reference: null,
interaction: null
]
Do I have to add some extra parts or something? I tried doing things like msg[0].author.id, but it still returns undefined either way. Can anyone help me out here?
Nevermind, I found the answer. I was supposed to do msg[1].author.id instead of msg.author.id

Discord.js v13 Invite tracker

Finally getting around to updating my bot from v12 to v13 and having an issue that I can't seem to solve. I have an invite tracker that works perfectly on v12 but will not function on v13. I have included the code below, the commented lines are the v12 code that I know needed changing for v13.
// const Discord = require('discord.js')
const {
Client,
Intents
} = require('discord.js')
// const client = new Discord.Client({
// partials: ['MESSAGE', 'CHANNEL', 'REACTION']
// })
const client = new Client({
intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_BANS, Intents.FLAGS.GUILD_EMOJIS_AND_STICKERS, Intents.FLAGS.GUILD_INTEGRATIONS, Intents.FLAGS.GUILD_WEBHOOKS, Intents.FLAGS.GUILD_INVITES, Intents.FLAGS.GUILD_VOICE_STATES, Intents.FLAGS.GUILD_PRESENCES, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS, Intents.FLAGS.GUILD_MESSAGE_TYPING, Intents.FLAGS.DIRECT_MESSAGES, Intents.FLAGS.DIRECT_MESSAGE_REACTIONS, Intents.FLAGS.DIRECT_MESSAGE_TYPING],
partials: ['MESSAGE', 'CHANNEL', 'REACTION']
})
const guildInvites = new Map()
// client.on('inviteCreate', async invite => guildInvites.set(invite.guild.id, await invite.guild.fetchInvites()))
client.on('inviteCreate', async invite => guildInvites.set(invite.guild.id, await invite.guild.invites.fetch()))
client.once('ready', () => {
client.guilds.cache.forEach(guild => {
//guild.fetchInvites()
guild.invites.fetch()
.then(invites => guildInvites.set(guild.id, invites))
.catch(err => {
console.log(err)
console.log(guildInvites)
client.channels.cache.get('channelId').send({
content: `${err}`
})
})
})
})
client.on('guildMemberAdd', async member => {
const cachedInvites = guildInvites.get(member.guild.id)
// const newInvites = await member.guild.fetchInvites()
const newInvites = await member.guild.invites.fetch()
guildInvites.set(member.guild.id, newInvites)
try {
const usedInvite = newInvites.find(inv => cachedInvites.get(inv.code).uses < inv.uses)
console.log(cachedInvites)
console.log(newInvites)
console.log(usedInvite)
console.log(`The code ${usedInvite.code} was just used by ${member.user.username}.`)
} catch (err) {
console.log(err)
client.channels.cache.get('channelId').send({
content: `${err}`
})
}
})
This is the console log result:
console.log(cachedInvites) => returns below
Collection(2) [Map] {
'11111111' => Invite {
guild: Guild {
id: 'xxxx',
name: "Testing Server",
icon: null,
features: [Array],
commands: [GuildApplicationCommandManager],
members: [GuildMemberManager],
channels: [GuildChannelManager],
bans: [GuildBanManager],
roles: [RoleManager],
presences: PresenceManager {},
voiceStates: [VoiceStateManager],
stageInstances: [StageInstanceManager],
invites: [GuildInviteManager],
deleted: false,
available: true,
shardId: 0,
splash: null,
banner: null,
description: null,
verificationLevel: 'LOW',
vanityURLCode: null,
nsfwLevel: 'DEFAULT',
discoverySplash: null,
memberCount: 3,
large: false,
applicationId: null,
afkTimeout: 900,
afkChannelId: 'xxxx',
systemChannelId: 'xxxx',
premiumTier: 'NONE',
premiumSubscriptionCount: 0,
explicitContentFilter: 'ALL_MEMBERS',
mfaLevel: 'NONE',
joinedTimestamp: 1633812225872,
defaultMessageNotifications: 'ONLY_MENTIONS',
systemChannelFlags: [SystemChannelFlags],
maximumMembers: 250000,
maximumPresences: null,
approximateMemberCount: null,
approximatePresenceCount: null,
vanityURLUses: null,
rulesChannelId: 'xxxx',
publicUpdatesChannelId: 'xxxx',
preferredLocale: 'en-US',
ownerId: 'xxxx',
emojis: [GuildEmojiManager],
stickers: [GuildStickerManager]
},
code: '11111111',
presenceCount: null,
memberCount: null,
temporary: false,
maxAge: 604800,
uses: 40,
maxUses: 0,
inviter: User {
id: 'xxxx',
bot: false,
system: false,
flags: [UserFlags],
username: 'xxxx',
discriminator: 'xxxx',
avatar: 'xxxx',
banner: undefined,
accentColor: undefined
},
targetUser: null,
targetApplication: null,
targetType: null,
channel: TextChannel {
type: 'GUILD_TEXT',
deleted: false,
guild: [Guild],
guildId: 'xxxx',
parentId: 'xxxx',
permissionOverwrites: [PermissionOverwriteManager],
messages: [MessageManager],
threads: [ThreadManager],
nsfw: false,
id: 'xxxx',
name: 'welcome',
rawPosition: 3,
topic: null,
lastMessageId: 'xxxx',
rateLimitPerUser: 0
},
createdTimestamp: 1633922331801,
_expiresTimestamp: null,
stageInstance: null
},
'22222222' => Invite {
guild: Guild {
id: 'xxxx',
name: "Testing Server",
icon: null,
features: [Array],
commands: [GuildApplicationCommandManager],
members: [GuildMemberManager],
channels: [GuildChannelManager],
bans: [GuildBanManager],
roles: [RoleManager],
presences: PresenceManager {},
voiceStates: [VoiceStateManager],
stageInstances: [StageInstanceManager],
invites: [GuildInviteManager],
deleted: false,
available: true,
shardId: 0,
splash: null,
banner: null,
description: null,
verificationLevel: 'LOW',
vanityURLCode: null,
nsfwLevel: 'DEFAULT',
discoverySplash: null,
memberCount: 3,
large: false,
applicationId: null,
afkTimeout: 900,
afkChannelId: 'xxxx',
systemChannelId: 'xxxx',
premiumTier: 'NONE',
premiumSubscriptionCount: 0,
explicitContentFilter: 'ALL_MEMBERS',
mfaLevel: 'NONE',
joinedTimestamp: 1633812225872,
defaultMessageNotifications: 'ONLY_MENTIONS',
systemChannelFlags: [SystemChannelFlags],
maximumMembers: 250000,
maximumPresences: null,
approximateMemberCount: null,
approximatePresenceCount: null,
vanityURLUses: null,
rulesChannelId: 'xxxx',
publicUpdatesChannelId: 'xxxx',
preferredLocale: 'en-US',
ownerId: 'xxxx',
emojis: [GuildEmojiManager],
stickers: [GuildStickerManager]
},
code: '22222222',
presenceCount: null,
memberCount: null,
temporary: false,
maxAge: 604800,
uses: 21,
maxUses: 0,
inviter: User {
id: 'xxxx',
bot: false,
system: false,
flags: [UserFlags],
username: 'xxxx',
discriminator: 'xxxx',
avatar: 'xxx',
banner: undefined,
accentColor: undefined
},
targetUser: null,
targetApplication: null,
targetType: null,
channel: TextChannel {
type: 'GUILD_TEXT',
deleted: false,
guild: [Guild],
guildId: 'xxxxx',
parentId: 'xxxx',
permissionOverwrites: [PermissionOverwriteManager],
messages: [MessageManager],
threads: [ThreadManager],
nsfw: false,
id: 'xxxx',
name: 'guest-chat',
rawPosition: 48,
topic: 'Guest Invitation Link',
lastMessageId: null,
rateLimitPerUser: 0
},
createdTimestamp: 1633969178889,
_expiresTimestamp: null,
stageInstance: null
}
}
console.log(newInvites) => returns below
Collection(2) [Map] {
'11111111' => Invite {
guild: Guild {
id: 'xxxx',
name: "Testing Server",
icon: null,
features: [Array],
commands: [GuildApplicationCommandManager],
members: [GuildMemberManager],
channels: [GuildChannelManager],
bans: [GuildBanManager],
roles: [RoleManager],
presences: PresenceManager {},
voiceStates: [VoiceStateManager],
stageInstances: [StageInstanceManager],
invites: [GuildInviteManager],
deleted: false,
available: true,
shardId: 0,
splash: null,
banner: null,
description: null,
verificationLevel: 'LOW',
vanityURLCode: null,
nsfwLevel: 'DEFAULT',
discoverySplash: null,
memberCount: 3,
large: false,
applicationId: null,
afkTimeout: 900,
afkChannelId: 'xxxx',
systemChannelId: 'xxxx',
premiumTier: 'NONE',
premiumSubscriptionCount: 0,
explicitContentFilter: 'ALL_MEMBERS',
mfaLevel: 'NONE',
joinedTimestamp: 1633812225872,
defaultMessageNotifications: 'ONLY_MENTIONS',
systemChannelFlags: [SystemChannelFlags],
maximumMembers: 250000,
maximumPresences: null,
approximateMemberCount: null,
approximatePresenceCount: null,
vanityURLUses: null,
rulesChannelId: 'xxxx',
publicUpdatesChannelId: 'xxxx',
preferredLocale: 'en-US',
ownerId: 'xxxx',
emojis: [GuildEmojiManager],
stickers: [GuildStickerManager]
},
code: '11111111',
presenceCount: null,
memberCount: null,
temporary: false,
maxAge: 604800,
uses: 40,
maxUses: 0,
inviter: User {
id: 'xxxx',
bot: false,
system: false,
flags: [UserFlags],
username: 'xxxx',
discriminator: 'xxxx',
avatar: 'xxxx',
banner: undefined,
accentColor: undefined
},
targetUser: null,
targetApplication: null,
targetType: null,
channel: TextChannel {
type: 'GUILD_TEXT',
deleted: false,
guild: [Guild],
guildId: 'xxxx',
parentId: 'xxxx',
permissionOverwrites: [PermissionOverwriteManager],
messages: [MessageManager],
threads: [ThreadManager],
nsfw: false,
id: 'xxxx',
name: 'welcome',
rawPosition: 3,
topic: null,
lastMessageId: 'xxxx',
rateLimitPerUser: 0
},
createdTimestamp: 1633922331801,
_expiresTimestamp: null,
stageInstance: null
},
'22222222' => Invite {
guild: Guild {
id: '878285237082271744',
name: "Testing Server",
icon: null,
features: [Array],
commands: [GuildApplicationCommandManager],
members: [GuildMemberManager],
channels: [GuildChannelManager],
bans: [GuildBanManager],
roles: [RoleManager],
presences: PresenceManager {},
voiceStates: [VoiceStateManager],
stageInstances: [StageInstanceManager],
invites: [GuildInviteManager],
deleted: false,
available: true,
shardId: 0,
splash: null,
banner: null,
description: null,
verificationLevel: 'LOW',
vanityURLCode: null,
nsfwLevel: 'DEFAULT',
discoverySplash: null,
memberCount: 3,
large: false,
applicationId: null,
afkTimeout: 900,
afkChannelId: 'xxxx',
systemChannelId: 'xxxx',
premiumTier: 'NONE',
premiumSubscriptionCount: 0,
explicitContentFilter: 'ALL_MEMBERS',
mfaLevel: 'NONE',
joinedTimestamp: 1633812225872,
defaultMessageNotifications: 'ONLY_MENTIONS',
systemChannelFlags: [SystemChannelFlags],
maximumMembers: 250000,
maximumPresences: null,
approximateMemberCount: null,
approximatePresenceCount: null,
vanityURLUses: null,
rulesChannelId: 'xxxx',
publicUpdatesChannelId: 'xxxx',
preferredLocale: 'en-US',
ownerId: 'xxxx',
emojis: [GuildEmojiManager],
stickers: [GuildStickerManager]
},
code: '22222222',
presenceCount: null,
memberCount: null,
temporary: false,
maxAge: 604800,
uses: 22,
maxUses: 0,
inviter: User {
id: 'xxxx',
bot: false,
system: false,
flags: [UserFlags],
username: 'xxxx',
discriminator: 'xxxx',
avatar: 'xxxx',
banner: undefined,
accentColor: undefined
},
targetUser: null,
targetApplication: null,
targetType: null,
channel: TextChannel {
type: 'GUILD_TEXT',
deleted: false,
guild: [Guild],
guildId: 'xxxx',
parentId: 'xxxx',
permissionOverwrites: [PermissionOverwriteManager],
messages: [MessageManager],
threads: [ThreadManager],
nsfw: false,
id: 'xxxx',
name: 'guest-chat',
rawPosition: 48,
topic: 'Guest Invitation Link',
lastMessageId: null,
rateLimitPerUser: 0
},
createdTimestamp: 1633969178889,
_expiresTimestamp: null,
stageInstance: null
}
}
console.log(usedInvite) => returns undefined
The error message I get is obviously:
TypeError: Cannot read property 'code' of undefined
The issue you are having most likely stems from the fact that you are saving the entire Invites Collection object in your guildInvites Map. Remember that in Javascript, when you save a single object in multiple different locations, each location still points to the same object. Basically, when you save the invites object or invite.guild.invites.fetch() to your guildInvites Map, it refers to the exact same object as newInvites will. In other words, cachedInvites and newInvites are both referring to the same object; because of this, they will contain the exact same values. Whenever an invite in newInvites is updated, it will automatically also update the invite in cachedInvites. This may be happening only now due to some changes in discord.js' code for invite management in v13.
I have not, however, looked at the discord.js source code for the new InviteManager, so it is possible that some other, similar issue is at play here. However, the solution in this answer works regardless.
Because the cache and new invite lists were both the same, the uses between the cached and used invite ended up being equal (causing the cachedInvites.get(inv.code).uses < inv.uses condition to not be met). Thus, newInvites.find() could not find the invite you were looking for, and usedInvite ended up being undefined.
There are several ways you could fix this issue. My preference is to not save the entire invites collection to your invite cache. Since you only need to know the cached invite's code and old number of uses, you only need to save that information. No need to save entire Invite objects to your cache when you only need two small pieces of information from each cached invite.
This is my proposed new structure of your cachedInvites. As you can see, it is much simpler and more efficient than before. It also solves the aforementioned possible JS issues with a single object being saved to multiple locations, by not directly saving the invites object in your cache.
Collection(2) [Map] {
'11111111' => 40,
'22222222' => 21
}
And here is my full solution, using this new, simpler structure for cached invites. I've tested it, and it works:
client.on('inviteCreate', async invite => {
const invites = await invite.guild.invites.fetch();
const codeUses = new Map();
invites.each(inv => codeUses.set(inv.code, inv.uses));
guildInvites.set(invite.guild.id, codeUses);
})
client.once('ready', () => {
client.guilds.cache.forEach(guild => {
guild.invites.fetch()
.then(invites => {
console.log("INVITES CACHED");
const codeUses = new Map();
invites.each(inv => codeUses.set(inv.code, inv.uses));
guildInvites.set(guild.id, codeUses);
})
.catch(err => {
console.log("OnReady Error:", err)
})
})
})
client.on('guildMemberAdd', async member => {
const cachedInvites = guildInvites.get(member.guild.id)
const newInvites = await member.guild.invites.fetch();
try {
const usedInvite = newInvites.find(inv => cachedInvites.get(inv.code) < inv.uses);
console.log("Cached", [...cachedInvites.keys()])
console.log("New", [...newInvites.values()].map(inv => inv.code))
console.log("Used", usedInvite)
console.log(`The code ${usedInvite.code} was just used by ${member.user.username}.`)
} catch (err) {
console.log("OnGuildMemberAdd Error:", err)
}
newInvites.each(inv => cachedInvites.set(inv.code, inv.uses));
guildInvites.set(member.guild.id, cachedInvites);
});

How do you create a role in discord.js

Hello I'm trying to make a role but I don't know-how.
Here is my code at the moment:
guild.roles.create({
data: {
name: 'muted',
permission {
SEND_MESSAGES: false,
ADD_REACTION: false
}
}
})
It says guild is not defined help. It is for my mute command.
You should use:
message.guild.roles.create({
data: {
name: 'muted',
permissions: {
SEND_MESSAGES: false,
ADD_REACTIONS: false
}
}
});

Resources