Python discordia en evento de concesión de rol

Así que he estado tratando de hacer que el bot anuncie cada vez que un miembro obtiene un rol, sé que este código puede no tener ningún sentido en absoluto, pero es por eso que pregunto: ¿cómo podría hacerlo?

@bot.event async def on_member_update(before, after): if str(after.roles) == 'android': fmt = "{0.mention} your role request has been accepted! :confetti_ball: You've been granted the role '{1}'" await bot.send_message(bot.get_channel('495285593711050754'), fmt.format(member, after.roles.name)) print(colored('moderation.clf: ', 'blue'), colored('Android granted', 'white')) if str(after.roles) == 'human': fmt = "{0.mention} your role request has been accepted! :confetti_ball: You've been granted the role '{1}'" await bot.send_message(bot.get_channel('495285593711050754'), fmt.format(member, after.roles.name)) print(colored('moderation.clf: ', 'blue'), colored('Human granted', 'white')) if str(after.roles) == 'moderator': fmt = "{0.mention} you are now part of the CyberLife staff, we're so excited to have you here! :confetti_ball:" await bot.send_message(bot.get_channel('495285593711050754'), fmt.format(member, after.roles.name)) print(colored('moderation.clf: ', 'blue'), colored('Moderator granted', 'white')) 

Primero tienes que comprobar que el usuario tiene un nuevo rol. Luego puedes verificar que el rol que obtuvieron es uno de los que estás buscando:

 @bot.event async def on_member_update(before, after): if len(before.roles) < len(after.roles): new_role = next(role for role in after.roles if role not in before.roles) if new_role.name in ('android', 'human'): fmt = "{0.mention} your role request has been accepted! :confetti_ball: You've been granted the role '{1}'" await bot.send_message(bot.get_channel('495285593711050754'), fmt.format(after, new_role.name)) elif new_role.name in ('moderator'): fmt = "{0.mention} you are now part of the CyberLife staff, we're so excited to have you here! :confetti_ball:" await bot.send_message(bot.get_channel('495285593711050754'), fmt.format(after))