set channel logs using discord.js - discord

I want to create a command to define a channel where the logs will be sent, I tried many things but I couldn't
client.on("messageUpdate", (message, oldMessage, newMessage) => {
const channel = client.channels.cache.get("1073738678758817863");
const embed = new Discord.EmbedBuilder()
.setTitle(`Log | Mensagem Editada.`)
.setColor('#ff00ff')
.setThumbnail(`${client.user.displayAvatarURL({ size: 2048 })}`)
.setFooter({ text: `© ${client.user.username} 2023`})
.setTimestamp(new Date())
.setDescription(`Autor da mensagemn:\n> **Usuário:** ${message.author} \n> **ID:** \`${message.author.id}\`\nCanal ‣ ${message.channel} \n\n**Mensagem antiga:** \n \`\`\`${message.content}\`\`\` \n**Mensagem nova:** \n \`\`\`${oldMessage.content}\`\`\``)
let botao = new ActionRowBuilder().addComponents(
new Discord.ButtonBuilder()
.setLabel("Ir para mensagem")
.setStyle(Discord.ButtonStyle.Link)
.setURL(`${message.url}`)
.setEmoji("📩")
)
channel.send({ embeds: [embed], components: [botao] })
})
client.on(Events.MessageDelete, async message => {
if (!message.guild) return;
const fetchedLogs = await message.guild.fetchAuditLogs({
limit: 1,
type: AuditLogEvent.MessageDelete,
});
const deletionLog = fetchedLogs.entries.first();
const { executor, target } = deletionLog;
if (target.id === message.author.id) {
const channel2 = client.channels.cache.get("1073738678758817863");
const embed2 = new Discord.EmbedBuilder()
.setTitle(`Log | Mensagem Deletada.`)
.setColor('#ff00ff')
.setFooter({ text: `© ${client.user.username} 2023`})
.setThumbnail(`${client.user.displayAvatarURL({ size: 2048 })}`)
.setTimestamp(new Date())
.setDescription(`Autor da mensagemn:\n> **Usuário:** ${message.author} \n> **ID:** \`${message.author.id}\`\nCanal ‣ ${message.channel} \n\n**Mensagem deletada:** \n \`\`\`${message.content}\`\`\`\nMensagem deletada por:\n> **Usuário:** ${executor.tag}\n> **ID:**\`${executor.id}\``)
channel2.send({ embeds: [embed2] });
} else {
const channel3 = client.channels.cache.get("1073738678758817863");
const embed3 = new Discord.EmbedBuilder()
.setTitle(`Log | Mensagem Deletada.`)
.setColor('#ff00ff')
.setFooter({ text: `© ${client.user.username} 2023`})
.setThumbnail(`${client.user.displayAvatarURL({ size: 2048 })}`)
.setTimestamp(new Date())
.setDescription(`Autor da mensagemn:\n> **Usuário:** ${message.author} \n> **ID:** \`${message.author.id}\`\nCanal ‣ ${message.channel} \n\n**Mensagem deletada:** \n \`\`\`${message.content}\`\`\`\nMensagem foi deletada por: **Ele mesmo**`)
channel3.send({ embeds: [embed3] });
}
});```

Related

discord interaction.deferUpdate() is not a function

I'm creating a message with buttons as reaction roles but do the reaction role handling in another file so it stays loaded after a reset but it either says "interaction.deferUpdate() is not a function, or in discord it says "this interaction failed" but it gave/removed the role
my code for creating the message:
const { ApplicationCommandType, ActionRowBuilder, ButtonBuilder, EmbedBuilder } = require('discord.js');
module.exports = {
name: 'role',
description: "reactionroles",
cooldown: 3000,
userPerms: ['Administrator'],
botPerms: ['Administrator'],
run: async (client, message, args) => {
const getButtons = (toggle = false, choice) => {
const row = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setLabel('member')
.setCustomId('member')
.setStyle(toggle == true && choice == 'blue' ? 'Secondary' : 'Primary')
.setDisabled(toggle),
new ButtonBuilder()
.setLabel('member2')
.setCustomId('member2')
.setStyle(toggle == true && choice == 'blue' ? 'Secondary' : 'Primary')
.setDisabled(toggle),
);
return row;
}
const embed = new EmbedBuilder()
.setTitle('Wähle eine rolle')
.setDescription('Wähle die rolle, die du gern haben möchtest')
.setColor('Aqua')
message.channel.send({ embeds: [embed], components: [getButtons()] })
.then((m) => {
const collector = m.createMessageComponentCollector();
collector.on('collect', async (i) => {
if (!i.isButton()) return;
await i.deferUpdate();
});
});
}
};
code for the reaction role:
const fs = require('fs');
const chalk = require('chalk')
var AsciiTable = require('ascii-table')
var table = new AsciiTable()
const discord = require("discord.js");
table.setHeading('Events', 'Stats').setBorder('|', '=', "0", "0")
module.exports = (client) => {
client.ws.on("INTERACTION_CREATE", async (i) => {
let guild = client.guilds.cache.get('934096845762879508');
let member = await guild.members.fetch(i.member.user.id)
let role = guild.roles.cache.find(role => role.name === i.data.custom_id);
if (!member.roles.cache.has(role.id)) {
member.roles.add(role);
} else {
member.roles.remove(role);
}
return i.deferUpdate()
})
};
The client.ws events give raw data (not discord.js objects), so the .deferUpdate() method doesn't exist there. You should be using client.on("interactionCreate")
client.on("interactionCreate", async (i) => {
// ...
return i.deferUpdate()
})

DiscordAPIError: Cannot send an empty message (discord.js v13)

I am coding a bot with the below command and it throws an error, but i don't know where is the error
i tried my best
const Discord = require("discord.js");
const client = new Discord.Client({
allowedMentions: {
parse: ["roles", "users", "everyone"],
},
intents: [
Discord.Intents.FLAGS.GUILDS,
Discord.Intents.FLAGS.GUILD_MESSAGES,
Discord.Intents.FLAGS.DIRECT_MESSAGES
]
});
const config = require("../config.json");
module.exports = {
name: "quar",
run: async (client, message, args) => {
if (!message.member.permissions.has("ADMINISTRATOR")) return;
let role = message.guild.roles.cache.find(role => role.name === "Quarantined" || role.name === "Quarantine")
let member = message.mentions.members.first() || message.guild.members.cache.get(args[0])
let reason = message.content.split(" ").slice(2).join(" ")
if(!reason) reason = "No reason given."
if(!role) return message.channel.send("❌ This server doesn't have a quarantine role!")
if(!member) return message.channel.send("❌ You didn't mention a member!")
if(member.roles.cache.has(role.id)) return message.channel.send(`❌ That user already quarantined!`)
member.roles.add(role)
.then (() => {
const embed = new Discord.MessageEmbed()
.setTitle(`✅ ${member.user.tag} was quarantined!`)
.setColor("RANDOM")
.setTimestamp()
embed.setFooter(`Requested by ${message.author.username}`)
message.channel.send(embed)
member.send(`You were quarantined in \`${message.guild.name}\`. Reason: ${reason} `).catch(error => {
message.channel.send(`❌ Can't send DM to ${member.user.tag}!`);
});
})
}
}
If I have made a mistake, please help me out
Sorry I don't speak English well
Try the below code out, I made notes along the way to explain as well as improved a small bit of code. I assume this is a collection of 2 separate files which is why they are separated. If they aren't 2 separate files, you do not need the top section, just the bottom.
const {
Client,
Intents,
MessageEmbed
} = require("discord.js");
const client = new Client({
allowedMentions: {
parse: ["roles", "users", "everyone"],
},
intents: [
Intents.FLAGS.GUILDS,
Intents.FLAGS.GUILD_MESSAGES,
Intents.FLAGS.DIRECT_MESSAGES
]
});
const config = require("../config.json");
const {
MessageEmbed,
Permissions
} = require("discord.js");
module.exports = {
name: "quar",
run: async (client, message, args) => {
if (!message.member.permissions.has(Permissions.FLAGS.ADMINISTRATOR)) return;
let role = message.guild.roles.cache.find(role => role.name === "Quarantined" || role.name === "Quarantine")
let member = message.mentions.members.first() || message.guild.members.cache.get(args[0])
let reason = message.content.split(" ").slice(2).join(" ")
if (!reason) reason = "No reason given."
if (!role) return message.channel.send("❌ This server doesn't have a quarantine role!")
if (!member) return message.channel.send("❌ You didn't mention a member!")
if (member.roles.cache.has(role.id)) return message.channel.send(`❌ That user already quarantined!`)
member.roles.add(role)
.then(() => {
const embed = new MessageEmbed()
.setTitle(`✅ ${member.user.tag} was quarantined!`)
.setColor("RANDOM")
.setTimestamp()
.setFooter({
text: `Requested by ${message.author.username}`
})
// author and footer are now structured like this
// .setAuthor({
// name: 'Some name',
// icon_url: 'https://i.imgur.com/AfFp7pu.png',
// url: 'https://discord.js.org',
// })
// .setFooter({
// text: 'Some footer text here',
// icon_url: 'https://i.imgur.com/AfFp7pu.png',
// })
message.channel.send({
embeds: [embed]
}) //embeds must be sent as an object and this was the actual line that was causing the error.
member.send(`You were quarantined in \`${message.guild.name}\`. Reason: ${reason} `).catch(() => { // if error is not used, it is not required to be stated
message.channel.send(`❌ Can't send DM to ${member.user.tag}!`);
});
})
}
}

