I'm developping a little Discord Bot and I'm stuck on something.
To update a channe name, I need the bot context.
But on my background task, there is no context at all, so I can't figure it out how to achieve what I need. So the code above cannot work because of the line 23, where ctx doesn't exist
selectedVcChannel = discord.utils.get(ctx.guild.channels, name=VcChannelName)
I tried to make the ctx variable global, and tried to put the channel in a variable, but after changing the first time the name, the second time doesn't work anymore. That's why I'm trying to get it in all loops with discord.utils.get.
(VcChannelName is set in another function not showed here, don't worry about it).
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)
How can I use the context commands in the background loop easily ?
Thanks
CodePudding user response:
You could try this, to loop through the guilds your bot is a member of with bot.guilds and call discord.utils.get on each guild's channels. Altough using id instead of name would probably be better. You can keep the ids in a database maybe.
You can't get context in a background task because it is something exclusive to the bot commands.
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)
