Exemple #1
0
def format_event_complete_workflow_payload(payload):
    inputs = extract_inputs_from_workflow_payload(
        get_by_path(payload, "event.workflow_step.inputs")
    )

    command_name, text = extract_command_from_text(
        " ".join(
            inputs.get(
                WORKFLOW_ACTION_ID_TO_VARIABLE_NAME[
                    WorkflowActionId.COMMAND_INPUT.value
                ]
            ).split(" ")[1:]
        )
    )

    workflow_step_execute_id = get_by_path(
        payload, "event.workflow_step.workflow_step_execute_id"
    )

    return {
        "command_name": command_name,
        "workflow_step_execute_id": workflow_step_execute_id,
        "channel_id": inputs.get(
            WORKFLOW_ACTION_ID_TO_VARIABLE_NAME[WorkflowActionId.CHANNEL_INPUT.value]
        ),
        "send_to_slack": inputs.get(
            WORKFLOW_ACTION_ID_TO_VARIABLE_NAME[
                WorkflowActionId.SEND_TO_SLACK_CHECKBOX.value
            ]
        ),
        **parse_command_line(text, CUSTOM_POSITIONAL_ARGS, CUSTOM_NAMED_ARGS),
        **format_event_basic_payload(payload),
    }
Exemple #2
0
def extract_command_id_from_main_modal_select_command_payload(
        payload: dict[str, any]) -> str:
    payload_actions = get_by_path(payload, "actions")

    for action in payload_actions:
        if (get_by_path(action, "action_id") ==
                BlueprintInteractivityAction.MAIN_MODAL_SELECT_COMMAND.value):
            return get_by_path(action, "value")
Exemple #3
0
def format_interactivity_delete_message_payload(
        payload: dict[str, any]) -> dict[str, any]:
    return {
        **format_interactivity_basic_payload(payload),
        "message_text":
        get_by_path(payload, "message.text"),
        "ts":
        get_by_path(payload, "message.ts"),
    }
Exemple #4
0
def send_message_and_gif_to_channel_with_resubmit_button(
    *,
    message: Message,
    channel_id: str,
    team_id: str,
    user_id: str,
    gif_frames: list[any],
    with_wheel: bool,
    with_ephemeral: bool = True,
    **kwargs,
):
    wheel_ts = None
    if with_wheel:
        if with_ephemeral:
            send_message_to_channel(
                message=Message(
                    content="Spin that wheel :ferris_wheel:",
                    visibility=MessageVisibility.HIDDEN,
                ),
                channel_id=channel_id,
                user_id=user_id,
                team_id=team_id,
            )
        with open("wheel.gif", "wb") as file_pointer:
            save_gif(file_pointer, gif_frames)
            message_response = send_file_to_channel(
                channel_id=channel_id,
                file_pointer_name=file_pointer.name,
                team_id=team_id,
            )
            wheel_ts = (get_by_path(message_response.data,
                                    f"file.shares.public.{channel_id}")
                        or get_by_path(
                            message_response.data,
                            f"file.shares.private.{channel_id}"))[0]["ts"]
            time.sleep(5)  # Sleep for 5 seconds

    kwargs["wheel_ts"] = wheel_ts  # Overwrite previous value
    if with_ephemeral:
        send_message_to_channel_with_resubmit_button(
            message=message,
            channel_id=channel_id,
            team_id=team_id,
            with_wheel=with_wheel,
            user_id=user_id,
            **kwargs,
        )
    else:
        send_message_to_channel(message=message,
                                channel_id=channel_id,
                                user_id=user_id,
                                team_id=team_id)
Exemple #5
0
def format_interactivity_save_workflow_payload(
        payload: dict[str, any]) -> dict[str, any]:
    return {
        **extract_inputs_from_view_values_payload(
            get_by_path(payload, "view.state.values"),
            WorkflowActionId,
            WORKFLOW_VALUE_PATH,
            WORKFLOW_ACTION_ID_TO_VARIABLE_NAME,
        ),
        "workflow_step_edit_id":
        get_by_path(payload, "workflow_step.workflow_step_edit_id"),
        **format_interactivity_basic_payload(payload),
    }