Discord js - Ticket system

TICKET PROBLEM
When I reopen the ticket and want to close it again, the "interaction.channel.edit" function is not working, why?
There are no errors, version v13
When I close my ticket before reopening, everything is fine
//Now I am writing a sample message because they are stating that I wrote the code alone
const client = require("../index");
const { createTranscript } = require('discord-html-transcripts');
const { MessageEmbed, MessageActionRow, MessageButton, Message } = require("discord.js");
client.on("interactionCreate", async (interaction) => {
// Slashe
if (interaction.isCommand()) {
await interaction.deferReply({ ephemeral: false }).catch((error) => { console.log(error)});
const cmd = client.slashCommands.get(interaction.commandName);
if (!cmd)
return interaction.followUp({ content: "Wystapil jakis blad!" });
const args = [];
for (let option of interaction.options.data) {
if (option.type === "SUB_COMMAND") {
if (option.name) args.push(option.name);
option.options?.forEach((x) => {
if (x.value) args.push(x.value);
});
} else if (option.value) args.push(option.value);
}
interaction.member = interaction.guild.members.cache.get(interaction.user.id);
cmd.run(client, interaction, args);
}
// Context menu
if (interaction.isContextMenu()) {
await interaction.deferReply({ ephemeral: false });
const command = client.slashCommands.get(interaction.commandName);
if (command) command.run(client, interaction);
}
// Buttony
if(interaction.isButton()) {
await interaction.deferUpdate()
if(interaction.customId === 'verify') {
let error = 0
const roleAdd = interaction.guild.roles.cache.get('949702807517265930')
const roleRemove = interaction.guild.roles.cache.get('949702776508792864')
if(!interaction.guild.me.permissions.has('ADMINISTRATOR')) {
const channel = interaction.guild.channels.cache.get("949716268146131066")
const embed = new MessageEmbed()
.setColor('RED')
.setTitle("ERROR")
.setDescription("Nie posiadam permissji potrzebnych do weryfikacji!")
.setTimestamp();
error = 1
channel.send({ embeds:[embed]});
}
if(interaction.guild.me.roles.highest.position <= roleAdd.position){
const channel = interaction.guild.channels.cache.get("949716268146131066")
const embed = new MessageEmbed()
.setColor('RED')
.setTitle("ERROR")
.setDescription("Moja rola jest niżej niż rola, którą dodaje podczas weryfikacji!")
.setTimestamp();
error = 1
channel.send({ embeds:[embed]});
}
if(interaction.guild.me.roles.highest.position <= roleRemove.position){
const channel = interaction.guild.channels.cache.get("949716268146131066")
const embed = new MessageEmbed()
.setColor('RED')
.setTitle("ERROR")
.setDescription("Moja rola jest niżej niż rola, którą zabieram podczas weryfikacji")
.setTimestamp();
error = 1
channel.send({ embeds:[embed]});
}
if(error > 0){
interaction.guild.members.cache.get("613438379174133770").send("Błąd podczas weryfikacji!")
return interaction.member.send("Wystąpił błąd podczas weryfikacji!");
}
await interaction.member.roles.add(roleAdd)
await interaction.member.roles.remove(roleRemove)
interaction.member.send("Pomyślnie zweryfikowano!")
}if(interaction.customId === 'ticket-open'){
if(interaction.guild.channels.cache.find(ch => ch.topic == interaction.user.id)) {
return interaction.followUp({
content: `Posiadasz już ticket!`,
ephemeral: true
})}
interaction.guild.channels.create(`Ticket-${interaction.user.username}`, {
parent: '949978511324635136',
permissionOverwrites: [{
id: interaction.user.id,
allow: ['VIEW_CHANNEL', 'SEND_MESSAGES']
},
{
id: '949701839560011797',
deny: ['VIEW_CHANNEL', 'SEND_MESSAGES']
},
{
id: client.user.id,
allow: ['VIEW_CHANNEL', 'SEND_MESSAGES']
}],
topic: interaction.user.id
})
.then(async(tick) => {
interaction.followUp({
content: `Ticket otworzony <#${tick.id}>`,
ephemeral: true
})
const tickEmbed = new MessageEmbed()
.setColor('GREEN')
.setFooter({
text: `${interaction.user.username} ${new Date().getFullYear()}`,
iconURL: interaction.user.displayAvatarURL({ dynamic: true })
})
.setTitle("Ticket")
.setDescription(`**Otworzyłeś/aś ticket, poczekaj cierpliwie, aż ktoś z administracji Cie obsłuży, nie pinguj oraz zachowaj kulturę na tickecie**`);
const closeButton = new MessageButton()
.setCustomId("close-button")
.setLabel("Zamknij")
.setEmoji("🔒")
.setStyle("SECONDARY");
const row = new MessageActionRow()
.setComponents(closeButton);
tick.send({
content: `Cześć <#${interaction.user.id}>, administracja za chwilę Cie obsłuży <#&949982338031423541>`,
embeds: [tickEmbed],
components: [row]
})
})
} if(interaction.customId === 'close-button'){
if(interaction.channel.name.includes(`zamkniety`)) return interaction.followUp({ content: 'Ticket jest już zamknięty!', ephemeral: true });
const buttonTak = new MessageButton()
.setCustomId('close-tak')
.setLabel('Zamknij')
.setStyle('SECONDARY')
const buttonNie = new MessageButton()
.setCustomId('close-nie')
.setLabel('Anuluj')
.setStyle('DANGER')
const raw = new MessageActionRow()
.setComponents([buttonTak, buttonNie])
interaction.channel.send({
content:'Czy napewno chcesz zamknąć ticket?',
components: [raw]
})
} if(interaction.customId === 'close-tak'){
const usd = interaction.guild.members.cache.get(interaction.channel.topic)
const name = usd.user.username
interaction.channel.edit({
name: "zamkniety",
permissionOverwrites: [{
id: interaction.channel.topic,
deny: ['SEND_MESSAGES', 'VIEW_CHANNEL']
}, {
id: '949701839560011797',
deny: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
}, {
id: client.user.id,
allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
}],
})
const message = await interaction.channel.messages.fetch(interaction.message.id).catch(() => null);
if (message) {
interaction.message.delete()
}
const embed = new MessageEmbed()
.setDescription(`Ticket zamknięty przez <#${interaction.user.id}>`)
interaction.channel.send({embeds:[embed]})
setTimeout(() => {
const embed2 = new MessageEmbed()
.setDescription(`\`\`\`System kontroli ticketów po zamknięciu\`\`\``)
.setColor('YELLOW');
const buttonReopen = new MessageButton()
.setCustomId("reopenButton")
.setLabel("Otworz")
.setEmoji('🔓')
.setStyle('SECONDARY')
const buttonTranscript = new MessageButton()
.setCustomId("transcriptButton")
.setLabel("Transcript")
.setEmoji('📝')
.setStyle('SECONDARY')
const buttonDelete = new MessageButton()
.setCustomId("deleteButton")
.setLabel("Usun")
.setEmoji('⛔')
.setStyle('SECONDARY')
const row = new MessageActionRow()
.setComponents([ buttonTranscript, buttonReopen, buttonDelete])
interaction.channel.send({
embeds:[embed2],
components: [row]
})
}, 500)
} if(interaction.customId === 'close-nie'){
const message = await interaction.channel.messages.fetch(interaction.message.id).catch(() => null);
if (message) {
interaction.message.delete()
}
} if(interaction.customId === 'reopenButton') {
const usd = interaction.guild.members.cache.get(interaction.channel.topic)
const name = usd.user.username
interaction.channel.edit({
permissionOverwrites: [{
id: interaction.channel.topic,
allow: ['SEND_MESSAGES', 'VIEW_CHANNEL']
}, {
id:'949701839560011797' ,
deny: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
}, {
id: client.user.id,
allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
}],
name: `ticket`
})
const embed = new MessageEmbed()
.setDescription(`Ticket został ponownie otworzony przez <#${interaction.user.id}> (${interaction.user.username})`)
.setColor('GREEN')
interaction.channel.send({embeds:[embed]})
const message = await interaction.channel.messages.fetch(interaction.message.id).catch(() => null);
if (message) {
interaction.message.delete()
}
}
// } if(interaction.customId === 'transcriptButton'){
// interaction.channel.send({ content: "Tworzenie zapisu..." })
// const user = await client.users.fetch(interaction.channel.topic)
// const transcript = await createTranscript(interaction.channel, {
// limit: -1,
// fileName: `ticket-${interaction.channel.topic}.html`,
// returnBuffer: false,
// })
// client.channels.cache.get("950383700904931368").send({
// files: [transcript]
// }).then(() => {
// interaction.channel.delete()
// })
// }
}
});

