如何在discord.py中调整Embed字段位置以匹配角色顺序?
解决方法
1. 明确角色排序依据
Discord 服务器内的角色位置由 role.position 属性决定,数值越小的角色在角色列表中越靠上。我们需要以此为基准,对Embed字段进行排序。
2. 建立字段与角色的关联
确保每个Embed字段都能对应到具体角色:
- 可以在添加字段时,将角色ID嵌入字段名称(比如格式为
[角色ID] 角色名称); - 或者维护一个独立字典,存储
角色对象: 对应Embed字段的映射关系。
3. 同步字段顺序与角色位置
获取排序后的角色列表,再根据关联关系重新排列Embed字段,最后更新Embed:
示例代码
import discord from discord.ext import commands bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) # 维护角色与对应Embed字段的映射 role_field_map = {} @bot.command() async def sync_embed(ctx, msg_id: int): # 获取目标消息与Embed target_msg = await ctx.channel.fetch_message(msg_id) embed = target_msg.embeds[0] # 按角色position升序排序(position越小,角色在列表中越靠上) sorted_roles = sorted(role_field_map.keys(), key=lambda r: r.position) # 生成排序后的字段列表 sorted_fields = [role_field_map[role] for role in sorted_roles] # 更新Embed字段 embed.clear_fields() for field in sorted_fields: embed.add_field(name=field.name, value=field.value, inline=field.inline) await target_msg.edit(embed=embed) # 添加字段时同步维护映射关系 @bot.command() async def add_role_field(ctx, msg_id: int, role: discord.Role, field_name: str, field_value: str): target_msg = await ctx.channel.fetch_message(msg_id) embed = target_msg.embeds[0] # 创建并添加字段 new_field = discord.EmbedField(name=field_name, value=field_value, inline=False) embed.add_field(name=field_name, value=field_value, inline=False) # 更新映射字典 role_field_map[role] = new_field await target_msg.edit(embed=embed) # 监听角色位置变动,自动同步Embed @bot.event async def on_role_update(before, after): if before.position != after.position and after in role_field_map: # 这里可以指定需要同步的消息ID,或者批量处理所有关联消息 target_msg = await bot.get_channel(目标频道ID).fetch_message(目标消息ID) embed = target_msg.embeds[0] sorted_roles = sorted(role_field_map.keys(), key=lambda r: r.position) sorted_fields = [role_field_map[role] for role in sorted_roles] embed.clear_fields() for field in sorted_fields: embed.add_field(name=field.name, value=field.value, inline=field.inline) await target_msg.edit(embed=embed) bot.run('你的Bot令牌')
关键提示
- 如果不需要维护字段历史,也可以每次直接从排序后的角色列表出发,动态生成所有Embed字段,省去映射字典的维护步骤;
on_role_update事件可以自动监听角色位置变化,实现Embed字段顺序的实时同步。
内容的提问来源于stack exchange,提问作者Sykman
相关产品推荐
相关产品推荐

