Discord.py机器人升级提醒无法@成员问题求助
解决Discord.py Embed中无法@成员的问题
问题根源
Discord的Embed消息里,手动拼接的<@成员ID>纯文本不会被识别为有效提及,必须通过Discord.py提供的成员对象生成官方认可的提及格式,才能触发@提醒。
修复方案及代码优化
- 优先获取
discord.Member对象,用member.mention生成有效提及 - 增加异常判断,避免服务器/成员/频道不存在时报错
- 用
with语句管理数据库连接,自动释放资源
修改后的代码:
import math import sqlite3 import discord async def new_level_ping(bot, memberid, guildid, xpbefore, xpadded): oldlevel = math.floor((xpbefore ** 0.5) / 5) newlevel = math.floor(((xpbefore + xpadded) ** 0.5) / 5) if oldlevel != newlevel: # 获取服务器对象 guild = bot.get_guild(guildid) if not guild: return # 获取成员对象,生成有效提及 member = guild.get_member(memberid) member_mention = member.mention if member else f"<@{memberid}>" # 自动管理数据库连接 filename = "./database/database.db" with sqlite3.connect(filename) as connection: cursor = connection.cursor() cursor.execute("SELECT levelingsystemstatus FROM guildsetup WHERE guildid = ?", (guildid,)) levelingsystemstatus = next(cursor, [None])[0] if levelingsystemstatus == True: cursor.execute("SELECT levelingpingmessagechannel FROM guildsetup WHERE guildid = ?", (guildid,)) channelid = next(cursor, [None])[0] if not channelid: return # 尝试获取频道,优先用缓存再拉取API channel = bot.get_channel(channelid) or await bot.fetch_channel(channelid) embed = discord.Embed(title=f'Congratulations {member_mention}', description=f'You reached level {newlevel}', color=discord.Color.green()) await channel.send(embed=embed)
关键说明
member.mention会生成Discord认可的提及格式,在Embed中能正常触发@提醒- 增加了服务器、成员、频道的存在性判断,避免运行时抛出异常
with语句包裹数据库连接,无需手动调用close(),防止资源泄漏
内容的提问来源于stack exchange,提问作者ekcum
相关产品推荐
相关产品推荐

