async def METHOD_NAME(self, member: Member, guild: Guild) -> None:
    role = await get_role(member.guild, 'Linked Magic Online')
    data = None
    # Linked to PDM
    if role is not None and not role in member.roles:
        if data is None:
            data = await fetcher.person_data_async(member.id)
        if data.get('id', None):
            await member.add_role(role)
    key = f'discordbot:achievements:players:{member.id}'
    if is_pd_server(guild) and not redis.get_bool(key) and not data:
        data = await fetcher.person_data_async(member.id)
        redis.store(key, True, ex=14400)
    # Trophies
    if is_pd_server(guild) and data is not None and data.get('achievements', None) is not None:
        expected: List[Role] = []
        remove: List[Role] = []
        async def achievement_name(key: str) -> str:
            name = self.achievement_cache.get(key, None)
            if name is None:
                self.achievement_cache.update(await fetcher.achievement_cache_async())
                name = self.achievement_cache[key]
            return f'🏆 {name["title"]}'
        for name, count in data['achievements'].items():
            if int(count) > 0:
                trophy = await achievement_name(name)
                role = await get_role(guild, trophy, create=True)
                if role is not None:
                    expected.append(role)
        for role in member.roles:
            if role in expected:
                expected.remove(role)
            elif '🏆' in role.name:
                remove.append(role)
        await member.remove_roles(remove)
        await member.add_roles(expected)