I'm trying to make a little Discord bot with Discord.js, but in my admin command, it throws this error when trying to add a player to a table:
C:\Users\Mark\Desktop\DiscCentral\bot.js:49
if(ServerAdmins[1]) {
^
TypeError: Cannot read property '1' of undefined
at Client.client.on (C:\Users\Mark\Desktop\DiscCentral\bot.js:49:20)
at emitOne (events.js:116:13)
at Client.emit (events.js:211:7)
at MessageCreateHandler.handle (C:\Users\Mark\Desktop\DiscCentral\node_modules\discord.js\src\client\websocket\packets\handlers\MessageCreate.js:9:34)
at WebSocketPacketManager.handle (C:\Users\Mark\Desktop\DiscCentral\node_modules\discord.js\src\client\websocket\packets\WebSocketPacketManager.js:103:65)
at WebSocketConnection.onPacket (C:\Users\Mark\Desktop\DiscCentral\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:333:35)
at WebSocketConnection.onMessage (C:\Users\Mark\Desktop\DiscCentral\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:296:17)
at WebSocket.onMessage (C:\Users\Mark\Desktop\DiscCentral\node_modules\discord.js\node_modules\ws\lib\event-target.js:120:16)
at emitOne (events.js:116:13)
at WebSocket.emit (events.js:211:7)
Heres my code:
if(command === 'admin') {
if(message.member.roles.find("name", "Owner")){
var ServerExists = false;
for(var ServerId; ServerId<Admins.length; ServerId++) {
if(Admins[ServerId] === message.member.server.id) {
ServerExists = true;
}
}
if(ServerExists === false) {
var NewServer = Admins[Admins.length + 1]
NewServer = {};
}
for(var ServerId; ServerId<Admins.length; ServerId++) {
if(Admins[ServerId] === message.member.server.id) {
var ServerNumber = ServerId
}
}
var ServerAdmins = Admins[ServerNumber]
if(ServerAdmins[1]) {
ServerAdmins[1] = message.member.server.id;
} else {
ServerAdmins[ServerAdmins.length + 1] = message.member.server.id;
message.reply(`${ServerAdmins[ServerAdmins.length]} was added.`)
}
}
I'm assuming the problem is that I'm using a table inside of a table, but I don't know how to assign ranks to each server any other way.
Any suggestions on what I should do?
It doesn't look like you declare the Admins variable in your code, at least the code that you presented. Show us how you define it? As right now, that would be why it's giving you errors.
Related
static description = 'Get information on a mentioned user.';
static usage = '<#user|id>';
static names = ['userinfo', 'ui'];
static userPerms = [];
static botPerms = [];
async execute(client, message) {
var permissions = [];
var acknowledgements = 'None';
const args = this.message.content.trim().split(/ +/g);
var user = this.message.mentions.users.first() || this.message.author;
const member = this.message.mentions.members.first() || this.message.guild.members.cache.get(args[0]) || this.message.member;
const randomColor = "#000000".replace(/0/g, function () { return (~~(Math.random() * 16)).toString(16); });
if(this.message.member.hasPermission("KICK_MEMBERS")){
permissions.push("Kick Members");
}
if(this.message.member.hasPermission("BAN_MEMBERS")){
permissions.push("Ban Members");
}
if(this.message.member.hasPermission("ADMINISTRATOR")){
permissions.push("Administrator");
}
if(this.message.member.hasPermission("MANAGE_MESSAGES")){
permissions.push("Manage Messages");
}
if(this.message.member.hasPermission("MANAGE_CHANNELS")){
permissions.push("Manage Channels");
}
if(this.message.member.hasPermission("MENTION_EVERYONE")){
permissions.push("Mention Everyone");
}
if(this.message.member.hasPermission("MANAGE_NICKNAMES")){
permissions.push("Manage Nicknames");
}
if(this.message.member.hasPermission("MANAGE_ROLES")){
permissions.push("Manage Roles");
}
if(this.message.member.hasPermission("MANAGE_WEBHOOKS")){
permissions.push("Manage Webhooks");
}
if(this.message.member.hasPermission("MANAGE_EMOJIS")){
permissions.push("Manage Emojis");
}
if(!permissions.length == 0){
permissions.push("No Key Permissions Found");
}
if(this.member.user.id == message.guild.ownerID){
acknowledgements = 'Server Owner';
}
const embed = new Discord.MessageEmbed()
.setDescription(`<#${member.user.id}>`)
.setAuthor(`${member.user.tag}`, member.user.displayAvatarURL)
.setColor(randomColor)
.setFooter(`ID: ${message.author.id}`)
.setThumbnail(member.user.displayAvatarURL)
.setTimestamp()
.addField("Status",`${status[member.user.presence.status]}`, true)
.addField('Joined at: ',`${moment(member.joinedAt).format("dddd, MMMM Do YYYY, HH:mm:ss")}`, true)
.addField("Created at: ",`${moment(message.author.createdAt).format("dddd, MMMM Do YYYY, HH:mm:ss")}`, true)
.addField("Permissions: ", `${permissions.join(', ')}`, true)
.addField(`Roles [${member.roles.cache.filter(r => r.id !== message.guild.id).map(roles => `\`${roles.name}\``).length}]`,`${member.roles.cache.filter(r => r.id !== message.guild.id).map(roles => `<#&${roles.id }>`).join(" **|** ") || "No Roles"}`, true)
.addField("Acknowledgements: ", `${acknowledgements}`, true);
this.message.channel.send({embed});
}
}
**I have tried to define user but it's not working. error:
TypeError: Cannot read property 'user' of undefined.
Whenever i used ,userinfo it's not responding anything. I don't know why this happend, but if you find any other error in the code, can you help me fix it too? Thank you.
but that didn't do anything to help.
What am i missing here?**
this.member.user.id
Should be
member.user.id
Look for “something”.user for errors like that. Then figure out why the something is undefined.
Here is my entire code for my ban command. Good to note I am using Discord.JS Commando as well I have been struggling with this error but literally cannot figure out why I am getting it everything looks fine unless I have used a deprecated function. Would really appreciate someone to help me on this one I've been getting along quite well creating a rich featured bot before this happened.
const { Command } = require('discord.js-commando');
const { MessageEmbed } = require('discord.js');
const db = require('quick.db');
module.exports = class banCommand extends Command {
constructor(client) {
super(client, {
name: 'ban',
memberName: "ban",
group: 'moderation',
guildOnly: true,
userPermissions: ['BAN_MEMBERS'],
description: 'Bans the mentioned user from the server with additional modlog info.'
});
}
async run(message, args) {
if (!args[0]) return message.channel.send('**Please Provide A User To Ban!**')
let banMember = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.guild.members.cache.find(r => r.user.username.toLowerCase() === args[0].toLocaleLowerCase()) || message.guild.members.cache.find(ro => ro.displayName.toLowerCase() === args[0].toLocaleLowerCase());
if (!banMember) return message.channel.send('**User Is Not In The Guild**');
if (banMember === message.member) return message.channel.send('**You Cannot Ban Yourself**')
var reason = args.slice(1).join(' ');
if (!banMember.bannable) return message.channel.send('**Cant Kick That User**')
banMember.send(`**Hello, You Have Been Banned From ${message.guild.name} for - ${reason || 'No Reason'}**`).then(() =>
message.guild.members.ban(banMember, { days: 7, reason: reason })).catch(() => null)
message.guild.members.ban(banMember, { days: 7, reason: reason })
if (reason) {
var sembed = new MessageEmbed()
.setColor('GREEN')
.setAuthor(message.guild.name, message.guild.iconURL())
.setDescription(`**${banMember.user.username}** has been banned for ${reason}`)
message.channel.send(sembed)
} else {
var sembed2 = new MessageEmbed()
.setColor('GREEN')
.setAuthor(message.guild.name, message.guild.iconURL())
.setDescription(`**${banMember.user.username}** has been banned`)
message.channel.send(sembed2)
}
let channel = db.fetch(`modlog_${message.guild.id}`)
if (channel == null) return;
if (!channel) return;
const embed = new MessageEmbed()
.setAuthor(`${message.guild.name} Modlogs`, message.guild.iconURL())
.setColor('#ff0000')
.setThumbnail(banMember.user.displayAvatarURL({ dynamic: true }))
.setFooter(message.guild.name, message.guild.iconURL())
.addField('**Moderation**', 'ban')
.addField('**Banned**', banMember.user.username)
.addField('**ID**', `${banMember.id}`)
.addField('**Banned By**', message.author.username)
.addField('**Reason**', `${reason || '**No Reason**'}`)
.addField('**Date**', message.createdAt.toLocaleString())
.setTimestamp();
var sChannel = message.guild.channels.cache.get(channel)
if (!sChannel) return;
sChannel.send(embed)
}
};
The reason you are getting the TypeError: args.slice(...).join is not a function error is because the slice method creates a new array of the sliced data, and so can not join(' ') since there is no space to join with. (i.e. it is not a string)
What you are looking for is args.slice(1).toString().replace(",", " ")
This removes the 2nd part of the args array object, then converts it to a string, then removes the commas in the string and replaces them with spaces.
Hello I am trying to write a discordbot that syncs a role A on members in guild A to guildB
those Roles are defined by ID
the problem i have is that var users1 = guild1.roles.fetch(args[2]).members; //guild1role throws
(node:54852) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'fetch' of undefined
at SyncRole.run (D:\git\purgebot\Commands\General\syncrole.js:49:37)
at Message.run (D:\git\purgebot\Events\message.js:49:13)
at Luna.<anonymous> (D:\git\purgebot\Luna.js:92:83)
at Luna.emit (events.js:314:20)
at MessageCreateAction.handle (D:\git\purgebot\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
at Object.module.exports [as MESSAGE_CREATE] (D:\git\purgebot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
at WebSocketManager.handlePacket (D:\git\purgebot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
at WebSocketShard.onPacket (D:\git\purgebot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
at WebSocketShard.onMessage (D:\git\purgebot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
at WebSocket.onMessage (D:\git\purgebot\node_modules\ws\lib\event-target.js:132:16)
Here is the source code of the part that syncs the roles (line 1 = line 37)
const client = this.client;
if(message.member.guild.me.hasPermission('ADMINISTRATOR')) {
var guild1 = client.guilds.fetch(args[0]); //guildid1
var guild2 = client.guilds.fetch(args[1]); //guildid1
var users1 = guild1.roles.fetch(args[2]).members; //guild1role
var users2 = guild2.roles.fetch(args[3]).members; //guild2role
users2.members.forEach(user => {
user.remove(args[3]).catch(console.error);
message.channel.send("removed role " + args[3] + " for " + user.id);
})
users1.members.forEach(user =>{
guild2.members.forEach(user2 => {
if(user.id == user2.id) {
user2.addRole(args[3]);
message.channel.send("added role " + args[3] + " for " + user.id);
}
})
})
message.channel.send("roles synced");
} else {
message.channel.send("https://i.imgur.com/6cpffM4.jpg");
}
GuildManager.fetch() returns a Promise, which must be resolved before you can use the Guild object. So does RoleManager.fetch()
// using `Promise.prototype.then()`
client.guilds.fetch(args[0]).then((guildid1) => {
client.guilds.fetch(args[1]).then((guildid2) => {
let users1, users2;
guild1.roles.fetch(args[2]).then((role) => (users1 = role.members));
guild2.roles.fetch(args[3]).then((role) => (users2 = role.members));
// code...
});
});
// using `async/await`
// **make sure your function is `async`**
const guild1 = await client.guilds.fetch(args[0]);
const guild2 = await client.guilds.fetch(args[1]);
const users1 = (await guild1.roles.fetch(args[2])).members;
const users2 = (await guild2.roles.fetch(args[3])).members;
When I do my play command, my bot works, but when I do my stop command, it gives me a bunch of errors. I am using FFmpeg and discord.js. My code is:
const Discord = require('discord.js');
const bot = new Discord.Client
const ytdl = require("ytdl-core")
const token = 'MY API TOKEN'
const PREFIX = '?';
var version = '1.2';
var servers = {};
bot.on('ready', () => {
console.log('This bot is online!' + version);
})
bot.on('message', message => {
let args = message.content.substring(PREFIX.length).split(" ");
switch (args[0]) {
case 'play':
function play(connection, message) {
var server = servers[message.guild.id];
server.dispatcher = connection.play(ytdl(server.queue[0], { filter: "audioonly" }))
server.queue.shift();
server.dispatcher.on("end", function () {
if (server.queue[0]) {
play(connection, message);
} else {
connection.disconnect();
}
});
}
if (!args[1]) {
message.channel.send("You need to provide a link!")
return;
}
if (!message.member.voice.channel) {
message.channel.send("You must be in a Voice Channel to play the bot!")
return;
}
if (!servers[message.guild.id]) servers[message.guild.id] = {
queue: []
}
var server = servers[message.guild.id];
server.queue.push(args[1]);
if (!message.guild.voice) message.member.voice.channel.join().then(function (connection) {
play(connection, message);
})
break;
case 'skip':
var server = servers[message.guild.id]
if (servers.dispatcher) server.dispatcher.end()
message.channel.send("Skipping the song...")
break;
case 'stop':
if (message.guild.voice.connection) {
for (var i = server.queue.length - 1; i >= 0; i--) {
server.queue.splice(i, 1);
}
server.dispatcher.end();
message.channel.send("Ending the queue leaving the voice channel!")
console.log('stopped the queue')
}
if (message.guild.connection) message.guild.connection.voice.disconnect();
break;
}
});
bot.login(token);
When I play, it works just fine. But when I stop the music, I get this error:
TypeError: Cannot read property 'queue' of undefined
at Client.<anonymous> (C:\Users\picar\Desktop\DiscordMusicBot\index.js:79:36)
at Client.emit (events.js:315:20)
at MessageCreateAction.handle (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
at Object.module.exports [as MESSAGE_CREATE] (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
at WebSocketManager.handlePacket (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:386:31)
at WebSocketShard.onPacket (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:436:22)
at WebSocketShard.onMessage (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:293:10)
at WebSocket.onMessage (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\ws\lib\event-target.js:125:16)
at WebSocket.emit (events.js:315:20)
at Receiver.receiverOnMessage (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\ws\lib\websocket.js:800:20)
case 'stop':
if (message.guild.voice.connection) {
var server = servers[message.guild.id]; // I think this could be useful
for (var i = server.queue.length - 1; i >= 0; i--) {
server.queue.splice(i, 1);
}
server.dispatcher.end();
message.channel.send("Ending the queue leaving the voice channel!")
console.log('stopped the queue')
}
if (message.guild.connection) message.guild.connection.voice.disconnect();
break;
Here is the code I have right now
module.exports ={
name:'purge',
description:'Clears the number of messages you set in a seccond ARG.',
aliases:['clear','nuke'],
execute(msg, args)
{
if(!msg.member.hasPermission("MANAGE_MESSAGES")) {
return msg.reply("You do not have permission to run this command").then(msg => msg.delete(5000));
}
if (!isNaN(args[0]) || parseInt(args[0]) <= 0) {
return msg.reply("That is not a number").then(msg => msg.delete(5000));
}
if(!msg.guild.me.hasPermission("MANAGE_MESSAGES")) {
return msg.reply("Sorry I can't messages please make sure i have the correct permissions").then(msg => msg.delete());
}
let deleteAmount;
if(parseInt(args[0]) > 100) {
deleteAmount = 100;
} else {
deleteAmount = parseInt(args[0]);
}
msg.channel.bulkDelete(deleteAmount, true);
}
}
Error:
(node:25048) UnhandledPromiseRejectionWarning: TypeError [MESSAGE_BULK_DELETE_TYPE]: The messages must be an Array, Collection, or number.
at TextChannel.bulkDelete (C:\StrangeOccBot\node_modules\discord.js\src\structures\interfaces\TextBasedChannel.js:364:11)
at Object.execute (C:\StrangeOccBot\commands\purge.js:27:21)
at Client.<anonymous> (C:\StrangeOccBot\index.js:46:39)
at Client.emit (events.js:315:20)
at WebSocketShard.onPacket (C:\StrangeOccBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:436:22)
at WebSocketShard.onMessage (C:\StrangeOccBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:293:10)
at WebSocket.onMessage (C:\StrangeOccBot\node_modules\ws\lib\event-target.js:120:16)
So I'm not sure if an int is still the way to do it with bulkDelete()
but as far as I know, you can fetch messages in a channel and pass those to the method!
msg.channel.messages.fetch({ limit: deleteAmount }).then(messages => {
msg.channel.bulkDelete(messages).then(deleted => {
msg.channel.send(`${deleted.size} messages pruged!`).then(msg => msg.delete(5000));
})
})
This is the way how I have done it for the last few times I created functions like what you try to archive.
Also you can add .catch() methods to the .then() methods so you can check if something went wrong or not!
Edit: I changed your code a little bit especially at the end so you have an idea how I would have done it to archive what you wanna archive
module.exports ={
name:'purge',
description:'Clears the number of messages you set in a seccond ARG.',
aliases:['clear','nuke'],
execute(msg, args) {
if (!msg.member.hasPermission("MANAGE_MESSAGES")) {
return msg.reply("You do not have permission to run this command").then(msg => msg.delete(5000));
}
if (!msg.guild.me.hasPermission("MANAGE_MESSAGES")) {
return msg.reply("Sorry I can't messages please make sure i have the correct permissions").then(msg => msg.delete());
}
if (!isNaN(args[0]) || parseInt(args[0]) <= 0) {
return msg.reply("That is not a number").then(msg => msg.delete(5000));
}
// I changed this slightly to how I would do it!
let deleteAmount = 100;
if (parseInt(args[0]) < 100) {
deleteAmount = parseInt(args[0])
}
// If I'm not mistaken, the bulkDelete() method also works with fetched messages in an variable.
// To archive this, you can use `msg.channel.messages.fetch()` as I will show below!
// Ofcourse I did not use the .catch() method, so if something isn't correctly done it can cause issues!
msg.channel.messages.fetch({ limit: deleteAmount }).then(messages => {
msg.channel.bulkDelete(messages).then(deleted => {
msg.reply(`${deleted.size} messages pruged!`).then(msg => msg.delete(5000));
})
})
}
}