Discord.py机器人循环函数仅对首个服务器生效 如何适配所有接入服务器?
discord.py定时播放功能多服务器适配方案
问题根源
你的代码在遍历服务器的for guild in guilds循环末尾存在多余的break语句,执行完第一个服务器的逻辑后会直接终止全部服务器的遍历,因此只有首个被邀请的服务器能触发功能。
修复后代码
import datetime from random import randrange import asyncio @tasks.loop(seconds = 5) async def loop(): # 提前判断时间,避免重复校验 if datetime.datetime.now().strftime("%H:%M") != "22:22": return guilds = client.guilds for guild in guilds: # 跳过机器人已经在当前服务器连接语音的情况,避免报错 if guild.voice_client is not None: continue voice_channel_list = guild.voice_channels for channel in voice_channel_list: # 直接读取频道成员长度,无需额外建列表 if len(channel.members) > 0: await channel.connect() voice = guild.voice_client if randrange(1,100) <= 30: voice.play(discord.FFmpegPCMAudio(source="sounds/music1.mp3")) else: voice.play(discord.FFmpegPCMAudio(source="sounds/music2.mp3")) while voice.is_playing(): await asyncio.sleep(1) await voice.disconnect() # 跳出当前服务器的频道遍历,处理下一个服务器 break
额外优化建议
- 提前校验时间,避免每次遍历服务器、频道都重复判断当前时间,降低无效运算
- 直接通过
guild.voice_client获取当前服务器的语音客户端实例,无需调用discord.utils.get遍历全局列表 - 新增机器人已连接校验,避免重复连接同一服务器的语音频道引发报错
- 简化成员校验逻辑,直接使用
len(channel.members)判断频道内是否有用户,无需额外构建成员列表
内容的提问来源于stack exchange,提问作者Gerwant
相关产品推荐
相关产品推荐

