#javascript #discord.js
#язык JavaScript #discord.js
Вопрос:
Как это работает:
Я пытаюсь сделать так, чтобы, если кто-то реагирует на сообщение, отправленное сотрудником, он открывал билет.
Проблема:
Я хотел использовать идентификатор участника, но он слишком большой. Я попытался использовать имя плеера, он почему-то не находит его в качестве канала, может быть, лучше использовать уникальный номер?
Я использую систему обработки команд, поэтому вы не увидите ничего из основных вещей (например client.login
).
Вот мой код:
const { Discord } = require('discord.js'); const axios = require("axios") module.exports = { name: 'thing', category: 'Owner', aliases: ["t"], description: 'thing command.', usage: 'thing', userperms: [], botperms: [], run: async (client, message, args) =gt; { message.channel.send('Click "⚔" to open a ticket!').then(function(message) { message.react('⚔'); const filter = (reaction, user) =gt; { return ['⚔'].includes(reaction.emoji.name) amp;amp; user.id === message.author.id; }}); client.on('messageReactionAdd', (reaction, ruser) =gt; { if (!ruser.bot) { if (reaction.emoji.name == '⚔') { if(message.guild.channels.cache.find(channel =gt; channel.name == (`t-${ruser.id}`))) { return message.channel.send('lt;@' ruser.id 'gt; you already have a ticket, please close your existing ticket first before opening a new one!') .then(m =gt; m.delete({timeout: 3000})); } message.guild.channels.create(`t-${ruser.id}`, { permissionOverwrites: [ { id: message.author.id, allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, { id: message.guild.roles.everyone, deny: ['VIEW_CHANNEL'], }, ], type: 'text', }).then(async channel =gt; { message.channel.send(`lt;@` ruser.id `gt;, you have successfully created a ticket! Please click on ${channel} to view your ticket.`) .then(m =gt; m.delete({timeout: 3000})); channel.send(`Hi lt;@` ruser.id `gt;, welcome to your ticket! Please be patient, we will be with you shortly.`); const logchannel = message.guild.channels.cache.find(channel =gt; channel.name === 'server-logs'); if(logchannel) { logchannel.send(`Ticket-${ruser.username} created. Click the following to veiw lt;#${channel.id}gt;`); } }); } }}); }}
Ответ №1:
Есть несколько способов сделать это. Я бы создал lt;Mapgt;
объект, ключи которого должны представлять идентификатор пользователя и значения идентификатора билета, принадлежащего этому пользователю. Я бы также объявил переменную ticketID
, которая будет увеличиваться на 1 каждый раз при создании нового билета. При каждой реакции бот должен проверять, является ли идентификатор пользователя существующим ключом карты, и если нет, в нем должна быть создана новая запись:
(...) let ticketCounter = 0; const userTickets = new Map(); client.on('messageReactionAdd', (reaction, ruser) =gt; { if(!ruser.bot) { if(reaction.emoji.name == '⚔') { if(userTickets.has(ruser.id)) { return message.channel.send('lt;@' ruser.id 'gt; you already have a ticket, please close your existing ticket first before opening a new one!').then(m =gt; m.delete({timeout: 3000})); } message.guild.channels.create(`t-${ticketCounter}`, { permissionOverwrites: [ { id: message.author.id, allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, { id: message.guild.roles.everyone, deny: ['VIEW_CHANNEL'], }, ], type: 'text', }).then(async channel =gt; { userTickets.set(ruser.id, ticketCounter ); // This will create the map entry whose value is the previous ticketCounter value, the increments afterwards. message.channel.send(`lt;@` ruser.id `gt;, you have successfully created a ticket! Please click on ${channel} to view your ticket.`).then(m =gt; m.delete({timeout: 3000})); channel.send(`Hi lt;@` ruser.id `gt;, welcome to your ticket! Please be patient, we will be with you shortly.`); const logchannel = message.guild.channels.cache.find(channel =gt; channel.name === 'server-logs'); if(logchannel) { logchannel.send(`Ticket-${ruser.username} created. Click the following to veiw lt;#${channel.id}gt;`); } }); } } });
Комментарии:
1. Спасибо, это так помогает!