ok so yeah it seems to work with MemberUpdateEvent, but there are two of them for some reason. The output in the screenshot comes from a user joining a server and selecting a bunch of roles during onboarding. The onboarding process is completed and the user has those roles before the 20 seconds are up.
@component.with_listener(hikari.MemberCreateEvent)
async def check_roles_join(event: hikari.MemberCreateEvent):
print(f"Member {event.member.id} Joined")
sleep(20)
print("Timer is up")
roles = await event.member.fetch_roles()
print(f"Member {event.member.id} fetch roles:", roles)
print(f"Member {event.member.id} get roles:", event.member.get_roles())
print(f"Member {event.member.id} role IDs:", event.member.role_ids)
@component.with_listener(hikari.MemberUpdateEvent)
async def check_roles_update(event: hikari.MemberUpdateEvent):
print(f"Member {event.member.id} updated")
roles = event.member.role_ids
print(f"Member {event.member.id} roles after update:", roles)