簡體   English   中英

discord.js 新會員活動

[英]discord.js New Member Event

module.exports = {
name: 'newmember',
once: true,
run: async(client) => {
    guildMemberAdd, member => {
        try {
        const welcome = new Discord.MessageEmbed()
            .setColor('#57F287')
            .setDescription(`Добро пожаловать, ${member.user} на сервер.
            \nВы можете прочитать наши правила в канале <#849407505661952001>`)
        member.guild.channels.cache.get('847196125756915772').send(welcome)
        } catch(e) {
            console.error(e)
        }
    }
}

}

當我試圖測試這個事件時,他什么都不做。 沒有錯誤,沒有消息或響應。 我究竟做錯了什么?

您的代碼有問題,但由於您沒有提供完整的代碼示例,因此很難說出解決方案是什么。

run: async (client) => {
  guildMemberAdd, member => {
    /* ... */
  }
}

這並不像你認為的那樣。 相當於

run: async function (client) {
  guildMemberAdd,
  function (member) {
    /* ... */
  }
}

所以你的run function 不起作用; 它只是評估表達式a, b (其中a是任何guildMemberAdd ,而b是您的內部胖箭頭函數)。 這將解析為b是什么,在本例中是 function,但您也永遠不會調用或返回該 function。 這就是為什么你沒有得到錯誤。

公會成員添加一個guildMemberAdd你應該打電話嗎? 它是您嘗試為其注冊偵聽器的事件的名稱嗎? 你的胖箭頭 function 是你應該打電話的嗎? 您是否正在嘗試將兩個 arguments 傳遞給胖箭頭 function (需要在參數周圍加上括號)? 我不知道 discord 是如何工作的,但您問題的確切答案取決於 API 文檔說您應該做什么。

我假設您的 guildMemberAdd 方法返回成員的 promise 或接受需要成員作為參數的回調方法。 根據您的 guildMemberAdd 方法執行的操作,您的語法有點偏離。

如果它返回一個用戶的 promise

module.exports = {
name: 'newmember',
once: true,
run: async(client) => {
  try {
    const member = await guildMemberAdd()
    const welcome = new Discord.MessageEmbed()
            .setColor('#57F287')
            .setDescription(`Добро пожаловать, ${member.user} на сервер.
            \nВы можете прочитать наши правила в канале <#849407505661952001>`)
        member.guild.channels.cache.get('847196125756915772').send(welcome)
  } catch (error) {
    throw error
  }
}

或者,您可以嘗試在 promise 上調用.then()

guildMemberAdd().then((member) => {
   // rest of your code here
})

如果它接受回調

我認為這是最接近您的代碼語法的,但我也覺得您的方法更有可能返回 promise。我認為這是因為您還沒有訪問任何命名成員的權限。 因此,該成員必須是從您的 guildMemberAdd 方法返回的內容。

module.exports = {
name: 'newmember',
once: true,
run: async(client) => {
  try {
    // you'll need to access the current member somehow
    // const member = fetch member here somehow...
    guildMemberAdd(member, () => {
      // your code here
    })
    // OR
    guildMemberAdd((member) => {
      // your code here
    })
  } catch (error) {
    console.log(error)
  }
} 

我認為無論哪種方式,我們都需要查看代碼中 guildMemberAdd 的示例,以便我們能夠為您提供可靠的答案。 我希望這會有所幫助。 祝你好運!

更新GuildMemberAdd 文檔從 discordjs v14.3 開始,事件名稱是guildMemberAdd ,它將成員作為參數傳遞給您的事件處理程序。 因此,如果您將它從您的事件處理程序傳遞到您的運行方法,您就已經可以訪問它了。 為了澄清,...args 是特定 discordjs 事件返回的任何內容,在您的情況下是 guildMember。 然后我們將它們傳遞給該事件的運行方法。

來自我的機器人的例子

請注意,我使用的是ECMAScript 模塊系統而不是 CommonJs。 因此,您無法將此示例直接復制並粘貼到您的代碼中。 您需要先將其轉換為 commonJs 模塊。

export default {
  name: "guildMemberAdd",
  type: "client",
  once: true,
  async run(member, client) {
    // your code here
  },
};

// The event handler I use
// The switch statement and event.type are optional. 
// I plan on having database events that I listen to as well as client events.
import { clientEvents } from "../../events/client/index.mjs";

export async function handleEvents(client) {
  clientEvents.forEach(async (event) => {
    switch (event.type) {
      case "client":
        if (event.once) {
          client.once(event.name, async (...args) => {
            await event.run(...args, client);
          });
        } else {
          client.on(event.name, async (...args) => {
            await event.run(...args, client);
          });
        }
      default:
        break;
    }
  });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM