Discord.py机器人on_member_join事件添加ctx实现新成员专属频道创建问题
问题核心
on_member_join是事件监听器,不存在ctx(命令上下文)对象,你不需要尝试获取ctx,所有需要的对象都可以通过事件传入的member参数直接获取,原有逻辑里对ctx的调用全部可以替换。
修正后可运行代码
import discord from discord.ext import commands class JoinCog(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_member_join(self, member : discord.Member): guild = member.guild # 预先配置频道权限规则 overwrites = { # 全体默认角色禁止查看和发言 guild.default_role: discord.PermissionOverwrite(read_messages=False, send_messages=False), # 新加入成员开放查看和发言权限 member: discord.PermissionOverwrite(read_messages=True, send_messages=True), # 给机器人自身配置操作权限,避免后续无法管理频道 guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True, manage_channels=True) } # 创建频道时直接传入权限配置,避免创建后权限未生效的空档 new_channel = await guild.create_text_channel(name=member.name, overwrites=overwrites) # 向新频道发送消息,不需要调用ctx.send await new_channel.send(f"欢迎 {member.mention} 加入服务器,这是你的专属频道。")
说明
- 你原有代码中所有ctx相关的调用都不是必须的:
- 服务器默认角色直接用
guild.default_role获取即可,不需要从ctx取值 - 需要授权的用户就是事件传入的
member参数本身 create_text_channel执行后会返回创建好的频道对象,直接用该对象操作即可,不需要从ctx获取频道
- 服务器默认角色直接用
- 提前在
create_text_channel中传入overwrites参数,可以避免频道创建后、权限修改前的空档期被其他用户看到内容。 - 后续要做定时自动删除功能,只需要把返回的
new_channel.id存储到你用的数据库/缓存中,到约定时间获取对应频道执行删除操作即可。
必要前置检查
- 必须在Discord开发者平台的机器人设置页开启Server Members Intent,否则
on_member_join事件不会触发 - 机器人在服务器中需要拥有「管理频道」「管理权限」的权限,否则无法完成频道创建和权限配置操作
内容的提问来源于stack exchange,提问作者Itachi Uchiha
相关产品推荐
相关产品推荐

