[commands] Fix clean_content converter not properly escaping mentions.
In some cases, the Discord provided role_mentions and mentions array would be empty, such as wrapping a mention with a backtick or other frivolous characters. Since we want to completely nullify mentions, we should not rely on the Discord provided arrays and instead use and resolve the IDs from the content itself.
This commit is contained in:
parent
be1cffb7c3
commit
cb709cc9da
@ -381,36 +381,41 @@ class clean_content(Converter):
|
|||||||
message = ctx.message
|
message = ctx.message
|
||||||
transformations = {}
|
transformations = {}
|
||||||
|
|
||||||
if self.fix_channel_mentions:
|
if self.fix_channel_mentions and ctx.guild:
|
||||||
transformations.update(
|
def resolve_channel(id, *, _get=ctx.guild.get_channel):
|
||||||
('<#%s>' % channel.id, '#' + channel.name)
|
ch = _get(id)
|
||||||
for channel in message.channel_mentions
|
return ('<#%s>' % id), ('#' + ch.name if ch else '#deleted-channel')
|
||||||
)
|
|
||||||
|
|
||||||
if self.use_nicknames:
|
transformations.update(resolve_channel(channel) for channel in message.raw_channel_mentions)
|
||||||
transformations.update(
|
|
||||||
('<@%s>' % member.id, '@' + member.display_name)
|
|
||||||
for member in message.mentions
|
|
||||||
)
|
|
||||||
|
|
||||||
transformations.update(
|
if self.use_nicknames and ctx.guild:
|
||||||
('<@!%s>' % member.id, '@' + member.display_name)
|
def resolve_member(id, *, _get=ctx.guild.get_member):
|
||||||
for member in message.mentions
|
m = _get(id)
|
||||||
)
|
return '@' + m.display_name if m else '@deleted-user'
|
||||||
else:
|
else:
|
||||||
|
def resolve_member(id, *, _get=ctx.bot.get_user):
|
||||||
|
m = _get(id)
|
||||||
|
return '@' + m.name if m else '@deleted-user'
|
||||||
|
|
||||||
|
|
||||||
transformations.update(
|
transformations.update(
|
||||||
('<@%s>' % member.id, '@' + member.name)
|
('<@%s>' % member_id, resolve_member(member_id))
|
||||||
for member in message.mentions
|
for member_id in message.raw_mentions
|
||||||
)
|
)
|
||||||
|
|
||||||
transformations.update(
|
transformations.update(
|
||||||
('<@!%s>' % member.id, '@' + member.name)
|
('<@!%s>' % member_id, resolve_member(member_id))
|
||||||
for member in message.mentions
|
for member_id in message.raw_mentions
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if ctx.guild:
|
||||||
|
def resolve_role(id, *, _find=discord.utils.find, _roles=ctx.guild.roles):
|
||||||
|
r = _find(lambda x: x.id == id, _roles)
|
||||||
|
return '@' + r.name if r else '@deleted-role'
|
||||||
|
|
||||||
transformations.update(
|
transformations.update(
|
||||||
('<@&%s>' % role.id, '@' + role.name)
|
('<@&%s>' % role_id, resolve_role(role_id))
|
||||||
for role in message.role_mentions
|
for role_id in message.raw_role_mentions
|
||||||
)
|
)
|
||||||
|
|
||||||
def repl(obj):
|
def repl(obj):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user