def METHOD_NAME(wrapper: MessageDispatcher, message: str):
    """Charm a player or two, slowly leading to your win!"""
    pieces = re.split(" +", message)
    target1 = pieces[0]
    if len(pieces) > 1:
        target2 = pieces[1]
    else:
        target2 = None
    var = wrapper.game_state
    target1 = get_target(wrapper, target1)
    if not target1:
        return
    if target2 is not None:
        target2 = get_target(wrapper, target2)
        if not target2:
            return
    orig1 = target1
    orig2 = target2
    target1 = try_misdirection(var, wrapper.source, target1)
    if target2 is not None:
        target2 = try_misdirection(var, wrapper.source, target2)
    if try_exchange(var, wrapper.source, target1) or try_exchange(var, wrapper.source, target2):
        return
    # Do these checks based on original targets, so piper doesn't know to change due to misdirection/luck totem
    if orig1 is orig2:
        wrapper.send(messages["must_charm_multiple"])
        return
    if orig1 in CHARMED and orig2 in CHARMED:
        wrapper.send(messages["targets_already_charmed"].format(orig1, orig2))
        return
    elif orig1 in CHARMED:
        wrapper.send(messages["target_already_charmed"].format(orig1))
        return
    elif orig2 in CHARMED:
        wrapper.send(messages["target_already_charmed"].format(orig2))
        return
    if wrapper.source in TOBECHARMED:
        TOBECHARMED[wrapper.source].clear()
    else:
        TOBECHARMED[wrapper.source] = UserSet()
    TOBECHARMED[wrapper.source].update({target1, target2} - {None})
    PASSED.discard(wrapper.source)
    if orig2:
        wrapper.send(messages["charm_multiple_success"].format(orig1, orig2))
    else:
        wrapper.send(messages["charm_success"].format(orig1))