Nextcord Cog内事件无响应求助:主文件正常但事件未触发
问题描述
我的Nextcord机器人在Cog中无法响应任何事件,在Cog外(如main.py)一切正常,但Cog内的事件既未注册也未被处理。机器人已拥有管理员权限。
Cog加载脚本
@client.event async def on_ready(): for filename in os.listdir('cogs'): if filename.endswith('.py'): try: client.load_extension(f'cogs.{filename[:-3]}') except Exception as exception: traceback.print_exc() log.log(exception) channel = client.get_channel(config.ERROR_LOG_CHANNEL_ID) embed = nextcord.Embed(title=f"Failed to load {filename[:-3]}.", description=f"{exception}") await channel.send(embed=embed)
Cog代码片段
import traceback import asyncio import nextcord from nextcord.ext import commands from static import config from schildi import utils import datetime import os from schildi import log def user_action_embed(action: str, user: nextcord.Member, color: int, extra: str | None): embed = nextcord.Embed(title="Audit Log Eintrag erstellt", description=action, timestamp=datetime.datetime.now(), color=color) embed.add_field(name="User", value=f"{user.mention} - {user.name}\n||{user.id}||", inline=False) if extra: embed.add_field(name="Zusatz", value=extra, inline=False) return embed class log_listener(commands.Cog): def __init__(self, client): self.client = client @commands.Cog.listener() async def on_guild_audit_log_entry_create(self, entry: nextcord.AuditLogEntry): print(entry.action) log_channel = self.client.get_channel(config.AUDIT_LOG_CHANNEL) if entry.action == nextcord.AuditLogAction.thread_create: await log_channel.send(embed=user_action_embed( action="Thread create", user=entry.user, extra=f"{entry.extra.channel.mention}", color=0x3efa5e)) if entry.action == nextcord.AuditLogAction.thread_delete: await log_channel.send(embed=user_action_embed( action="Thread delete", user=entry.user, extra=f"{entry.extra.channel.mention}", color=0x3efa5e)) if entry.action == nextcord.AuditLogAction.thread_update: await log_channel.send(embed=user_action_embed( action="Thread create", user=entry.user, extra=f"{entry.extra.channel.mention}", color=0x3efa5e)) def setup(client): client.add_cog(log_listener(client))
问题排查与解决
1. 补全必要的网关意图
on_guild_audit_log_entry_create事件需要机器人开启两个特权网关意图:
- 前往Discord开发者门户的机器人页面,找到Privileged Gateway Intents,开启
Server Members Intent和Audit Log Intent - 初始化机器人时显式声明意图:
intents = nextcord.Intents.default() intents.members = True intents.audit_logs = True client = commands.Bot(command_prefix="你的前缀", intents=intents)
2. 确认Cog已正确加载
在on_ready事件中添加加载日志,验证Cog是否成功加载:
@client.event async def on_ready(): print(f"已加载的Cogs: {list(client.cogs.keys())}") # 原加载Cogs的代码...
如果输出中没有log_listener,检查cogs文件夹路径是否正确、文件名是否符合Python模块命名规范,以及加载时是否有隐藏报错。
3. 验证事件触发条件
on_guild_audit_log_entry_create只会响应机器人启动后新产生的审核日志条目,测试时需要在机器人上线后,手动执行创建/删除/更新线程的操作,而非之前的历史操作。
4. 修正代码笔误
Cog中thread_update分支的action描述写错为"Thread create",虽然不影响事件触发,但建议修正为"Thread update"以保证日志准确性。
内容的提问来源于stack exchange,提问作者Deutscher 775
相关产品推荐
相关产品推荐

