問題描述
使用 discord.py
,我可以從一段代碼運行多個機器人,但我正在尋找一種將 cog 或擴展加載到多個機器人中的方法.對于一個測試用例,我有 bot.py
,它處理加載 cog 和啟動 bot,以及 cog.py
,它是一個簡單的 cog,它遞增 1 到 a計數器
Using discord.py
, I can run multiple bots from one piece of code, but I'm looking for a way to load a cog or extension into multiple bots. For a test case, I have bot.py
, which handles loading the cog and starting the bot, and cog.py
which is a simple cog that incrementally adds 1 to a counter
bot.py
from discord.ext import commands
import asyncio
client1 = commands.Bot(command_prefix='!')
client2 = commands.Bot(command_prefix='~')
client1.load_extension('cog')
client2.load_extension('cog')
@client1.event
async def on_ready():
print('client1 ready')
@client1.command()
async def ping():
await client1.say('Pong')
@client2.event
async def on_ready():
print('client2 ready')
@client2.command()
async def ping():
await client2.say('Pong')
loop = asyncio.get_event_loop()
loop.create_task(client1.start('TOKEN1'))
loop.create_task(client2.start('TOKEN2'))
loop.run_forever()
cog.py
from discord.ext import commands
class TestCog:
def __init__(self, bot):
self.bot = bot
self.counter = 0
@commands.command()
async def add(self):
self.counter += 1
await self.bot.say('Counter is now %d' % self.counter)
def setup(bot):
bot.add_cog(TestCog(bot))
使用 !ping
將使 client1
響應 Pong,而使用 ~ping
將使 client2
響應Pong,這是預期的行為.
Using !ping
will make client1
respond with Pong, while using ~ping
will make client2
respond with Pong, which is expected behaviour.
但是,只有一個機器人會同時響應 !add
和 ~add
,計數器會隨著任一命令而增加.這似乎取決于哪個機器人最后加載 cog.
However, only one of the bots will respond to both !add
and ~add
, with the counter increasing with either command. This seems dependent on which bot loads the cog last.
有沒有辦法讓正確的機器人響應正確的命令,同時通過任一命令增加計數器?我知道我可以將它分成兩個齒輪并將結果保存到一個文件中,但是是否可以在不將計數器保存到磁盤的情況下做到這一點?
Is there a way to have the correct bot respond to the correct command while also having the counter increase with either command? I know I can split it into two cogs and save the result to a file for example, but is it possible to do it without saving the counter to disk?
推薦答案
這是因為 @commands.command()
只加載了一次.因此,兩個機器人共享相同的 Command
實例.您需要在實例級別添加命令,而不是通過 @commands.command()
裝飾器.
This is due to the fact that @commands.command()
is only loaded once. Therefore, both of the bots shared the same Command
instance. What you need is to add the command on an instance level, and not by the @commands.command()
decorator.
class TestCog:
counter = 0
def __init__(self, bot):
self.bot = bot
self.bot.add_command(commands.Command('add', self.add))
async def add(self):
TestCog.counter += 1
await self.bot.say('Counter is now %d' % TestCog.counter)
或:
class TestCog:
counter = 0
def __init__(self, bot):
self.bot = bot
self.bot.command()(self.add)
async def add(self):
TestCog.counter += 1
await self.bot.say('Counter is now %d' % TestCog.counter)
為了讓兩個機器人共享相同的屬性.你想要的是類屬性,而不是實例的.
In order to make both bots share the same attribute. You want class attribute, not instance's.
這篇關于為多個機器人加載 cog的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!