我正在尝试使我的机器人一次只能连接一个实例,而另一个实例仅在另一个未连接时连接。我怎么能做到这一点?我正在使用 Discord.py。另外,如果可能的话,我希望它可以在多台机器上工作。
答案 0 :(得分:1)
执行此操作的简单方法是在第一个机器人中的 bot.run()
之后运行第二个机器人。
为什么?因为除非机器人停止,否则它会阻止任何其他代码。
所以我建议这样做:
bot.run("Your first bot token here")
import secondbot # you may use another method to run the bot script
另一种方法是为第二个机器人制作第三个脚本,该脚本将定期运行以检查第一个机器人状态(在本例中为离线状态),如果第一个机器人状态为离线,它将转向在第二个机器人上。我不建议在您的情况下使用此方法,因为您可能希望将第一个机器人存在更改为离线状态,这将使第三个脚本认为机器人离线。
编辑:写完这个答案后,我发现了一种名为“is_closed”的 Bot 方法,无论机器人是否连接到 websocket,都返回 bool,链接是 here
答案 1 :(得分:1)
如果你问的是我认为你在问什么,也就是说,在任何时候,机器人应该只被允许在机器上运行一个版本,那么这应该适用于你只需要的所有情况想要同时运行一个脚本。
我们可以做到这一点的一种方法是让脚本创建一个“锁定”文件,如果该文件已经存在则退出。只要记住在我们完成后删除它,即使机器人崩溃了。 (这里可能有更好的方法来处理错误,你的机器人代码本身应该尽最大努力处理机器人可能产生的错误。在大多数情况下,即使出现错误,discord.py 也会继续运行。这只会得到严重的机器人崩溃的东西,并确保你可以看到发生了什么,同时仍然优雅地关闭并确保锁定文件被删除。)
import discord
from discord.ext import commands
import os # for file interactions
import traceback
# etc.
bot = commands.Bot(description="Hard Lander's lovely bot", command_prefix="!")
@bot.event
async def on_ready():
print("I'm ready to go!")
print(f"Invite link: https://discordapp.com/oauth2/authorize?client_id={bot.user.id}&scope=bot&permissions=8")
def main():
bot.run("TOKEN")
if __name__ == '__main__':
running_file = "running.txt"
if os.path.isfile(running_file): # check if the "lock" file exists
print("Bot already running!")
exit() # close this instance having taken no action.
else:
with open(running_file, 'w') as f:
f.write("running")
try: # catch anything that crashes the bot
main()
except: # print out the error properly
print(traceback.format_exc())
finally: # delete the lock file regardless of it it crashed or closed naturally.
os.unlink(running_File)