signal: segmentation fault (core dumped)

I posted about this a few days ago, but after following their suggestion it still does not seem to be working. Any idea why? I am using replit and uptime to host the bot.
I am new to coding and I just can't figure out whats wrong
Figured I would ask you guys and see if you have any idea why. Please lemme know if you have any ideas
const prefix = '?';
const Discord = require('discord.js');
const { MessageEmbed } = require('discord.js');
const bot = new Discord.Client({
intents: [
"GUILDS",
"GUILD_MESSAGES"
]
});
const config = process.env;
bot.on('ready', () => {
console.log(bot.user.username + ' is online.')
});
//CONSTANT COMMANDS
//Text Commands
bot.on('messageCreate', (msg) => {
if(msg.author.bot || msg.channel.type === "dm")
return;
const messageArray = msg.content.split(' ');
const cmd = messageArray[0];
const args = msg.content.substring(msg.content.indexOf(' ') + 1);
const prefix = config.prefix;
if(cmd.toLowerCase() === prefix + 'discord' ) {
msg.channel.send({
content: 'https://discord.gg/RehTqdDpEm'
})
}
if(cmd.toLowerCase() === prefix + 'realm' ) {
msg.channel.send({
content: 'https://realms.gg/5T7DrRwbS7o'
})
}
if(cmd.toLowerCase() === prefix + 'yada' ) {
msg.channel.send({
content: 'yada'
})
}
//Embed Commands
if(message.content.toLowerCase() === prefix + "help") {
let embed = new MessageEmbed()
.setTitle("Command List")
.setDescription("**?Player Description**- Shows a description of all the players. \n **realm**- Sends a realm invite \n **?factions**- Shows the factions of this season and their members \n **?info {faction}**- Shows the lore and banner of a faction \n **?help**- Shows this help menu \n **?quote**- Sends a random quote from the server \n **?world**- sends the world lore.")
.setColor("RANDOM")
message.channel.send({ embeds: [embed]})
}
if(message.content.toLowerCase() === prefix + "world") {
let embed2 = new MessageEmbed()
.setTitle("World Lore")
.setDescription("lore")
.setColor("RANDOM")
message.channel.send({ embeds: [embed2]})
}
if(message.content.toLowerCase() === prefix + "info giraduan") {
let embed2 = new MessageEmbed()
.setTitle("The Giraduan Dominion")
.setDescription("lore")
.setColor("RANDOM")
message.channel.send({ embeds: [embed2]})
}
if(message.content.toLowerCase() === prefix + "info rpa") {
let embed2 = new MessageEmbed()
.setTitle("Rerualin Preservation Association")
.setDescription("faction lore")
.setColor("RANDOM"
)
message.channel.send({ embeds: [embed2]})
}
if(message.content.toLowerCase() === prefix + "player description") {
let embed2 = new MessageEmbed()
.setTitle("Player Descriptions")
.setDescription("oops no info for you")
.setColor("RANDOM")
message.channel.send({ embeds: [embed2]})
}
if(message.content.toLowerCase() === prefix + "character example") {
let embed2 = new MessageEmbed()
.setTitle("Example Character")
.setDescription("description")
.setColor("RANDOM")
.setThumbnail('https://cdn.discordapp.com/attachments/877727121341026304/904443409614401546/YIN_YANG-removebg-preview.png')
message.channel.send({ embeds: [embed2]})
}
});
//Game Commands
bot.login(config.token);

