我使用過許多 discord API 包裝器,但不幸的是,作為一名經驗豐富的 python 開發人員,我仍然不明白命令是如何被呼叫的!
@client.command()
async demo(ctx):
channel = ctx.channel
await channel.send(f'Demonstration')
在上面創建了一個命令(函式)并將其放置在裝飾器之后@client.command()
據我了解,裝飾器在某種程度上是在運行函式(演示)之前執行的“檢查”,但我不明白 discord.py 庫貌似“呼叫”了演示函式……??在本地匯入的 discord.py 庫中是否有某種形式的短/長輪詢系統輪詢 discord API 并接收作業/訊息串列并根據用戶創建的功能檢查這些?
我很想知道這是如何作業的,因為我不明白是什么“呼叫”了用戶所做的功能,這將允許我為另一個類似的社交媒體平臺制作自己的包裝器!提前謝謝了。
我正在嘗試弄清楚用戶創建的函式如何被 discord.py 庫看似“呼叫”。我以前使用過 discord.py 包裝器和其他 API 包裝器。
uj5u.com熱心網友回復:
(請參閱答案底部附帶的源代碼)
裝飾器將命令添加到 Bot 實體中存盤的@bot.command()命令的內部串列/映射。
每當收到一條訊息時,都會通過Bot.process_commands. 然后它可以查看存盤的每個命令以檢查訊息是否以其中之一開頭(預先檢查前綴)。如果找到匹配項,則可以呼叫它(底層回呼存盤在Command實體中)。
如果您曾經覆寫一個on_message事件并且您的命令停止作業,那么這就是原因:不再呼叫該方法,因此它不再嘗試查看您的命令以找到匹配項。
這使用 adictionary使其效率更高——不必遍歷每個可用的命令和別名,它只需要檢查訊息的第一個字母是否完全匹配。
commands.Command()Cogs 中使用的裝飾器作業方式略有不同。這會將您的函式變成一個Command實體,并且在添加 cog(使用Bot.add_cog())時,庫會檢查每個屬性以查看它們是否是Command實體。
對源代碼的參考
GroupMixin.command()(使用時呼叫@client.command()):https ://github.com/Rapptz/discord.py/blob/24bdb44d54686448a336ea6d72b1bf8600ef7220/discord/ext/commands/core.py#L1493
如您所見,它在add_command()內部呼叫以將其添加到命令串列中。
添加命令(GroupMixin.add_command()):https ://github.com/Rapptz/discord.py/blob/24bdb44d54686448a336ea6d72b1bf8600ef7220/discord/ext/commands/core.py#L1315
Bot.process_commands():https ://github.com/Rapptz/discord.py/blob/master/discord/ext/commands/bot.py#L1360
您必須遵循鏈條 - 大多數處理實際上發生在get_context嘗試Context從訊息創建實體的程序中:https ://github.com/Rapptz/discord.py/blob/24bdb44d54686448a336ea6d72b1bf8600ef7220/discord/ext/commands /bot.py#L1231
commands.Command():https ://github.com/Rapptz/discord.py/blob/master/discord/ext/commands/core.py#L1745
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/534463.html
