nodejs проверяет разрешения для systemchannel перед отправкой сообщения

#node.js #discord.js

Вопрос:

Я отлаживаю логику проверки разрешений. То, что я хочу сделать, — это изящно обрабатывать случаи, когда я делаю это и не имею на это разрешения. Вот мой код:

     console.log(`permissions for me: ${JSON.stringify(guild.systemChannel.permissionsFor(guild.me).has('SEND_MESSAGES'))}`)

    //joined a server
    try{
        //Check for system channel
        if ( undefined == guild.systemChannel) {
            console.error(`${error}: guild.systemChannel does not exist during guildCreate callback`)
        }
        else if( ( guild.systemChannel) amp;amp; ( !guild.systemChannel.permissionsFor(guild.me).has('SEND_MESSAGES') ) ) {
            console.error(`${error}: guild.systemChannel permissions to write are not available, during guildCreate callback`)
        }
        else {
            //Sends message to system channel
            guild.systemChannel.send('Thank you for adding me to your server!')
...
 

В сообщении журнала указывается «true», когда я подключаюсь к серверу. Оказывается, этот сервер имеет пользовательские переопределения привилегий для системного канала и не разрешает разрешение @everyone отправлять сообщения. Однако бот запросил разрешения на отправку сообщений в рамках своей роли, и поэтому в сообщении журнала консоли указано значение true.

guild.systemChannel.send('Thank...) сообщение завершается ошибкой, при этом Discord выдает ошибку с сообщением об ошибке разрешений:

 /home/path/node_modules/discord.js/src/rest/RequestHandler.js:154
      throw new DiscordAPIError(request.path, data, request.method, res.status);
            ^

DiscordAPIError: Missing Access
    at RequestHandler.execute (/home/path/node_modules/discord.js/src/rest/RequestHandler.js:154:13)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
...
 

Поэтому, если я изменю разрешения сервера на системном канале и сделаю его @каждый может отправлять сообщения, код works….it отправляет приветственное сообщение.

поэтому у меня есть проблема с моей логикой проверки ошибок над ней. Я думаю, что роли и разрешения бота находятся в конфликте…как правильно проверить?

Комментарии:

1. Разве вы не можете использовать простое channel.send(…).catch(err => {…}) ?

2. @MrMythical, можете ли вы помочь мне понять, почему блок try/catch вокруг раздела не улавливает этого, но мне пришлось бы завернуть его непосредственно в это обещание?

3. Вы должны добавить await перед ним, чтобы он ждал разрешения или отклонения. Однако с этим гораздо проще .catch

4. ладно, понял, в этом есть смысл. да, и то и другое сработало. Если вы хотите отправить в качестве ответа, я поставлю соответствующую оценку! @MrMythical еще раз спасибо!

5. Я только что опубликовал ответ.

Ответ №1:

Вы должны await выполнить обещание в блоке try/catch. Без этого функция try/catch не обнаружит его, так как для его устранения требуется время. Добавление await заставит его ждать и обнаружит ошибку. Однако простое .catch() гораздо проще.

Ответ №2:

Я публикую ответ от имени комментариев @MrMythical…ожидание или .улов были в порядке. Хотя я думаю, что именно из-за моего опыта работы на C концепция содержащегося блока try-catch, который не улавливает вещи, меня беспокоит. Я думаю, что это связано с синхронизацией/асинхронностью этого потока кода, выполнение может выйти из блока до того, как будет поймано исключение.