Bot Discord Python - 在后台循环中更新频道名称
Bot Discord Python - Update channel name in a background loop
我正在开发一个小小的 Discord Bot,但遇到了一些问题。
要更新频道名称,我需要 bot 上下文。
但是在我的后台任务中,根本没有上下文,所以我不知道如何实现我需要的东西。
所以上面的代码不能工作,因为第 23 行,其中 ctx 不存在
selectedVcChannel = discord.utils.get(ctx.guild.channels, name=VcChannelName)
我尝试将 ctx 变量设为全局变量,并尝试将通道放入变量中,但第一次更改名称后,第二次不再起作用。这就是为什么我试图用 discord.utils.get
.
在所有循环中获取它
(VcChannelName 是在另一个函数中设置的,这里没有显示,不用担心)。
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
selectedVcChannel = None
VcChannelName = None
bot = commands.Bot(command_prefix="!")
# Background task
async def background_task():
await bot.wait_until_ready()
while not bot.is_closed():
await call_api()
await asyncio.sleep(10)
# Call of the web page and update channel name
async def call_api():
global selectedVcChannel
global VcChannelName
if VcChannelName:
selectedVcChannel = discord.utils.get(ctx.guild.channels, name=VcChannelName)
response = requests.get('https://MyAPI')
respDecoded = response.content.decode("utf-8")
VcChannelName = TranslationChannelName + respDecoded
await selectedVcChannel.edit(name=VcChannelName)
# Start bot
bot.loop.create_task(background_task())
bot.run(TOKEN)
如何在后台循环中轻松使用上下文命令?
谢谢
您可以试试这个,通过 bot.guilds
循环访问您的机器人所属的公会,并在每个公会的频道上调用 discord.utils.get
。尽管使用 id
而不是 name
可能会更好。您也许可以将 ID 保存在数据库中。
您无法在后台任务中获得 context,因为它是机器人命令独有的内容。
if VcChannelName:
for guild in bot.guilds:
# if you want to find the channel by id
# selectedVcChannel = discord.utils.get(guild.channels, id=voice_channel_id)
selectedVcChannel = discord.utils.get(guild.channels, name=VcChannelName)
# If you want the first channel found with the name of 'VcChannelName'
# you can add this condition with a break statement,
# you obviously don't need this if you use id
if selectedVcChannel:
break
if selectedVcChannel:
response = requests.get('https://MyAPI')
respDecoded = response.content.decode("utf-8")
VcChannelName = TranslationChannelName + respDecoded
await selectedVcChannel.edit(name=VcChannelName)
我正在开发一个小小的 Discord Bot,但遇到了一些问题。
要更新频道名称,我需要 bot 上下文。
但是在我的后台任务中,根本没有上下文,所以我不知道如何实现我需要的东西。 所以上面的代码不能工作,因为第 23 行,其中 ctx 不存在
selectedVcChannel = discord.utils.get(ctx.guild.channels, name=VcChannelName)
我尝试将 ctx 变量设为全局变量,并尝试将通道放入变量中,但第一次更改名称后,第二次不再起作用。这就是为什么我试图用 discord.utils.get
.
(VcChannelName 是在另一个函数中设置的,这里没有显示,不用担心)。
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
selectedVcChannel = None
VcChannelName = None
bot = commands.Bot(command_prefix="!")
# Background task
async def background_task():
await bot.wait_until_ready()
while not bot.is_closed():
await call_api()
await asyncio.sleep(10)
# Call of the web page and update channel name
async def call_api():
global selectedVcChannel
global VcChannelName
if VcChannelName:
selectedVcChannel = discord.utils.get(ctx.guild.channels, name=VcChannelName)
response = requests.get('https://MyAPI')
respDecoded = response.content.decode("utf-8")
VcChannelName = TranslationChannelName + respDecoded
await selectedVcChannel.edit(name=VcChannelName)
# Start bot
bot.loop.create_task(background_task())
bot.run(TOKEN)
如何在后台循环中轻松使用上下文命令?
谢谢
您可以试试这个,通过 bot.guilds
循环访问您的机器人所属的公会,并在每个公会的频道上调用 discord.utils.get
。尽管使用 id
而不是 name
可能会更好。您也许可以将 ID 保存在数据库中。
您无法在后台任务中获得 context,因为它是机器人命令独有的内容。
if VcChannelName:
for guild in bot.guilds:
# if you want to find the channel by id
# selectedVcChannel = discord.utils.get(guild.channels, id=voice_channel_id)
selectedVcChannel = discord.utils.get(guild.channels, name=VcChannelName)
# If you want the first channel found with the name of 'VcChannelName'
# you can add this condition with a break statement,
# you obviously don't need this if you use id
if selectedVcChannel:
break
if selectedVcChannel:
response = requests.get('https://MyAPI')
respDecoded = response.content.decode("utf-8")
VcChannelName = TranslationChannelName + respDecoded
await selectedVcChannel.edit(name=VcChannelName)