Здравствуйте! Создаю слеш-команду user, нужно узнать статус пользователя, который был указан. Т.е. 'Онлайн', 'Неактивен', 'Не беспокоить' и 'Не в сети'
Листал Base.User в документации, ничего подходящего не нашел. Работаю с Discord.js v14
Убедитесь, что у вас есть интент GuildPresences. <GuildMember>.presence?.status <GuildMember>.presence может быть null, когда участник офлайн или скрыл свой статус.
разобрался как добавить интент, теперь столкнулся с ошибкой:
TypeError: Cannot read properties of null (reading 'status')
at Object.execute (/home/nikita/botfordownloadapk/commands/user.js:34:121)
at Client.<anonymous> (/home/nikita/botfordownloadapk/index.js:37:23)
at Client.emit (node:events:513:28)
at InteractionCreateAction.handle (/home/nikita/botfordownloadapk/node_modules/discord.js/src/client/actions/InteractionCreate.js:81:12)
at module.exports [as INTERACTION_CREATE] (/home/nikita/botfordownloadapk/node_modules/discord.js/src/client/websocket/handlers/INTERACTION_CREATE.js:4:36)
at WebSocketManager.handlePacket (/home/nikita/botfordownloadapk/node_modules/discord.js/src/client/websocket/WebSocketManager.js:352:31)
at WebSocketShard.onPacket (/home/nikita/botfordownloadapk/node_modules/discord.js/src/client/websocket/WebSocketShard.js:481:22)
at WebSocketShard.onMessage (/home/nikita/botfordownloadapk/node_modules/discord.js/src/client/websocket/WebSocketShard.js:321:10)
at WebSocket.onMessage (/home/nikita/botfordownloadapk/node_modules/ws/lib/event-target.js:199:18)
at WebSocket.emit (node:events:513:28)
Пишу: interaction.member.presence.status Итог: эта ошибка.
interaction.member.presence.status Итог: эта ошибка.
как и написал Synbulat Biishev в ответе, свойство .presence может быть null при определенных обстоятельствах.
если так и есть, то при попытке получить .status у null (null.status), вы вводите компилятор в ступор и он выбрасывает ошибку.
поэтому, нужно проверять .presence на валидность.
это можно сделать используя оператор опциональной цепочки .?:
console.log(interaction.member.presence.status) // если interaction.member.presence === null, будет ошибка
console.log(interaction.member.presence?.status) // если interaction.member.presence === null, будет undefined
также можно изменить вашу структуру вывода данных, чтобы был вариант для неизвестного статуса, используя оператор нулевого слияния ??:
Александр, выбрасывает все равно эту ошибку, если ввести юзера, которого нет на сервере через ID. Должно написать "Неизвестно", но в итоге выкидывает TypeError
Я сделал вот так: member?.presence.status. Вроде работает. Ведь если нету участника на сервере, то соответственно не будет доступен member. Изначально, если писать ID, то компилятор примерно такое получал: null.presence.status
Никита Савченко, это вы с одной проблемой справились.
если будет определен member, а .presence будет null, вы так же получите TypeError.
поэтому, если уж на то пошло, нужно использовать member?.presence?.status.
но, для чего делать это непосредственно в конце кода, если можно сделать более совершенную проверку в самом начале?
async execute(interaction) {
let user = interaction.options.getUser('mention');
let member = interaction.options.getMember('mention');
let userValid = await interaction.guild.members.fetch("id").catch(err => false);
if (!userValid) return interaction.reply("Пользователь не найден.")
}
Александр, нет. Мне не надо, чтобы писало пользователь не найден и все. Мне нужно чтобы давались ВСЕ СВЕДЕНИЯ о юзере, только статус писало неизвестно, если нету на сервере.
Александр, но как я вижу в предоставленном коде, там проверяется, есть ли такой участник. Как сделать это, чтобы был выполнен глобальный поиск по дискорду?
И опять, новая проблема. Если ввести ID юзера, которого нет на сервере на компьютере: все ок. Если ввести на смартфоне: выкидывает ошибку в дискорде This interaction failed, в консоли ничего не пишет.
Никита Савченко, глобальный поиск по пользователям дискорда осуществляется с помощью client.users.fetch("id_пользователя")
только вы получаете не GuildMember, а User, это нужно учитывать.
еще можно .catch() повесить на .fetch(), чтобы добавить какое-либо действие для случая, если пользователь не найден.
будет возвращено DiscordAPIError[10013]: Unknown User, с кодом 10013