Exemple #6
0
def extract_interactivity_actions(payload: dict[str, any]) -> tuple[str, str]:
    payload_actions = payload.get("actions")
    actions = [
        payload_actions[0].get("action_id")
        if payload_actions and len(payload_actions) else None,
        get_by_path(payload_actions[0], "selected_option.value").split(".")[0]
        if payload_actions and len(payload_actions)
        and get_by_path(payload_actions[0], "selected_option.value") else None,
        payload.get("callback_id"),
        payload.get("type"),
    ]

    callback_id = get_by_path(payload, "view.callback_id")
    callback_action = get_callback_action(callback_id) if callback_id else None
    return actions, callback_action
Exemple #7
0
def format_run_custom_command_payload(
        payload: dict[str, any]) -> dict[str, any]:
    extracted_value = extract_inputs_from_view_values_payload(
        get_by_path(payload, "view.state.values"),
        SlackCustomCommandModalActionId,
        SLACK_CUSTOM_COMMAND_MODAL_VALUE_PATH,
        SLACK_CUSTOM_COMMAND_ACTION_ID_TO_VARIABLE_NAME,
    )
    callback_id = get_by_path(payload, "view.callback_id")
    command_id = get_id_from_callback_id(callback_id)
    return {
        **extracted_value,
        **get_basic_data_from_command_id(command_id),
        **format_interactivity_basic_payload(payload),
    }
Exemple #8
0
def format_main_modal_run_instant_command_payload(
        payload: dict[str, any]) -> dict[str, any]:
    return {
        **extract_data_from_metadata(
            get_by_path(payload, "view.private_metadata")),
        **format_interactivity_basic_payload(payload),
    }
Exemple #9
0
def format_interactivity_edit_workflow_payload(
        payload: dict[str, any]) -> dict[str, any]:
    return {
        **extract_inputs_from_workflow_payload(
            get_by_path(payload, "workflow_step.inputs")),
        **format_interactivity_basic_payload(payload),
    }
Exemple #10
0
def process_event_for_response(payload: dict[str, any]) -> str:
    event_types = [get_by_path(payload, "event.type")]

    for action in BlueprintEventAction:
        if action.value in event_types:
            transform_process_respond(action.value, payload)

    return "Event not handled"
Exemple #11
0
def format_run_instant_command_payload(
        payload: dict[str, any]) -> dict[str, any]:
    extracted_value = extract_inputs_from_view_values_payload(
        get_by_path(payload, "view.state.values"),
        SlackInstantCommandModalActionId,
        SLACK_INSTANT_COMMAND_MODAL_VALUE_PATH,
        SLACK_INSTANT_COMMAND_ACTION_ID_TO_VARIABLE_NAME,
    )
    extracted_value["pick_list"] = [
        format_mention_user(user) for user in extracted_value["pick_list"]
    ]

    metadata = extract_data_from_metadata(
        get_by_path(payload, "view.private_metadata"))
    extracted_value["channel_id"] = metadata["channel_id"]
    return {
        **extracted_value,
        **format_interactivity_basic_payload(payload),
    }
def format_updated_fields_mesage(
    *,
    command_name: str,
    team_id: str,
    fields_updated: dict[str, any],
    current_user_id: str,
) -> str:
    current_user_name = get_by_path(
        get_user_info(team_id=team_id, user_id=current_user_id), "profile.display_name"
    )
    message = f"{current_user_name} updated *{command_name}*."

    messages_for_each_field = [
        ("name", (lambda name: f"Command name changed to {name}.")),
        (
            "added_to_pick_list",
            (
                lambda added_to_pick_list: f"New users added: {format_pick_list_users(added_to_pick_list, team_id)}."  # noqa E501
            ),
        ),
        (
            "removed_from_pick_list",
            lambda removed_from_pick_list: f"Users removed: {format_pick_list_users(removed_from_pick_list, team_id)}.",  # noqa E501
        ),
        (
            "label",
            (
                lambda label: f'Command message changed to: {format_custom_command_message(None, ["<selected_item>"], label)}'  # noqa E501
            ),
        ),
        (
            "self_exclude",
            (
                lambda self_exclude: f'User running the command is now {"excluded" if self_exclude else "included"} in the pick.'  # noqa E501
            ),
        ),
        (
            "only_active_users",
            (
                lambda only_active_users: "Only active users are now picked."
                if only_active_users
                else "All users are now picked (whether or not they are active)."
            ),
        ),
        ("strategy", (lambda strategy: f"Strategy changed to {strategy}.")),
    ]

    for (field, message_function) in messages_for_each_field:
        if fields_updated.get(field) is not None:
            message += f"\n• {message_function(fields_updated.get(field))}"

    return message