Discord.Js bot doesn't wait for a response

I made a announce command for my Discord.js v12 bot.
What happens when I run my command:
Here is my code:
// title
message.channel.send("What would be the title ?");
const titlecollector = new Discord.MessageCollector(
message.channel,
(m) => m.author.id === message.author.id,
{ time: 60000 }
);
// description
message.channel.send("What would be the description ?");
const descCollector = new Discord.MessageCollector(
message.channel,
(m) => m.author.id === message.author.id,
{ time: 180000 }
);
// ping
message.channel.send("Would I ping everyone, here or none ?");
const pingCollector = new Discord.MessageCollector(
message.channel,
(m) => m.author.id === message.author.id,
{ time: 60000 }
);
// channel
message.channel.send("Which channel should I send it to ?");
const channelCollector = new Discord.MessageCollector(
message.channel,
(m) => m.author.id === message.author.id,
{ time: 60000 }
);
// color
message.channel.send("What color should I use ?");
const colourCollector = new Discord.MessageCollector(
message.channel,
(m) => m.author.id === message.author.id,
{ time: 180000 }
);
// THE ANNONCEMENT
const announcementEmbed = new Discord.MessageEmbed()
.setTitle(collector)
.setDescription(descriptionCollector)
.setFooter(`Sent by ${message.member.user.tag}`);
const channel = Client.channels.cache.find(
(channel) => channel.name === channelCollector
);
if (pingCollector == "everyone") {
channel.send("#everyone");
} else if (pingCollector == "here") {
channel.send("#here");
}
channel.send(announcementEmbed);
I want it to wait for a response and then store that. What is wrong with my code?
You need to await the messages, instead of using a message collector.
//title
message.channel.send("Enter a title").then(() => {
const filter = m => m.author.id == message.author.id //this ensures that it's waiting messages from the person who sent the message
message.channel.awaitMessages(filter, {time: 60000, max: 1, errors: ['time']) //the time variable is the amount of milliseconds it should wait for, change this accordingly
.then(async messages => {
let title = messages.first().content
//description
message.channel.send("Enter a description!").then(() => {
message.channel.awaitMessages(filter, {time: 60000, max: 1, errors: ['time'])
.then(async messages2 => {
let description = messages2.first().content
}).catch(() => {
message.channel.send("You didn't enter anything!")
})
})
}).catch(() => {
message.channel.send("You didn't enter anything!")
})
})
And so on...

Resources