discord.py中为bot.listen事件命名实现日志Embed复用的方法
核心错误说明
你对@bot.listen()的name参数作用理解有误:该参数是用来指定监听的Discord原生事件名,并非用于传递自定义业务标签。你将其设为complexity时,这个监听器根本不会被触发——discord.py仅会在收到对应名称的网关事件时调用监听器,消息事件的固定标识为on_message,随意修改该参数只会导致监听器失效。
正确实现方案
直接给日志函数增加自定义标题的入参即可,不需要修改监听器的原生参数,后续复用时只要给不同监听器传入不同的标题值就能共用一套日志逻辑。
修正后的代码
bot.py
import discord from discord.ext import commands import os from dotenv import load_dotenv from datetime import datetime import loging load_dotenv() TOKEN = os.getenv("DISCORD_TOKEN") bot = commands.Bot(command_prefix=commands.when_mentioned_or("$"), help_command=None) # 不指定name参数时,会自动根据函数名on_message识别监听消息事件 @bot.listen() async def on_message(message): if any(x in message.content.lower() for x in ["complexity", "complex"]): await message.add_reaction(r":complexity:945474998208958517") # 传入当前场景要显示的自定义标题 await loging.meslog(bot, message, event_title="Complexity关键词触发") # 其他场景可以直接复用日志函数,传入不同标题即可 # 示例:消息删除日志 @bot.listen() async def on_message_delete(message): await loging.meslog(bot, message, event_title="消息删除记录") bot.run(TOKEN)
loging.py
import discord from datetime import datetime async def meslog(bot, message, event_title: str): username = message.author usernameid = str(message.author.id) messagein = str(message.content) messageid = str(message.id) channel = channelid = channelping = None if message.guild: channel = message.channel.name channelid = str(message.channel.id) channelping = message.channel.mention logingchan = await bot.fetch_channel(983811124929630239) # 时间必须在函数内实时生成,写在全局会导致所有日志显示模块加载时的固定时间 timenow = datetime.now().strftime(r"%x, %X") em = discord.Embed(title=event_title, description=timenow, color=0x00FF00) # v2+版本discord.py请用avatar.url替代已废弃的avatar_url em.set_thumbnail(url=username.avatar.url) em.add_field(name="Channel:", value=f"{channelping} \n{channelid}", inline=True) em.add_field(name="User:", value=f"{username}\n{usernameid}", inline=True) em.add_field(name="Message:", value=f"{messagein}\n{messageid}", inline=False) await logingchan.send(embed=em)
额外注意点
- 原代码中大量冗余导入(未使用的
http.client、asyncio、重复导入的time、未用到的时间相关类)可以直接删除,不影响功能。 - 不要把时间戳生成逻辑写在全局作用域,否则所有日志都会显示bot启动/模块导入时的固定时间,而非事件实际触发时间。
- 若你使用2.0及以上版本discord.py,原代码的
avatar_url属性已被废弃,需替换为avatar.url避免报错。
内容的提问来源于stack exchange,提问作者ΛSUKΛ
相关产品推荐
相关产品推荐