Exemple #13
0
def format_event_basic_payload(payload: dict[str, any]) -> dict[str, any]:
    authorizations = payload.get("authorizations")
    user_id = (
        authorizations[0].get("user_id")
        if authorizations and len(authorizations)
        else None
    )

    return {
        "user_id": user_id,
        "team_id": get_by_path(payload, "team_id"),
        "response_url": "",  # TODO ?
    }
Exemple #14
0
def extract_inputs_from_workflow_payload(
        input_payload: dict[str, any]) -> dict[str, any]:
    inputs = {}
    for workflow_action in WorkflowActionId:
        value = get_by_path(input_payload, f"{workflow_action.value}.value")

        if workflow_action.value == WorkflowActionId.SEND_TO_SLACK_CHECKBOX.value:
            value = True if value and len(value) else False

        if value is not None:
            inputs[WORKFLOW_ACTION_ID_TO_VARIABLE_NAME[
                workflow_action.value]] = value
    return inputs
def get_name_from_user(user: dict[str, any]) -> str:
    possible_path_names = [
        "profile.display_name",
        "profile.display_name_normalized",
        "profile.real_name",
        "profile.real_name_normalized",
        "real_name",
    ]

    for possible_path_name in possible_path_names:
        name = get_by_path(user, possible_path_name)
        if name:
            return name

    return None
Exemple #16
0
def format_create_command_payload(payload: dict[str, any]) -> dict[str, any]:
    extracted_value = extract_inputs_from_view_values_payload(
        get_by_path(payload, "view.state.values"),
        SlackUpsertCommandModalActionId,
        SLACK_UPSERT_COMMAND_MODAL_VALUE_PATH,
        SLACK_UPSERT_COMMAND_ACTION_ID_TO_VARIABLE_NAME,
    )
    extracted_value["pick_list"] = [
        format_mention_user(user) for user in extracted_value["pick_list"]
    ]

    return {
        **extracted_value,
        **format_interactivity_basic_payload(payload),
    }
Exemple #17
0
def extract_inputs_from_view_values_payload(
    input_payload: dict[str, any],
    actionIdEnum: Enum,
    actionIdToValue: dict[str, any],
    actionIdToVariableName: dict[str, any],
) -> dict[str, any]:
    inputs = {}
    for action in actionIdEnum:
        value = get_by_path(input_payload, actionIdToValue[action.value])

        if action.value.endswith("checkbox"):
            value = True if value and len(value) else False

        if value is not None:
            inputs[actionIdToVariableName[action.value]] = value
    return inputs
def format_new_command_message(
    *,
    command_name: str,
    team_id: str,
    command_description: str,
    pick_list: list[str],
    current_user_id: str,
):
    current_user_name = get_by_path(
        get_user_info(team_id=team_id, user_id=current_user_id), "profile.display_name"
    )
    message = f"{current_user_name} created *{command_name}*."
    if command_description:
        message += f"\n{command_description}"
    message += (
        f"\nUsers in the pick list are: {format_pick_list_users(pick_list, team_id)}."
    )
    return message
Exemple #19
0
def format_interactivity_basic_payload(
        payload: dict[str, any]) -> dict[str, any]:
    response_urls = get_by_path(payload, "response_urls")
    data = {
        "channel_id":
        get_by_path(payload, "channel.id"),
        "user_id":
        get_by_path(payload, "user.id"),
        "team_id":
        get_by_path(payload, "team.id"),
        "trigger_id":
        get_by_path(payload, "trigger_id"),
        "response_url":
        get_by_path(payload, "response_url")
        or get_by_path(response_urls[0], "response_url")
        if response_urls and len(response_urls) else None,
    }
    return clean_none_values(data)
Exemple #20
0
def extract_command_id_from_main_modal_manage_command_payload(
        payload: dict[str, any]) -> str:
    payload_actions = get_by_path(payload, "actions")
    action = payload_actions[0]
    value = get_by_path(action, "selected_option.value")
    return value.split(".")[1]